Ich versuche eine gute Lösung für eine Kugel zu finden, um den Feind zu treffen. Das Spiel ist 2D Tower Defense, der Tower soll eine Kugel abschießen und den Feind garantiert treffen.
Ich habe diese Lösung ausprobiert - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Der erwähnte Link, um den Ursprung der Kugel und den des Feindes zu subtrahieren (Vektorsubtraktion). Ich habe es versucht, aber es folgt nur eine Kugel um den Feind.
float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;
velocity.x = diffX;
velocity.y = diffY;
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
Ich kenne Vektoren, bin mir aber nicht sicher, welche Schritte (Vektor-mathematische Operationen) durchgeführt werden müssen, um diese Lösung zum Laufen zu bringen.
Antworten:
Ihre Überlegung war perfekt: Verwenden Sie einen Vektor, um von meiner Position zu meinem Ziel zu gelangen. Dies ist der Zweck eines Vektors ; Du hast einfach die Geschwindigkeit vergessen !
Geschwindigkeit ist ein Vektor: eine Geschwindigkeit und eine Richtung. Wenn Sie jedoch vergessen, den Differenzvektor zu normalisieren und ihn mit der Geschossgeschwindigkeit (einem Skalar) zu multiplizieren, sagen Sie im Grunde, dass sich das Geschoss verlangsamt , wenn Sie sich dem Ziel nähern (der Differenzvektor ist klein) . während, wenn Sie weit weg sind, die Kugelgeschwindigkeit größer ist.
Dies ist das zugrunde liegende Problem: Sie müssen sowohl die Richtung als auch die Größe des Vektors berechnen .
quelle
Wenn sich das Ziel mit gleichmäßiger Geschwindigkeit in eine gleichmäßige Richtung bewegt und Ihr Geschossweg mit gleichmäßiger Geschwindigkeit in einer geraden Linie verläuft, können Sie mithilfe einer quadratischen Gleichung den genauen Schnittpunkt vorhersagen und die Waffe Ihres Turms auf diesen Punkt richten .
Da es eine Gewissheit ist, dass die Kugel ins Schwarze trifft und Sie die genaue Zeit berechnen können, die vom Abschuss bis zum Aufprall vergeht, ist keine Kollisionserkennung erforderlich. Einfach die Waffe abfeuern, die berechnete Zeitspanne abwarten und einen Treffer registrieren.
Hier ist der Pseudocode für die quadratische Gleichung:
quelle
Sie müssen die Position der Objekte vorhersagen, bis die Kugel sie erreicht. Sie können dies unter Verwendung der Geschwindigkeit / Geschwindigkeit des Objekts (hoffentlich konstant;)) und seines Richtungsvektors tun.
Ich bin mir nicht sicher, wie die genaue Formel aussieht, aber ich denke, es ist ungefähr so:
NewPosition = OldPosition + (Geschwindigkeit * DirectionVector);
Wenn Sie einen festgelegten Pfad haben, müssen Sie neu berechnen, wann das Objekt die Richtung ändert. Verwenden Sie diese neue Position als Ihren feindlichen Positionsvektor, und die Kugel sollte auf das Objekt treffen, ohne dass der Zielsucheffekt auftritt. Die Referenzfahrt erfolgt aufgrund der Tatsache, dass sich das feindliche Objekt seit der Berechnung des ursprünglichen Vektors bewegt hat. Es kann immer nur aufholen, wenn sich ein Objekt lange genug in eine Richtung bewegt.
Hoffe das hilft :)
quelle
Sie können Quadratwurzel und Potenz von 2 vermeiden.
Es ist alles aus dem Gedächtnis geschrieben. Verwenden Sie im Übrigen die Elemente, die funktionieren - testen Sie sie Zeile für Zeile, wenn Sie neu in diesem Bereich sind. Float ist die Nummer in AS3.
quelle