Leider ist es nicht ganz so einfach wie Kaat es beschrieben hat (aber trotzdem einfacher als der Text lang ist. Es ist nur schwer zu beschreiben ^^°). Würde man eine solche Verschachtelung der Forks baun:
würde der NPC nur dann nach oben, bzw. unten schauen, wenn der Held genau auf einer vertikalen Linie mit ihm sehen würde. An sonsten gilt ja, dass die X-Differenz != 0 ist. Damit schaut er entweder nach links oder nach rechts.
Um das zu vermeiden muss man eine etwas kompliziertere Methode wählen.
Dazu sollte man sich erst einmal im klaren sein, wann der NPC dem Helden wie hinterherschaut. Denn schließlich kann der Held auch schräg über ihm stehen.
Logischerweise legt man dazu eine art X (man könnte es auch Kreuz nennen) auf den NPC (hier in Form von Rasen verdeutlicht):
Natürlich haben wir im Projekt selbst keinen Rasen zur markieren. Das dient nur als Denk- und Erklärstütze
So, solange der Held nun im linken "Dreieck" ist (die Dreiecke werden jeweils von zwei Rasendiagonalen und dem Bildschirmrand gebildet), soll der NPC nach links schauen. Ist der Held im oberen, nach oben, etc.
Nun müssen wir also eine Prozedur entwickeln, mit der wir feststellen, wann der Held in welchem Dreieck ist.
Dazu betrachten wir am besten die X- und Y-Differenz Variablen.
Wie die errechnet werden wurde ja schon erklärt:
Nun zum eigentlichen Code, welcher den NPC dreht:
Hierbei verwende ich mehrfach die Events "Differenz" und "Betrag". Diese kannst du als Seiten im Event einbauen oder als CEs benutzen, aber auch gleich in den Code integrieren. Ich hab das einfach ausgelagert, um es übersichtlicher werden zu lassen. Beide haben nur recht kurzen Code:
Sooo, damit wärst du dann auch schon fertig.
Was haben wir da oben jetzt aber genau gemacht?
Dazu müssen wir zuerst wissen welche Koordinaten der Rasen hat. Da wir aber nicht davon ausgehen, dass der NPC statisch ist, müssen wir uns ein System ausdenken, bei dem wir das gedachte Rasenkreuz mitwandern lassen können. Dazu brauchen wir eine Formel zum errechnen der Koordinaten der einzelnen Rasenfelder. Diese ist bestechend einfach:
Wenn die Differenz von NPC zum Feld in X-Richtung gleich der Differenz von NPC zum Feld in Y-Richtung ist, dann wäre dies ein Rasenstück.
Ein Beispiel:
Der NPC steht auf (5|8), wir wollen die Felder (7|10) und (9|12) kontrollieren.
(7|10) - (5|8) = (3|2)
3 != 2 -> Kein Rasenstück
(9|12) - (7|10) = (2|2)
2 = 2 -> Rasenstück
Damit wissen wir, wie wir die Dreiecke bilden können. Und genau das mache ich auch im Code.
Dazu frage ich erst einmal ab, wie der Held überhaupt zum NPC steht.
Steht der Held links vom NPC muss ich also prüfen ob seine Y-Differenz nicht größer ist als die X-Differenz. Wäre dem so, würde er außerhalb des Dreiecks stehen. Damit ich nicht viel mit Forks rumhantieren muss, bilde ich einfach den Betrag beider Differenzen und frage, ob Y-Differenz <= X-Differenz ist. Wenn ja steht der Held im Dreieck. Dementsprechend muss sich der NPC zu ihm (nach links) drehen. Der Rest des Codes kann dann übersprungen werden ("Goto !Lable 1!").
Sollte der Held nun aber nicht im Dreieck gestanden haben, wird die andere Seite überprüft (allerdings nur wenn der Held auch rechts vom NPC steht). Dort kann (wieder durch den Betrag) das selbe Verfahren angewandt werden.
Ist der Held auch in diesem Dreieck nicht aufzufinden muss er also entweder im Dreieck über oder unter dem NPC stehen. Daher muss ich jetzt nur noch abfragen ob die Y-Koordinate des NPC größer oder kleiner ist als die des Helden. Je nachdem wird dann der NPC gedreht.
Fertig