2D-Spiel: relativen Winkel zweier Objekte abgleichen
-
Also ich habe einen 2D-Shooter, bei dem ein KI-Objekt sich zum Spieler hin ausrichten soll. Dazu kann es sich jeweils um einen Bereich nach links oder rechts drehen. Die Position des Spielers wird (da die Schrittweite der Animation so eingeteilt ist) in 8 Bereiche eingeteilt:
701
6x2
543Das Objekt kann also in die Richtungen 0 - 7 schauen. Andererseits befindet sich der Spieler irgendwo zwischen 0 und 7.
Die einfachste Variante ist natürlich zu schauen, ob eigene Ausrichtung - Spielerausrichtung > 0 (rechts drehen) oder < 0 (links drehen) ist. Das klappt allerdings nur bis zum überlaufpunkt links oben.Wie kann ich jetzt möglichst praktisch berechnen, ob sich mein Objekt nach links oder rechts drehen soll?
Ich hatte schon überlegt, die Zahlen eines Objekts einfach umzudrehen und dann eigene Blickrichtung und die des Gegners zu addieren.
0 7 6 701 16x25 543 2 3 4
Ist der Gegner direkt im Blickfeld, ist das Ergebnis 7
Direkt links ist es immer 8, direkt rechts ist es undefiniert. Allerdings klappt das wieder nur bei den direkt benachbarten Bereichen.
Hat wer eine Lösung für mich?
-
Das kommt mir irgendwie bekann vor ... Ich wuerde Kreuzprodukt und sinus empfehlen.
-
auch wenn ich keine ahnung habe...
aber der beitrag von knivil würde mir nicht helfen?
muss es denn immer so knapp geantwortet sein?
-
Das Kreuzprodukt hat mich auf eine Idee gebracht.
Hab einfach die Richtung in der der Spieler ist von der, in der sich die KI befindet abgezogen und mir daraus folgende Tabelle erstellt.
Dabei ist das X vorn, das eingerahmte links, der Rest rechts. Hinten wurde mit zu links gezählt, weil man sich ja auch da drehen muss.0 1 2 3 4 5 6 7 ___________ 0 X|-1 -2 -3 -4|-5 -6 -7 ---=========__ 1 1 X|-1 -2 -3 -4|-5 -6 ---========--- 2 2 1 X|-1 -2 -3 -4|-5 ---========___ 3 3 2 1 X|-1 -2 -3 -4| _ ---======== 4 4| 3 2 1 X|-1 -2 -3 =___ ---===== 5 5 4| 3 2 1 X|-1 -2 ====___ ---== 6 6 5 4| 3 2 1 X|-1 _=======___ -- 7 | 7 6 5 4| 3 2 1 X -----------
Daraus lies sich super ne einfache If-Abfrage stricken..
-
knivil schrieb:
Das kommt mir irgendwie bekann vor ... Ich wuerde Kreuzprodukt und sinus empfehlen.
Ja - das Kreuzprodukt wäre die erste Wahl, aber da DocJunioR gar keine Richtungen in Form von (math.)Vektoren zu haben scheint und bei ihm positiv im Uhrzeigersinn mathematisch negativ ist, wäre die Umrechnung in Vektoren und das Erstellen und Interpretieren des Kreuzprodukts ziemlicher Overhead.
Einfacher geht es vielleicht so:
// liefert 1 wenn a positiv nach b drehen muss, sonst -1 oder 0 wenn a==b int drehung( int a, int b ) // a dreht in Richtung b { if( a == b ) return 0; return (a < b && b <= a + 4) || b <= a - 4 ? 1: -1; }
Gruß
Werner