KWEngine, Teil 20: 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.
public class Player : GameObject
{
    public override void Act(KeyboardState ks, MouseState ms)
    {
        if(ks.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(KeyboardState ks, MouseState ms)
    {
        // Wenn das PowerUp noch kein Elternobjekt hat...
        if(_parent == null)
        {
            // ...prüft es, ob es mit einem potenziellen Elternobjekt
            // kollidiert und wenn ja, nimmt es dieses als Elternobjekt an:
            Intersection i = GetIntersection();
            if(i != null && i.Object is Player)
            {
                // Objekt in i.Object auf die Klasse Player 'casten':
                Player p = (Player)i.Object;

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

Schreibe einen Kommentar

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