Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#16

Re: Bitmap zurück geben und freigeben

  Alt 4. Jan 2008, 09:55
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...
Lars
  Mit Zitat antworten Zitat