Intelligentes Zielen bei Spielen

In vielen Spielen sieht man Geschütztürme oder NPCs, die anscheinend sehr gut Zielen gelernt haben. Darum soll es in diesem Beitrag gehen, wie man auch am Titel unschwer erkennen kann.
Ich habe mich schon immer gefragt: Wie geht das? Wie kann man das als Algorithmus formulieren? Und kann ich das selber auch machen? In der letzten Woche bin ich nun auf eine Lösung gestoßen. Ich hatte mich an diesem Thema festgebissen, wollte es aber nicht Googlen, sondern selber herausfinden. Meine Idee bekam ich durch… naja… Mathe :/. Leider ist der Unterricht dich zu etwas nütze und das muss man sich erstmal eingestehen. Da ich so überaus intelligent bin, gehe ich an ein Gymnasium und dort gibt es nunmal auch diesen sagenumwobenen „Mathematik Unterricht“. Als Thema hatten wir Vektorrechnung und das kann man für das Programmieren grafischer Anwendungen sehr sehr sehr sehr sehr sehr sehr gut gebrauchen!
Meine Idee war es eine Flak (also für alle Nicht-N24-Gucker: ein Luftabwehrgeschütz.) so auf meinen Mauszeiger schießen zu lassen, dass sie ihn trifft, wenn das Projektil an der Maus ankommt. Sie musste also vor das Ziel schießen und dieses Vorziehlen wollte ich als Algorithmus fassen. Nach einigen Überlegungen kam ich auf folgenden Ansatz:

Die Kugel hat eine festgelegte Geschwindigkeit: in meinem Fall 10 Pixel/Einheiten pro Frame
Das Geschütz ist in der Mitte des Fensters, welches eine Abmessung von 800 mal 600 Pixeln hat.
Die Maus ist das Ziel und hat auch eine Gesschwindigkeit:
Diese lässt sich aus der Änderung der Koordinaten der Maus zwischen zwei Frames ausrechnen.

MausX-MausX_Vorher=AbstandX
MausY-Mausy_Vorher=AbstandY

Die Länge dieses Vektors, also die Geschwindigkeit ergibt sich dann so:
Geschwindigkeit²=AbstandX²+AbstandY2 (Für alle Angehörigen des Bildungsbürgertums: Das ist der Satz des Pythagoras.)
Die Wurzel aus Geschwindigkeit² ist logischer Weise die Geschwindigkeit.

Als nächstes Überlegte ich mir folgendes:
Vereinfacht gesehen, bewegt sich das Ziel (die Maus) auf einer Geraden, solange sie nicht ihre Richtung ändert oder der Nutzer die Geschwindigkeit der Mausbewegung ändert.
Nun wird jedes Pixel auf der Geraden, welches vor der Maus liegt, kontrolliert:
Der Abstand zu dem ausgewählten Pixel geteilt durch die Geschwindigkeit der Maus ergibt einen Wert.
Der Abstand zwischen Geschützturm und dem Pixel geteilt durch die Geschwindigkeit der Kugel (10) muss den gleichen Wert ergeben.
Hier nochmal als Skizze:
Skizze

Wie man sieht, passen die jeweiligen Geschwindigkeiten vier mal in den jeweiligen Abstand zum Vorhaltepunkt. Dieser Punkt wird also von der Maus und dem Projektil in vier Frames erreicht.

Ich habe mein Programm in Python geschrieben und es funktioniert gut. ABER nicht perfekt und das liegt daran:

-Die unendlich vielen Punkte der geraden können nicht alle durchgecheckt werden also lasse ich in meinem Programm insgesamt rund 100 Pixel vor der Maus kontrollieren. Deswegen schießt das Geschütz nicht immer sondern bleibt einfach stehen, wenn die Werte nicht genau übereinstimmen. Erst nach einer erneuten Bewegung der Maus findet das Geschütz wieder einen Punkt an den geschossen werden soll.

-Zwischen den einzelnen kontrollierten Punkten der Geraden könnten weitere passende Vorzielpunkte liegen, die aber übersprungen werden, da mein Check-Algorithmus nicht sehr viele Stellen nach dem Komma beachtet sondern immer eine Pixel-Einheit weiter springt.

-Das ganze Ding ist eine ungenaue Kiste, da ich kein Matheprofessor bin.

Insgesamt ist das Programm aber sehr gut gelungen und ich bin sehr zufrieden damit, denn es macht genau das was es soll: Treffen! Die meiste Zeit trifft es die Maus wirklich!
Man kann dann z.B. noch kleine Spielereien hinzufügen wie einen Lebensbalken der Maus oder die Munition des Turms begrenzen.

So sieht mein Endresultat aus:

preview

Oben ist ein Lebensbalken für die Leben des Spielers. Die Maus ist ein Ufo und in der Mitte ein einfach angedeuteter Geschützturm, der sich passend ausrichtet und dreht.

Das könnte interessant sein Powered by AdWol Online Werbung

[#WLANHACKDING] Also, mechanisch gesehen…

Immerhin. Vom mechanischen her gesehen ist das WLAN-Hack-Ding fertig. Trotz der immerwiederwährende...

[#WLANHACKDING] Auspacken! Anschließen!

Es ist da, es ist da, es ist dadadadada! Mein Packet mit den Grundteilen des WLAN-Hack-Ding ist soeb...

[#WLANHACKDING] – Wieland baut ein Kali Tablet

Ich habe natürlich mal wieder viel zu viel Geld übrig, weswegen ich mich jetzt mal an den Bau eine...