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.

Schreibe einen Kommentar