KWEngine, Teil 21: Sichtbereiche von Objekten

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

Beispiel: Look-At-Vector schneidet gegnerische Hitbox

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(KeyboardState ks, MouseState ms)
    {
        // Angenommen, die Spielfigur sucht den Gegner "Hans":
        Enemy e = CurrentWorld.GetGameObjectByName<Enemy>("Hans");
        bool result = IsLookingAt(
            e.GetCenterPointForAllHitboxes(), // 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?

Ist der Winkel (rot) zwischen LAV (blau) und der Luftlinie zwischen Spielfigur und Gegner (grün) klein genug, befindet sich der Gegner in deren 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.GetCenterPointForAllHitboxes() - this.GetCenterPointForAllHitboxes();

        // Look-At-Vektor der Spielfigur:
        Vector3 lav = this.GetLookAtVector();

        // 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert