Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] Phantom Sprite (https://www.delphipraxis.net/75629-%5Bdelphix%5D-phantom-sprite.html)

Neutral General 22. Aug 2006 16:53


[DelphiX] Phantom Sprite
 
Hi,

Also mir ist grad was seltsames passiert.
Ich wollte mir eine DXButton Klasse machen.

Hier ist sie:

Delphi-Quellcode:
  TSpriteButton = class
   private
    FSprite: TImageSprite;
    FTop: Single;
    FLeft: Single;
    FCaption: String;
    FFont: TFont;
    FPicture: TPictureCollectionItem;
    FHeight: Word;
    FWidth: Word;
    procedure SetCaption(const Value: String);
    procedure SetFont(const Value: TFont);
    procedure SetHeight(const Value: Word);
    procedure SetLeft(const Value: Single);
    procedure SetPicture(const Value: TPictureCollectionItem);
    procedure SetTop(const Value: Single);
    procedure SetWidth(const Value: Word);
   public
    constructor Create(Engine: TSprite; APicture: TPictureCollectionItem);
    property Left: Single read FLeft write SetLeft;
    property Top: Single read FTop write SetTop;
    property Width: Word read FWidth write SetWidth;
    property Height: Word read FHeight write SetHeight;
    property Image: TPictureCollectionItem read FPicture write SetPicture;
    property Font: TFont read FFont write SetFont;
    property Caption: String read FCaption write SetCaption;
  end;
So.. Das eine Problem ist halt das ich in SetCaption die Caption auf das Bild des Sprites malen will. Aber nicht nur das das nicht funktioniert, das Sprite bewegt sich auch noch o.O
Aber das ist nicht alles. Die Koordinaten des Sprites bleiben unverändert :pale:
Wie kann das sein? Das Sprite malt nicht sondern verschiebt sich wobei nichtmal die Koordinaten geändert werden o.Ô.

Hier mal die SetCaption Procedure:

Delphi-Quellcode:
procedure TSpriteButton.SetCaption(const Value: String);
begin
  FCaption := Value;
  with FSprite.Image.Picture.Bitmap.Canvas do
  begin
   TextOut((Width div 2) + (FSprite.Image.Picture.Bitmap.Canvas.TextWidth(Value) div 2),
           (Height div 2) + (FSprite.Image.Picture.Bitmap.Canvas.TextHeight(Value) div 2),
            Value);
  end;
end;
Aufruf:
Delphi-Quellcode:
procedure TfrmMain.DXDraw1Click(Sender: TObject);
begin
  B.Caption := 'HALLO';
end;
Gruß
Neutral General

igel457 22. Aug 2006 17:04

Re: [DelphiX] Phantom Sprite
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Es fehlt folgendes, ich weiß aber nicht, ob dies deinen Fehler behebt.

Delphi-Quellcode:
procedure TSpriteButton.SetCaption(const Value: String);
begin
  FCaption := Value;
  with FSprite.Image.Picture.Bitmap.Canvas do
  begin
   TextOut((Width div 2) + (FSprite.Image.Picture.Bitmap.Canvas.TextWidth(Value) div 2),
           (Height div 2) + (FSprite.Image.Picture.Bitmap.Canvas.TextHeight(Value) div 2),
            Value);
  end;
  FSprite.Image.Restore //<-- Die Grafik muss neu in den Grafikspeicher geladen werden
end;
Für mein Spiel habe ich eine GUI Komponenten Sammlung geschrieben. Vielleicht hilft dir ja diese weiter. Zum Compilieren benötigst du die JVCL.

Neutral General 22. Aug 2006 17:06

Re: [DelphiX] Phantom Sprite
 
Wenn ich Restore benutze ist danach das ganze Bild weg :shock:

Neutral General 23. Aug 2006 11:50

Re: [DelphiX] Phantom Sprite
 
Kann ich vielleicht jetzt schonmal pushen ? :duck:
weil um 18:00 ist schon wieder der halbe Tag rum :|

mimi 23. Aug 2006 21:35

Re: [DelphiX] Phantom Sprite
 
ich hätte da eine kleine vermutung warum sich das sprit bewegt :
ich weiß jetzt zwar nicht genau ab sich das sprit ständig bewegt oder nur einmal... ich tippe darauf das es sich nur einmal bewegt und zwar:
Delphi-Quellcode:
TextOut((Width div 2) + (FSprite.Image.Picture.Bitmap.Canvas.TextWidth(Value) div 2),
ich weiß zwar nicht genau was da ausgerechnet wird(ich vermute du willst den button in der mitte aussrichten)
aber da ist der fehler... schreibe mal an der stelle direkte position angeben.... dan müste das funktionieren bzw. dann dürfte sich das bild nicht mehr bewegen...

und warum du nichts siehst hängt auch damit zu sammen warscheinlich schreibst du den text an einer stelle die auserhalb des angeben canvas liegt, weißt du wie ich es meine ?
z.b.
du hast ein bild:
60X60 Pixel

und jetzt schreibst du an 70,10 das ergbnis würdes du nicht sehen....

Neutral General 24. Aug 2006 11:39

Re: [DelphiX] Phantom Sprite
 
1. Ich habe gemerkt das sich das Sprite sogar bewegt wenn man IRGENDWAS mit IRGENDEINEM Canvas oder nem Picture macht:

Delphi-Quellcode:
procedure SetCaption(const Value: String);
var APic: TPicture;
begin
  FCaption := Value;
  APic := TPicture.Create;
  APic.Bitmap.Canvas.Rectangle(0,0,1,1); // Sprite bewegt sich o.O
end;
Außerdem habe ich es schon mit Textout(0,0,Value) probiert aber man sieht nix :|

Gruß
Neutral General

mimi 24. Aug 2006 16:05

Re: [DelphiX] Phantom Sprite
 
hast du eigentlich die größen festgelegt ?
könntes du mir mal die exe datei senden ?
evlt. installeire ich auch noch mal delphiX....
(ich finde solche sachen immer spanned)

Neutral General 25. Aug 2006 15:35

Re: [DelphiX] Phantom Sprite
 
Dank mimi bekomme ich jetzt Schrift zu sehen und es bewegt sich nichts mehr :)
Thx nochmal :)

