Fall #1: Blickt eine Spielfigur direkt auf ein Objekt?

Mit der Methode IsLookingAt()
kann eine Spielfigur prüfen, ob ihr Look-At-Vector (kurz: LAV) durch die (für den Test kugelförmige) Hitbox einer anderen Spielfigur verläuft:
public class Player : GameObject { public override void Act() { // Angenommen, die Spielfigur sucht den Gegner "Hans": Enemy e = CurrentWorld.GetGameObjectByName<Enemy>("Hans"); bool result = IsLookingAt( e.Center, // Mittelpunkt von Hans 1.5f); // Durchmesser der Testkugel if(result == true) { // Spielfigur blickt auf das Enemy-Objekt } } }
Fall #2: Befindet sich ein Gegner im Sichtfeld?

Um den Winkel auszurechnen benötigt man folgende Formel:

public class Player : GameObject { public override void Act(KeyboardState ks, MouseState ms) { // Und wieder einmal "Hans": Enemy e = CurrentWorld.GetGameObjectByName<Enemy>("Hans"); // Luftlinie zwischen Spielfigur und Hans berechnen: Vector3 luftlinie = e.Center - this.Center; // Look-At-Vektor der Spielfigur: Vector3 lav = this.LookAtVector; // Math.Acos() berechnet den Arcuscosinus im Bogenmass statt in Grad: double winkelImBogenmass = Math.Acos( Vector3.Dot(lav, luftlinie) / (lav.Length * luftlinie.Length) ); // Deshalb müssen wir hier noch in Grad umrechnen: double winkelInGrad = MathHelper.RadiansToDegrees(winkelImBogenMass); if(winkelInGrad >= -50 && winkelInGrad <= 50) { // Gegner befindet sich im 100° Sichtfeld der Spielfigur } } }
Schreibe einen Kommentar