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