Lenkwaffe mit konstanter Zeit


9

Ich baue ein Spiel mit Spielern und Raketen.

Ich möchte eine Rakete von P1 nach P2 abfeuern. Die Rakete sollte immer genau fünf Sekunden brauchen, um P2 zu erreichen. Die Rakete sollte auch P2 verfolgen. Wenn sich P2 weiter entfernt, muss der Flugkörper schneller werden, um die Zeitbeschränkung zu erfüllen. Wenn sich P2 nach links bewegt, muss sich die Rakete nach links bewegen (und auch die Geschwindigkeit ändern). Wenn P2 näher an P1 heranrückt, muss die Rakete langsamer werden.

Ist das möglich? Was ist der beste Weg, um dies zu erreichen?

Ich habe derzeit keine Vector2D-Klasse (dies ist eigentlich kein Spiel, aber die Analogie funktioniert gut). Wenn möglich, möchte ich eine Lösung, für die keine erforderlich ist.

Bearbeiten: Dies ist auch keine Rakete. :) :)

Vielen Dank!


1
(Ich habe etwas Angst vor jemandem, der nach einer Raketenführung fragt, die durch "Dies ist eigentlich kein Spiel" qualifiziert ist, aber ...) Haben Sie irgendwelche Einschränkungen hinsichtlich der Form der Flugbahn des Flugkörpers? Kann es immer einer geraden Linie zwischen seiner aktuellen Position und Spieler 2 folgen? Hat es eine Grenze für seinen Wenderadius oder seine Beschleunigung? Muss es Hindernissen ausweichen? Sie erwähnen auch Vector2D - ist es sicher anzunehmen, dass Sie dies nur in 2D benötigen? Sie können die gesamte Vektormathematik komponentenweise ausführen, aber das Schreiben ist im Vergleich zu einer einfachen Vektormathematikklasse umständlich, sodass ich die Präferenz dagegen nicht wirklich verstehe.
DMGregory

Sie haben einige zusätzliche Informationen verpasst. Gibt es Einschränkungen? Bewegen sich Raketen entlang einer Linie oder sollten wir uns um Richtungen kümmern und wie viele Dimensionen letztendlich?
Liggiorgio

Der Pfad sollte nicht eingeschränkt werden. Die einzigen Regeln sind: A) Die "Rakete" sollte immer Schritte in Richtung ihres Ziels unternehmen. B) Die "Rakete" sollte immer 5 Sekunden brauchen, um dorthin zu gelangen. Das Schreiben einer Vector2D-Klasse ist kein Problem. Ich habe einfach kein Handy zur Hand (und Mathe ist nicht mein bestes Fach). Wenn es einfacher ist, kann ich es hinzufügen.
Peter

Der einfachste Weg, dies zu tun, besteht darin, einen Einsiedler-Spline zu verwenden und den Parameterwert zu lerp.
Steven Srun

Antworten:


11

Die Bearbeitung ist beruhigend. :) :)

Okay, hier ist eine einfache Update-Schleife ...

Angenommen, wenn wir die Rakete abfeuern, initialisieren wir remainingFlightTime = 5fdann ...

void UpdateMissile(float deltaTime)
{
   remainingFlightTime -= deltaTime;

   // At the end of the trajectory, snap to target & explode.
   // The math will put us there anyway, but this saves
   // on fancy logic related to overshooting. ;)
   if(remainingFlightTime <= 0f)
   {
      myX = targetX;
      myY = targetY;
      MissileImpact();
      return;
   }

   // Compute straight-line velocity that will take us
   // to the target in exactly the time remaining.
   velocityX = (targetX - myX)/remainingFlightTime;
   velocityY = (targetY - myY)/remainingFlightTime;

   // Integrate the velocity into the position.
   myX += velocityX * deltaTime;
   myY += velocityY * deltaTime;
}

1
Diese Methode lässt die "Rakete" nicht so erscheinen, als würde sie sich während des Fluges um ihren Startpunkt drehen. +1
Jon

0

Warum nicht die Position ändern und das Ziel aktualisieren, wenn es sich ändert?

Möglicherweise müssen Sie sich ansehen, wie Lerping funktioniert, aber es würde ungefähr so ​​aussehen:

public position startMarker;
public float duration = 5.0f;
private float startTime;
void Launch() {
    startTime = Time.time;
}
void Update() {
    float distCovered = (Time.time - startTime) / duration;
    missile.position = Vector3.Lerp(startMarker.position, target.position, distCovered);
}

Durch Lerping ändern Sie im Grunde genommen die Position eines Objekts über einen bestimmten Zeitraum, sodass Sie sagen können, dass Sie sich zu 50% von A nach B befinden und das Objekt dort platziert wird. Lerping ist direkt, so dass Sie sich immer auf das Ziel zubewegen (wie Sie es in den Kommentaren möchten).


huh gut mein schlechtes ... ich denke das ist was passiert wenn du versuchst um 3 Uhr morgens zu codieren. änderte die Antwort, um den Fehler zu beheben
user3797758
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.