Also das Problem ist allerdings, dass das BitMap immer anders aussehen kann und man auch noch die Farben verstellen kann...
Ich zeige euch einfach mal die gesamte Klasse:
Delphi-Quellcode:
type
TStaticObjectMouseEvent = procedure(X:integer;Y:integer; //MousePosition on the Object
ScreenX:integer;ScreenY:integer); //MousePosition on the Screen
TStaticObject = class(TObject)
private
{ Grafik }
Graphic : TBitMap; //Eine einfache BitMap
{ Events }
FOnClick : TStaticObjectMouseEvent; //When the User klicks on the Object
FOnMouseOver : TStaticObjectMouseEvent; //When the mouse goes over the Object
FOnMouseOut : TStaticObjectMouseEvent; //When the mouse goes out the Object
public
{ Position & Größe , Read + Write }
PosX : integer;
PosY : integer;
Width : integer;
Height: integer;
ZIndex: integer;
{ Farben }
Colors : TRGBColorList;
{ Boolische Ausdrücke, Read + Write }
AutoSize: boolean;
//Ändert die Breite und Höhe automatisch auf orginal, ansonsten wir aus Width & Height zugeschnitten
Visible : boolean;
//Ist das Objekt sichbar oder nicht, wird von T2DScreen geprüft
//Appear gibt ein leerBmp zurück
{ Sonstige Eigenschaften }
TranzparentColor: TColor;
Tranzparent : boolean;
{ Eigenschaften der Events }
property OnClick : TStaticObjectMouseEvent read FOnClick write FOnClick;
property OnMouseOver : TStaticObjectMouseEvent read FOnMouseOver write FOnMouseOver;
property OnMouseOut : TStaticObjectMouseEvent read FOnMouseOut write FOnMouseOut;
{ TODO 3 : Die Funktionen für den Aufruf der Methode müssen noch geschrieben werden }
{ Bild }
property Image : TBitMap read Graphic;
{ Constructor }
constructor Create(FilePath: PAnsiChar;Visibility : boolean = false);
destructor Destroy;
{ Proceduren }
function ChangeGraphic(FilePath : PAnsiChar) : boolean;
function Appear( const Dest: TBitmap ): TBitMap;
end;
implementation
constructor TStaticObject.Create(FilePath: PAnsiChar; Visibility : boolean = false);
begin
//Prüfen wir ob di Datei existiert
if fileexists(FilePath) then begin
try //Fehlern vorbeugen
//Grafik laden
ChangeGraphic(FilePath);
//Boolische Tüpen setzen
AutoSize := true;
Visible := Visibility;
//Colors
Colors.Red := 255;
Colors.Green := 255;
Colors.Blue := 255;
Colors.Alpha := 255;
except
//Selbst löschen
self.Free;
end;
end;
end;
function TStaticObject.ChangeGraphic(FilePath: PAnsiChar) : boolean;
begin
if fileexists(FilePath) then begin
try //Fehlern vorbeugen
//Prüfen ob Graphic eine Instanz ist
if Assigned(Graphic) then
Graphic.FreeImage;
//Graphic TBitMap erstellen
Graphic := TBitMap.Create;
//BitMap laden
Graphic.LoadFromFile(FilePath);
//Rückgabe
Result := true;
except
Result := false;
end;
end;
end;
destructor TStaticObject.Destroy;
begin
try
//Graphic freigeben
Graphic.FreeImage;
finally
self.Free; //Selber freigeben
end;
end;
function TStaticObject.Appear( const Dest: TBitmap ) : TBitMap;
begin
try
//Autosize
if Autosize and Visible then begin
Width := Graphic.Width;
Height := Graphic.Height;
end else if not Visible then begin
Width := 0;
Height := 0;
end;
//Imagegröße
Dest.Width := Width;
Dest.Height := Height;
{ DONE 1 : Die Eigenschaft Visible muss noch berücksichtigt werden }
if Visible then begin
//Kopiern und ggf. skalieren
Dest.Canvas.StretchDraw(bounds(0,0,Width,Height),Graphic);
//Bildtranzparents
Dest.Transparent := Tranzparent;
Dest.TransparentColor := TranzparentColor;
Dest.TransparentMode := tmFixed;
//Prüfen ob die Farberwerte geändert wurden
if ( Colors.Red <> 255 ) or ( Colors.Green <> 255 ) or ( Colors.Blue <> 255 ) then
FilterColors(Colors,Dest);
end;
finally
//Nichts
end;
end;
Das Problem an deinem Vorschlag ist, dass das Bild extrem dynamisch ist und sich in jedem Frame verändern kann. Ob größe oder Farbe und Tranzparentz... Sonst wäre das ja ganz einfach.
Und unter einem statischen Objekt verstehe ich ein Objekt das nicht animiert ist, also was aus keinem FarmeSet besteht.
Man kann zwar in jedem Frame das Bild wechseln, jedoh ist dafür das
TAnimatedObject besser geeignet... 8)
Das Problem beim selber zeichnen ist, dass der Bildschrim auch events wie OnClick und OnMouseOver/Out bearbeiten muss...