Einzelnen Beitrag anzeigen

ElDuckle

Registriert seit: 28. Okt 2003
Ort: München
4 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Kollision zwischen einem Sprite und einem Bild??

  Alt 9. Nov 2003, 18:00
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 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:
unit DXSprite;
...
interface
...

function ImageCollisionTest(suf1, suf2: TDirectDrawSurface; const rect1, rect2: TRect; x1,y1,x2,y2: Integer; DoPixelCheck: Boolean): Boolean;

implementation
...
So, jetzt kannst Du die Funktion in deinem Code verwenden...
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:
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;
  ...
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...

ich hoffe das war einigermaßen verständlich , es funktioniert, habs gerade ausprobiert.

Viele Grüße,

El Duckle
  Mit Zitat antworten Zitat