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