![]() |
Kollision zwischen einem Sprite und einem Bild??
Hab hier ein Sprite, das so erzeugt wird:
Delphi-Quellcode:
Und das Bild wird so erzeugt:
constructor TPlayer.Create(AParent: TSprite );
begin inherited Create(AParent); Image:=Form1.DXImageList1.Items[3]; Width :=Image.Width; Height :=Image. Height; Visible:=True; end;
Delphi-Quellcode:
Nun kann ich das Bild nicht zu einem Sprite machen.
DXImageList1.Items[2].Draw(DXDraw1.Surface,j*32,i*32,0);
Ich weiss schon wie man das macht und wie die Kollision zwischen 2 sprites funktioniert. Aber bei meinem Beispiel kann ich das so nicht machen. Es geht einfach nicht, weil es dann alles auf den Kopf stellt :spin: . Unter umständen würde ich das Sprite auch in ein Bild machen, aber das würde ich nur machen, wenns sonst keine Lösung gibt. :freak: [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: Kollision zwischen einem Sprite und einem Bild??
Hi,
Wenn ich dich richtig verstehe, willst Du auf einem DXDraw.Surface direkt zeichnen, und anschließend überprüfen, ob dein Sprite damit kollidiert... also, eigentlich ist die Sprite Engine von DelphiX für so was nicht vorbereitet... :( aber.... ich hab eine Lösung gefunden.. ist aber schon recht knackig 8) also :coder: im Unit DXSprite gibt es die Funktion ImageCollisionTest diese Funktion vergleicht zwei DXDraw Surfaces, also genau das was Du brauchst... Leider ist diese Funktion nicht öffentlich, sondern steht nur im Implementierungsteil von DelphiX... also, mußt Du das als erstes ändern und die Deklaration der Funktion in den Interfaceteil des Units aufnehmen, am besten direkt vor der Implementation Anweisung:
Delphi-Quellcode:
So, jetzt kannst Du die Funktion in deinem Code verwenden...
unit DXSprite;
... interface ... function ImageCollisionTest(suf1, suf2: TDirectDrawSurface; const rect1, rect2: TRect; x1,y1,x2,y2: Integer; DoPixelCheck: Boolean): Boolean; implementation ... Du rufst die Funktion mit folgenden Parametern auf: suf1: dein Hintergrund suf2: dein Sprite-Image rect1: Ausmaße von suf1 rect2: Ausmaße von suf2 x1,y1: Position von suf1 x2,y2: Position von suf2 DoPixelCheck: True, wenn Du transparente Farben verwendest die Funktion gibt True zurück wenn eine Collision besteht Hier noch ein Beispiel:
Delphi-Quellcode:
ach ja, Du mußt bei dem Image deines Sprites in der Imagelist noch unbedingt in den Feldern PatternHeight und PatternWidth die Breite und Höhe deines Sprites angeben, sonst klappt's nicht...
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin if not DXDraw1.CanDraw then Exit; DXInput1.Update; DXSpriteEngine1.Move(1); DXDraw1.Surface.Fill(0); // Erst den Hintergrund zeichnen DXImageList1.Items[0].Draw(DXDraw1.Surface,0,0,0); if ( ImageCollisionTest( DXDraw1.Surface, DXImageList1.Items[1].PatternSurfaces[0], Rect(0,0,DXDraw1.Surface.Width,DXDraw1.Surface.Height), Rect(0,0,DXImageList1.Items[1].Width,DXImageList1.Items[1].Height), 0,0, Round(Player.X), Round(Player.Y), true)) then begin // Wir haben eine Kollision mit dem Hintergrund !! beep; end; // Erst jetzt die Sprites zeichnen... DXSpriteEngine1.Draw; ... ich hoffe das war einigermaßen verständlich :roteyes: , es funktioniert, habs gerade ausprobiert. Viele Grüße, El Duckle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz