Entwickler-Ecke
Sonstiges (Delphi) - Andorra 2D TD Clone problem
sabbert - Sa 01.08.09 19:04
Titel: Andorra 2D TD Clone problem
Hallo zusammen,
Ich habe angefangen mich mit der Andorra 2D engine zu beschäftigen ;-) Da ich etwas schon programmiert hatte wollte ich mich mal einem Tower Defence Clone probieren. Nun stoße ich aber auf ein paar Probleme, die schon teils durch nachforschungen hier im Forum lösen konnte.
1. Ich habe es geschafft testweise 10 Monster zu erstellen die nach und nach gespawned werden und dann sollen die Tower auf diese schießen. Dies klappt auch soweit nur versuche ich das die Kugeln eine kleine Kurve fliegen da ich zum Zeitpunkt des Abschusses beide Koordinaten speicher die von dem Turm und die von dem Gegner. Das Geschoss fliegt zwar darauf zu, doch der Gegner läuft weiter, sodass es erst nach dem Gegner auftrifft.
Habt ihr da eine Idee, wie ich diese Flugkurve hinbekomme??
2. Der weg den die Gegner laufen ist bis jetzt nur waagerecht, sodass ich nur eine Y- Koordinate brauche. Will aber das die gegner auch senkrecht einen bestimmten weg ablaufen können. Wie kann ich das überprüfen, das z.B. wenn eine Kurve kommt die Gegner sich drehen und dann dort weiterlaufen. Einzige umständliche Idee wäre für jede Kurve die Koordinate zu speichern und dann die X- bzw Y- Werte zu verändern, waäre aber mühsam immer alle zu speichern. Gibt es eine möglichkeit, dass die "Gegner" überprüfen ob sie gerade auf de Weg laufen und falls vor ihnen der Weg endet sie sich in die passende Richtung drehen?
3. Abundzu ist das so wenn das Geschoss auf einen Gegner trifft keine Lebenspunkte abgezogen werden. obwohl man deutlich sieht, das es auf den Gegner trifft.
Das wars erstmal an Fragen :-P Hoffe ich habe es verständlich genug ausgedrückt für euch :-P habe den Source Code beigefügt, vielleicht könnt ich mir ja noch ein paar Verbesserungsvorschläge machen :D Bei Verständnisfragen bitte melden.
Danke schonmal für die Hilfe im vorraus
mfg Sabbert
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
F34r0fTh3D4rk - So 02.08.09 16:06
Ich werd erstmal nur auf die erste Frage eingehen:
Du möchtest sicher, dass das Geschoss so abgefeuert, dass es den Gegner auch dann noch trifft, wenn er ein Stück weitergelaufen ist, richtig?
Dazu nimmst du seine Position und seine Geschwindigkeit und baust dir daraus eine Gerade. Das sind dann schätzungsweise all die Punkte an die er sich bewegen könnte. Jetzt brauchst du die Position des Turms und die Geschossgeschwindigkeit und musst ermitteln, welche Richtung dein Geschwindigkeitsvektor bekommen muss, sodass die beiden Geraden in Abhängigkeit der Geschwindigkeit sich "zur rechten Zeit" treffen.
mfg
sabbert - Fr 07.08.09 21:48
danke schonmal ein Anfang werde es versuchen umzusetzen. ;-)
hat sonst noch jemand andere Vorschläge auch zu den anderen Fragen?
Tilman - Fr 07.08.09 22:06
Naja das die Geschosse etwas hinter den Gegnern einschlagen könnte ja auch ein gewollter Effekt sein. Jedenfalls habe ich schon solche Spiele gesehn. Vielleicht sieht das ja ganz gut aus, wenn du die geschwindigkeit der Geschosse erhöhst.
Was Kurven angeht: würde ich erstmal nicht einbauen, ich würde einfach gerade Strecken nehmen. Also den Gegnern irgendwie sagen dass sie z.B. zuerst 10 Einheiten Waagerecht nach rechts gehen sollen, dann meinetwegen 5 Einheiten Senkrecht nach oben, dann wieder 4 Waagerecht nach links... und so weiter. Theoretisch könntest du das sogar der Einfachheit als String speichern:
Delphi-Quelltext
1:
| map := 'RRRRRRRRRROOOOOLLLLUUUUUU'; |
Den String müsstest du dann nur noch Zeichen für Zeichen durchgehen.
F34r0fTh3D4rk - Sa 08.08.09 11:00
Zu meiner oben genannten Rechnung ist zu sagen, dass hierbei eventuell, soweit ich das abschätzen kann, ein quadratisches Gleichungssystem zu lösen ist. Ich werd mich bei Zeiten eventuell mal dran versuchen das zu implementieren. Irgendwie interessiert mich das schon ;)
mfg
sabbert - So 09.08.09 14:40
das wäre gut wenn du das mal machen könntest ;-)
Danke für weitere Antworten und Ideen.
F34r0fTh3D4rk - Mo 10.08.09 11:49
Ich komme leider noch nicht dazu, das Ganze zu implemtieren, aber wenn du möchtest, konkretisiere ich meinen Ansatz ein wenig:
Da wir keine relativistischen Effekte betrachten, gehen wir davon aus, dass die Zeit für Gegner und Turm gleich schnell verläuft. Auf diese Weise lässt sich das Problem ein wenig vereinfachen.
Du nimmst die Position des Gegners und seinen Geschwindigkeitsvektor und "baust" dir daraus eine (Halb-)Gerade.
Gesucht ist nun der Punkt auf der Gerade, der folgende Eigenschaften erfüllt:
- Das Verhältnis vom Abstand dieses Punktes zum Turm und dem Abstand des Punktes vom Gegner entspricht dem Verhältnis der Geschwindigkeiten von Geschoss und Gegner. Sprich: abstand_Turm/abstand_Gegner = geschwindigkeit_Geschoss/geschwindigkeit_Gegner. Da es sich hier um Längen handelt, wird man hier eventuell mit quadratischen Gleichungen konfrontiert :arrow:
PQ-FORMEL.Die negativen Lösungen werden ignoriert, da wir nur eine Halbgerade betrachten. Denn der Gegner läuft ja nur in eine Richtung ;).
- Der Punkt hat unter den oben genannten Voraussetzungen minimalen Abstand zur Gegnerposition
Dadurch sollte der Punkt eindeutig bestimmt sein. Der Vektor, der von deinem Turm auf diesen Punkt zeigt ist die Richtung, in der du dein Geschoss abfeuern musst, damit es deinen Gegner auf jedenfall trifft, sofern er nicht zwischendrin die Richtung ändert. Du musst diesen Vektor natürlich noch normalisieren und mit der Geschwindigkeit die das Geschoss haben soll multiplizieren, bevor du ihn anwendest.
EDIT: ich hab glaube ich ein wenig kompliziert gedacht ;)
In Frage kommen doch alle Punkte ab einem bestimmten Minimum, da es eine minimale Zeit gibt, die das Geschoss braucht, um anzukommen. Um den frühesten Kollisionspunkt zu bestimmen, kann man daher einfach die Dreiecksungleichung verwenden:
Delphi-Quelltext
1:
| x = abs(position_Turm-position_Gegner)/(abs(geschwindigkeit_Geschoss)+abs(geschwindigkeit_Gegner)) |
Dieses x wird dann mit dem Geschwindigkeitsvektor des Gegners (Turmgeschosses) multipliziert und auf dessen Position (bzw. die Position des Turms aufaddiert)
Delphi-Quelltext
1:
| kollisionsPunkt = position_Gegner + x * geschwindigkeit_Gegner |
Ich habs bisher noch nicht getestet, aber es könnte so funktionieren.
mfg
sabbert - Fr 14.08.09 15:12
ok danke :)
das klingt doch schonmal vielversprechend :)
ich werde es gleich ml versuchen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!