Autor Beitrag
sabbert
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 01.08.09 19:04 
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 user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Einloggen, um Attachments anzusehen!
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
map := 'RRRRRRRRRROOOOOLLLLUUUUUU';					


Den String müsstest du dann nur noch Zeichen für Zeichen durchgehen.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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


Zuletzt bearbeitet von F34r0fTh3D4rk am Fr 14.08.09 17:15, insgesamt 1-mal bearbeitet
sabbert Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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:
  1. 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: Suche in Wikipedia PQ-FORMEL.Die negativen Lösungen werden ignoriert, da wir nur eine Halbgerade betrachten. Denn der Gegner läuft ja nur in eine Richtung ;).
  2. 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:
ausblenden 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)
ausblenden Delphi-Quelltext
1:
kollisionsPunkt = position_Gegner + x * geschwindigkeit_Gegner					

Ich habs bisher noch nicht getestet, aber es könnte so funktionieren.


mfg


Zuletzt bearbeitet von F34r0fTh3D4rk am Fr 14.08.09 16:54, insgesamt 1-mal bearbeitet
sabbert Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 14.08.09 15:12 
ok danke :)

das klingt doch schonmal vielversprechend :)

ich werde es gleich ml versuchen
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 14.08.09 16:12 
Ganz so einfach scheint es dann doch nicht zu funktionieren, aber ich arbeite dran ;)

EDIT: so hier nochmal ein neuer Ansatz, der die Position des anzuvisierenden Punktes berechnen soll:
mathdraw.de/md.php?i...bs%28V_Geschoss%29++
Alles Vektoren in dem Fall, allerdings noch ungetestet. Achja P ist die Position und V die Geschwindigkeit :mrgreen:

EDIT2: Es stimmt noch nicht ganz, aber es kommt dem schon nahe. :P
Bei der oben genannten Formel wird halt geschaut wie lange das Geschoss bei einem direkten Schuss brauchen würde. Dann kann man ermitteln, wohin sich der Gegner bis dahin bewegt hätte und stattdessen dahin schießen. Dieser Weg ist aber unter Umständen länger oder kürzer und damit ist die Sache nicht mehr exakt.

Ich hab das Problem mal aufgeschrieben:
mathdraw.de/md.php?i...gicaland%5Cdt-%02min
Eine Lösung hab ich allerdings immer noch nicht ;) Brett vorm Kopf könnte man sagen.

mfg