Also das ganze sieht jetzt vorerst mal so aus (bis alles klappt):

Delphi-Quellcode:
procedure TSpriteButton.SetCaption(const Value: String);
begin
  FCaption := Value;
 
  FSprite.Image.Picture.Bitmap.Canvas.Brush.Style := bsClear;
  FSprite.Image.Picture.Bitmap.Canvas.Font.Color := clred;
  FSprite.Image.Picture.Bitmap.Canvas.TextOut(0,0,Value);
  FSprite.Image.Restore;
end;
Das Problem ist das das zweite mal die erste Schrift nicht überschrieben wird.. Naja hab ich gedacht dann speicher ich den Index des Sprite-Bildes auch ab und mache es so:

Delphi-Quellcode:
procedure TSpriteButton.SetCaption(const Value: String);
begin
  FCaption := Value;
 
  FSprite.Image := FSprite.Image.PictureCollection.Items[PicIndex];
  FSprite.Image.Picture.Bitmap.Canvas.Brush.Style := bsClear;
  FSprite.Image.Picture.Bitmap.Canvas.Font.Color := clred;
  FSprite.Image.Picture.Bitmap.Canvas.TextOut(0,0,Value);
  FSprite.Image.Restore;
end;
Lade mir immer ein frisches Bild aus der Liste und male dadrauf.
Aber nix da o.O Wenn ich mit FSprite.Image...Canvas auf das Bild male wird das Bild der Imagelist auch verändert o.O
Was mach ich denn da am besten?

Gruß
Neutral General

igel457 25. Aug 2006 15:52

Re: [DelphiX] Phantom Sprite
 
Zitat:

Zitat von Neutral General
Lade mir immer ein frisches Bild aus der Liste und male dadrauf.
Aber nix da o.O Wenn ich mit FSprite.Image...Canvas auf das Bild male wird das Bild der Imagelist auch verändert o.O
Was mach ich denn da am besten?

Äh... Ich verstehe dich nicht ganz. Es ist doch logisch, dass wenn du auf das Bild in der Imagelist Zeichnest dieses auch verändet wird.

Wenn du einfach nur wie in der GDI auf ein Canvas Zeichnen möchtest dann mache einfach folgendes:

Delphi-Quellcode:
with DXDraw.Surface.Canvas do
begin
  Font.Color := clWhite;
  Brush.Style := bsClear;
  TextOut(0,0,'Ich bin ein kleiner Text');
  Release; {Unweglassbar}
end;

Neutral General 25. Aug 2006 15:54

Re: [DelphiX] Phantom Sprite
 
Ich mal es ja auch nicht auf das Bild der Imagelist sondern auf das Bild des Sprites :|


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz