Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Problem beim Bereich prüfen. (https://www.delphipraxis.net/162382-problem-beim-bereich-pruefen.html)

Blackstyle94 19. Aug 2011 21:35

Problem beim Bereich prüfen.
 
HalliHallo,

Ich habe durch die Schule das Programmieren für mich entdeckt und dachte mir lass doch mal ein kleines einfaches 2D Shooter Spiel programmieren:-D. Das Spiel ist schon fast fertig, aber am Ende hatte ich ein Problem.

Ich konnte durch die Schüsse niemanden treffen. Ich habe versucht mit Koordinaten zu arbeiten und habe versucht dem Programm zu sagen er soll dem Spieler ein Leben abziehen wenn Bild1(Der Spieler) und Bild2(Die Munition) auf der selben Koordinate liegen. Dies funzte nicht:(. Später erkannte ich auch warum. Mein Schuss bewegt sich mit der Einheit 15 durch das Formular und so können die sich nie treffen weil die Munition den Spieler immer überspringt. Ab da war mir klar, dass ich einen Bereich prüfen lassen sollte und nicht nur einen Punkt. Leider weiß ich nicht wie es geht, habe auch recherchiert, aber natürlich fand ich nichts.

Deshalb meine Frage an euch: Kennt jemand einen Befehl, wodurch man dies zustande bringen könnte. (Hoffe habe genug Infos gebracht).

Danke im Vorraus
:)

stahli 19. Aug 2011 21:52

AW: Problem beim Bereich prüfen.
 
Hallo und herzlich willkommen!

Mir fällt da erst mal ein, die Bewegung um einen Schritt auszuführen.
Ansonsten müsstest Du vermutlich eine virtuelle Linie zur Zielposition berechnen und eine Kollision der Line mit dem Objekt prüfen...

Medium 19. Aug 2011 23:45

AW: Problem beim Bereich prüfen.
 
Du kannst natürlich mathematisch prüfen:
Delphi-Quellcode:
getroffen := ((Bullet.Right >= Enemy.Left) and (Bullet.Right <= Enemy.Right)) or ((Bullet.Left <= Enemy.Right) and (Bullet.Left >= Enemy.Left)) or ((Bullet.Left <= Enemy.Left) and (Bullet.Right >= Enemy.Right));
(Die letzte Bedingung ist unnütz, wenn die Projektile stets schmaler sind als die Gegner.)
Okay, ist eher logisch geprüft, aber mathematisch motiviert. Nennt sich "AABB"-Test (Axis-Aligned-Bounding-Box Test).

Allerdings hast du dann noch immer ein Problem, wenn beide beteiligten kleiner als die Schrittweite sind (also in deinem Fall unter 15 Pixel), da dann Überspringen noch geht. Um das auch zu behandeln, bleibt wirklich nur noch der Ansatz mit linearer Algebra (Schnittpunktberechnung der Flugbahn des Projektils mit den Kanten des Gegners), was stahli auch nannte. Bei langsamen Projektilen - klingt bei dir so - sollte man zudem nicht auf Geradenschnitt, sondern bildweise auf Streckenschnitt prüfen. (Also normalisierten Richtungsvektor mit der Geschwindigkeit skalieren, und nach dessen Parameter auflösen. Ist der zwischen 0 und 1 gabs nen Schnitt im aktuellen Frame.)
Alles aber unnötig, wenn eben mindestens ein beteiligtes Kollisionselement in allen relevanten Richtungen größer als die Schrittweite ist, dann das simple AABB. (Vorausgesetzt, eine Begrenzung deiner Gegner anhand ihrer linken und rechten Grenzen ist ausreichend. Bei größeren/komplexeren kann das auch schon wieder zu grob sein, das ist Ermessenssache. Allerdings kommt man dann mit Bitmaps eh nicht mehr wirklich gut weiter, dann müsste alles in vektorieller Form vorliegen.)

Viel wichtiger: Wilkommen in der DP! :hi:

Tobinator 19. Aug 2011 23:48

AW: Problem beim Bereich prüfen.
 
Mit würde spontan einfallen, das mit hilfe eines Vektors zu berechnen.

Die Schusslinie ist dann ein Vektor und wenn der Gegner ein Element des Vektors ist (also der Spieler auf dem Vektor liegt), ist er getroffen.
Wenn ihr Vektoren in der Schule schon hattet und du ein bisschen fit in Mathe bist, sollte das nicht so kompliziert werden.

Ortsvektor(Spieler) + Entfernung(Spieler - Gegner) * Richtungsvektor(Schuss) = Ortsvektor(Gegner) ==> Treffer

so inetwa müsste das gehn

Viele Grüße

Tobi.

Blackstyle94 20. Aug 2011 10:03

AW: Problem beim Bereich prüfen.
 
Hay,

Also danke erstmal für die schnellen Antworten. Hätte nicht gedacht, dass über die Nacht so viele bzw. überhaupt eine Antort kommen würde :thumb:.

Eure Antworten sagen mir leider nicht viel, da ich erst vor 2 Wochen angefangen habe. Mein Spiel selbst besteht daher auch nur aus simplen Befehlen. Aber ich werde mich ma ein bisschen schlau machen über die Punkte, die ihr geschrieben habt und dann mal ausprobieren. Sage euch dann Bescheid wenns klappt.:)


So Far
Blackstyle94


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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