Hattest du schonmal mit Vektorrechnung in der Schule zu tun?
Für dein Problem benötigst du ja im Prinzip einen Richtungsvektor vom Schiff zum Zielpunkt.
Du hast zum Beispiel das Schiff an der Position: (10, 5) und das Ziel an der Position (12,17).
Mir hilft es immer solche Probleme zu visualisieren um sie zu verstehen.
Z.B. könntest du dir ein kariertes Blatt schnappen, ein Koordinatensystem aufmalen und die Punkte einzeichnen.
Dann verbindest du die Punkte mit einem Strich und hast den Vektor.
Um den Verbindungsvektor zwischen zwei Punkten zu berechnen, ziehst du den 2. vom ersten ab.
In diesem Fall also (12,17) - (10,5) = (2,12).
Damit hast du also als Richtungsvektor (2,12).
Nun kannst du den Laser in jedem Frame soweit in die Richtung bewegen wie du möchtest.
z.B. wenn du ihn um 3 Pixel pro Sekunde bewegen möchtest:
Dann normaliesierst du den Vektor (teilst ihn durch seine Länge) was ungefähr so aussieht:
Wurzel(2*2+12*12) = Vektorlänge = 12.17
(2,12)/12.17 = (0.16, 0.9)
Nun musst du wissen wie viel Zeit zwischen den Frame vergeht (bei 60 FPs zum Beispiel 0.01666667 sekunden) und multiplizierst das mit dem Vektor.
Dann hast du die Bewegung um Pixel pro Sekunde, und multiplizierst du es noch mit der Geschwindigkeit (also z.B. 3 Pixel pro Sekunde):
(0.16, 0.9)*0.01666667 *3 = (0.008219949, 0.049319696)
jetzt kannst du die aktuelle Position des Lasers um 3 Pixel pro Sekunde updaten:
Das ist mal ein bisschen Pseudo-Code jedoch in C++. Aber vielleicht hilft es dir ja es für die Umsetzung zu verstehen.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
float Vector2::length()
{
return sqrtf(this->x*this->x+this->y*this->y);
}
void Laser::create(Vector2 laserStartPosition, Vector2 zielPosition)
{
this->richtungsVektor = zielPosition - laserStartPosition;
this->richtungsVektor = this->richtungsVektor / this->richtungsVektor.length();
}
// fTime = seconds between frames
int Laser::move(float fTime)
{
float speed = 3.0f;
this->currentPosition += this->richtungsVektor * fTime * speed;
}
|