Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kollisionsabfrage TImage (https://www.delphipraxis.net/156696-kollisionsabfrage-timage.html)

katika90 11. Dez 2010 16:16

Kollisionsabfrage TImage
 
Hay, wir programmieren grade in Informatik ein Art Frogger. Das ist alles total einfach bis auf die Kollisionsabfrage. :)
Also die zwei Objekte die Kollidieren sollen sind
ImMensch (=TImage) und ImAuto (= TImage)
Das Auto bewegt sich und wenn der Mensch das Auto berührt soll mit Hilfe von showmessage "Oh Nein!" geschrieben werden.
Hier mein Ansatz:
[...]
VK_Down : begin
if (ImMensch.top + ImMensch.Left) = (ImAuto.top + ImAuto.Left)
then
showmessage('Oh Nein!');
else
ImMensch.Top := ImMensch.Top + 5;
[...]

Was ist an dem Ansatz falsch bzw. wie kann man die Kollisionsabfrage besser machen?

Danke im Vorraus :)

s.h.a.r.k 11. Dez 2010 16:26

AW: Kollisionsabfrage TImage
 
Du musst auch die Größe der Images betrachten! Hier mal zwei kleiner Beispielbild:

Code:
+-----+                        +----+
|     |                        |    |
|   +--------+         +-----------------+
+---|        |         |                 |
    |        |         |                 |
    |        |         |                 |
    |        |         +-----------------+
    |        |                 |    |
    |        |                 +----+
    |        |
    +--------+
Da reicht es nicht nur die Left-Koordinate abzufragen. Meine erste Idee wäre zu testen, ob sich irgendeine Seite mit einer anderen Seite schneidet. Das wären dann :gruebel: 4 * 4 = 16 Tests. ABER das kann ja auch sein, dass ein kleineres Object direkt in einem anderen Object enthalten ist. Somit musst du quasi auch noch testen, ob ein Punkt innerhalb des größeren Vierecks liegt.

fkerber 11. Dez 2010 16:26

AW: Kollisionsabfrage TImage
 
Hi,

das Problem wird sein, dass du in 5er-Schritten springst und daher den genauen Trefferpunkt, den du abfragen willst, überspringst.

Sagen wir, die Kollision wäre bei 14, dein Mensch steht jetzt bei 11 --> keine Kollision --> +5 = 16 --> keine Kollision...

Daher müsstest du (für das konrete Beispiel) auf > 14 statt auf = 14 testen.


LG, Frederic


P.S.
Willkommen in der DP!
Kleiner Tipp: Mit Hilfe von [delphi][/delphi] kannst du den Code hier schöner darstellen lassen.

DeddyH 11. Dez 2010 16:28

AW: Kollisionsabfrage TImage
 
Windows besitzt eine Funktion namens IntersectRect, damit kann man schön einfach prüfen, ob sich 2 Rechtecke überlappen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.

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