Game Engine Math

KWEngine, Teil 13: HUD-Objekte hinzufügen

Im Gegensatz zu GameObject-Instanzen werden HUD-Objekte in 2D platziert, so dass sie sich an den tatsächlichen Pixelkoordinaten des Monitors orientieren.
HUD-Objekte können Instanzen der folgenden Klassen sein:

  • HUDObjectImage oder
  • HUDObjectText

Sie werden idealerweise in den Prepare()-Methoden Ihrer World-Klassen hinzugefügt.

Beispiel 1: Text platzieren

public class GameWorld : World
{
    public override void Act()
    {
        HUDObjectText h = GetHUDObjectTextByName("MyHUDObject");
        
        // Wenn ein Objekt dieses Typs und dieses Namens gefunden werden
        // konnte, ist die Variable h nicht 'leer', also 'nicht null':
        if(h != null)
        {
            if(h.IsMouseCursorOnMe() == true)
            {
                h.SetColorEmissiveIntensity(1.5f);   
            }
            else
            {
                h.SetColorEmissiveIntensity(0.0f);
            }
        }
    }

    public override void Prepare()
    {
        // Platziere ein textbasiertes HUD-Objekt:
        HUDObjectText h = new HUDObjectText("Hello World!");
        h.SetPosition(64, 32);                // 64 Pixel von links und 
                                              // 32 Pixel von oben auf dem Bildschirm 
        h.Name = "MyHUDObject";               // Interner Name des Objekts, damit es später 
                                              // von anderen Objekten gefunden werden kann
        h.SetCharacterDistanceFactor(1.0f);   // Abstandsmultiplikator (der Buchstaben zueinander)
        h.SetColor(1.0f, 0.0f, 0.0f);         // Reguläre Färbung (hier: rot)
        h.SetColorEmissive(1.0f, 1.0f, 1.0f); // Glühfarbe (RGB), die Intensität wird separat geregelt
        
        AddHUDObject(h);
    }
}

Im obigen Beispiel wird ein HUDObjectText in der Variable h angelegt und mit einem anzuzeigenden Text belegt.
Anschließend wird es der aktuellen World hinzugefügt.

In der Act()-Methode wird dann mittels GetHUDObjectTextByName() nach einem HUDObjectText-Objekt dieses Namens gesucht und geprüft, ob sich der Mauszeiger gerade über dem Objekt befindet. Wenn ja, fängt das Objekt an zu glühen.

Beispiel 2: Ein Bild platzieren

public class GameWorld : World
{
    public override void Act()
    {
        HUDObjectImage h = GetHUDObjectImageByName("MyHUDObject");
        if(h != null)
        {
            if(h.IsMouseCursorOnMe() == true)
            {
                h.SetColorEmissiveIntensity(1.5f);   
            }
            else
            {
                h.SetColorEmissiveIntensity(0.0f);
            }
        }
    }

    public override void Prepare()
    {
        // Platziere ein bildbasiertes HUD-Objekt:
        HUDObject h = new HUDObjectImage("./textureFolder/myTexture.jpg");
        h.SetPosition(64f, 64f);               // Position in Pixeln (von links oben des Bildschirms aus gesehen)
        h.Name = "MyHUDObject";                // Interner Name des Objekts
        h.SetScale(128f, 128f);                // Skalierung des Bildes
        h.SetColorEmissive(1.0f, 1.0f, 1.0f);  // Glühfarbe (RGB), die Intensität wird separat geregelt

        AddHUDObject(h);
    }
}

Das Verfahren ist ähnlich zum Typ HUDObjectText, nur dass hier die Klasse HUDObjectImage verwendet wird.

Achtung:

Wenn ein neues Bild (z.B. eine JPG-Datei) dem Projekt hinzugefügt wird, muss man in den Dateieigenschaften (Rechtsklick auf die Datei im Projektmappen-Explorer gefolgt von der Auswahl des Menüpunkts „Eigenschaften“) einstellen, dass die Datei in das Ausgabeverzeichnis kopiert wird (Wert: „kopieren, wenn neuer“). Andernfalls wird die Bilddatei nicht von der Engine gefunden.


Wie finden andere Klassen (z.B. Enemy) ein HUDObject, um es anzupassen?

public class Player : GameObject
{
    public override void Act()
    {
        HUDObjectText h = CurrentWorld.GetHUDObjectTextByName("the name you're looking for..");
        if(h != null)
        {
            // Hier können h jetzt Befehle erteilt werden...
        }
    }
}

Beitrag veröffentlicht

in

von

Kommentare

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.