Game Engine Math

KWEngine, Teil 19: Eltern-Kind-Beziehungen

In Spielszenen haben Objekte oft Beziehungen zueinander:

  • Ein Objekt kreist um ein anderes Objekt,
  • eine Spielfigur steht auf einer Plattform und bewegt sich mit ihr durch die Welt oder
  • eine gegnerische Spielfigur verfolgt ein bestimmtes Objekt.

Im folgenden Beispiel bewegt sich die Spielfigur bei Betätigung der A-Taste jeden Frame um 0.01 Einheiten auf der x-Achse nach links. Ein Objekt der Klasse PowerUp existiert ebenfalls in der Welt und hat anfangs keinen „Besitzer“. Es wartet also darauf, eingesammelt zu werden.

Die Player-Klasse ist somit für dieses Beispiel uninteressant. Der wichtige Inhalt ist in der PowerUp-Klasse zu finden.

public class Player : GameObject
{
    public override void Act()
    {
        if(Keyboard.IsKeyDown(Keys.A))
        {
            MoveOffset(-0.01f, 0f, 0f);
        }
    }
}
public class PowerUp: GameObject
{
    // Das Feld _parent merkt sich, ob das PowerUp ein Elternobjekt hat
    // (zu Beginn nicht, so dass der Startwert 'null' ist).
    private Player _parent = null;     

    public override void Act()
    {
        // Wenn das PowerUp noch kein Elternobjekt hat...
        if(_parent == null)
        {
            // ...prüft es, ob es mit einem Player-Objekt
            // kollidiert und wenn ja, nimmt es dieses als Elternobjekt an:
            Intersection i = GetIntersection<Player>();
            if(i != null)
            {
                // Objekt in i.Object auf die Klasse Player 'casten':
                Player p = i.Object as Player;

                // Das Kollisionsobjekt wird jetzt im Feld 
                // '_parent' gespeichert:
                _parent = p;
            }
        }
        else
        {
            // Wenn das Feld '_parent' nicht leer ist, dann hat das PowerUp
            // bereits ein Elterobjekt und folgt diesem jetzt 
            // (mit leichtem Versatz auf der Y-Achse):
            Vector3 parentPosition = _parent.Position;
            parentPosition.Y = parentPosition.Y + 3;

            // Aktualisierung der PowerUp-Position gemäß der Elternposition:
            SetPosition(parentPosition);
        }
    }
}

Es kann übrigens auch genau in die andere Richtung funktionieren:
Das Elternobjekt merkt sich, ob es ein Kindobjekt hat und versetzt dieses gemäß der eigenen Bewegungen. Es bleibt also dem Programmierer überlassen, wie die Beziehung genau umgesetzt wird.

Wichtig ist:

  • Beide Objekte (Elternteil und Kind) sind eigenständige GameObject-Instanzen, die auch ohne eine gegenseitige Beziehung in der Spielwelt funktionieren.

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.