Wenn wir an ein gemeinsames Spiel denken, spielt es keine Rolle, welche Art von Spiel wir spielen. Es ist sehr wahrscheinlich, dass wir einen Kameratyp benötigen. Zum Beispiel:
- Debug-Kamera: Mit Tastatur und Maus gesteuert, können wir uns an jedem Ort unserer Szene bewegen.
- Skriptkamera: Damit können wir die Kamera anweisen, sich auf einem bestimmten Pfad zu bewegen.
- Player Kamera.
- ...
Jeder dieser Kameratypen verfügt über eine eigene Aktualisierungsfunktion. Das einfachste (und schlechteste) System besteht darin, eine Kameramanager-Klasse mit einer allgemeinen Aktualisierungsfunktion und speziellen Aktualisierungsfunktionen für jeden Kameratyp zu haben. Innerhalb der generischen Aktualisierungsfunktion haben wir eine switch-Anweisung, die basierend auf dem Kameratyp die richtige Aktualisierungsfunktion aufruft.
Stattdessen habe ich mir einen anderen Ansatz überlegt: das Strategiemuster. Wir verschieben jedes Kameraverhalten (Aktualisierungsmethode) in eine geeignete Klasse, die eine gemeinsame Schnittstelle implementiert. Im Kameramanager haben wir ein Mitglied für diese Benutzeroberfläche, und wir können jedes gewünschte Verhalten dynamisch festlegen.
Was denkst du darüber? Welche anderen Systeme schlagen Sie mir vor? Vielen Dank.
Zusätzliche Infos: Es besteht die reale Möglichkeit, dass ich mehr als eine Kamera aktiv brauche, zum Beispiel für Reflexionen. Kurz gesagt, ich muss auch das berücksichtigen.
quelle
Antworten:
Die Strategiemuster scheinen mir eine gute Wette zu sein. Um noch einen Schritt weiter zu gehen, sollte Ihr Kameramanager die konkreten Kameratypen nicht kennen. Sie würden Kameraimplementierungen extern anhand der ID registrieren und ändern (ich habe aus Gründen der Flexibilität eine Zeichenfolge verwendet, könnte aber auch eine Aufzählung oder eine Int sein) (ohne Fehlerprüfung):
Bearbeiten
Das ist trivial hinzuzufügen. Wechseln Sie einfach
currentCamera
zu:Wechseln Sie
SetCamera
zu ToggleCamera (oder fügen Sie SetCamera Ihrer Wahl einen Booleschen Wert hinzu):Und ändern Sie die
Update
Methode, um alle aktiven Kameras anstatt nur der aktuellen zu aktualisieren:In meinem Beispiel müssten Sie die
View
Eigenschaft auch durch eineGetView
Methode ersetzen, die die ID der Kamera als Parameter verwendet. Aber das ist ein Detail, das sowieso von Ihrer Kameraoberfläche abhängt:quelle