Hallo,
ich bin zur Zeit dabei eine sehr simple "KI" für mein 2D-Spiel zu programmieren. Ich will nun zu nächst einmal das der Bot den Spieler anvisiert d.h. so rotiert das er ihn anvisiert. Dabei gibt es natürlich eine Rotation die der Bot momentan besitzt und eine eine Rotation die er einnehmen will (bei dieser visiert er den Spieler an). Die Rotation die er später besitzen soll berechne ich mit dieser Funktion hier:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
void ENEMY::Aim (sf::Vector2f Pos)
{
float b = Pos.x - x;
float a = Pos.y - y;
if (b>0)
WantedRotation = (atan (a/b) * 180 / M_PI) + 90;
else
WantedRotation = (atan (a/b) * 180 / M_PI) + 270;
if (WantedRotation > 360)
WantedRotation -= 360;
if (WantedRotation < 0)
WantedRotation += 360;
}
|
Die "
WantedRotation" wird auch korrekt berechnet. Nach der Ausführung dieser Funktion wird dann beurteilt in welche Richtung sich der Bot nun drehen muss um den Spieler anzuvisieren. Diese Beurteilung geschiehtr in diesem Code:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
if (static_cast<int> (Rotation) != static_cast<int> (WantedRotation))
{
if (Rotation < WantedRotation)
Rotation += GetRotationSpeed ();
else
Rotation -= GetRotationSpeed ();
}
if (Rotation > 360)
Rotation -= 360;
if (Rotation < 0)
Rotation += 360;
|
Der Gedanke hinter diesem Code sollte eigentlich selbst erklärend sein. Der Code erfüllt seinen Zweck doch wenn nun z.B. der Zielwinkel aktuell sich bei 350° befindet und sich erhöht bis er schließlich bei 5° angelangt ist, dann erhöht die KI ihren Winkel nicht, um mit einer kleinen Rotation den Spieler anzuvisieren, sondern sie verringert ihren Winkel da ihr Zielwinkel ja nun kleiner ist als ihrer. Dies führt dazu, dass nun die KI fast eine ganze Umdrehung absolviert, obwohl sie eigentlich nur eine kleine Rotation benötigt hätte. Ich hoffe ich konnte mein Problem verständlich veranschaulichen. Nun lautet meine Frage: Wie kann ich der KI "erklären" das sie ihren Zielwinkel auch mit einer kleineren Rotation erreicht?
Viel Dank für eure Hilfe.