Ich gebe zu, ich habe die Sünde gemacht, das Erbe zu überbeanspruchen und sogar zu missbrauchen. Das erste (Text-) Spielprojekt, das ich gemacht habe, als ich meinen OOP-Kurs absolvierte, ging bis zu "verschlossene Tür" und "entriegelte Tür" von "Tür" und "Raum mit einer Tür", "Raum mit zwei Türen" und so weiter von "Zimmer".
Mit dem (grafischen) Spiel, an dem ich kürzlich gearbeitet habe, dachte ich, ich hätte meine Lektion gelernt und die Verwendung von Vererbung begrenzt. Ich bemerkte jedoch, dass die Probleme bald auftauchten. Meine Wurzelklasse begann sich immer mehr aufzublähen, und meine Blattklassen waren voller doppelter Codes.
Ich dachte, ich mache immer noch etwas falsch und als ich online nachschaute, stellte ich fest, dass ich nicht der einzige mit diesem Problem war. So habe ich nach gründlichen Recherchen Entity-Systeme entdeckt (siehe: googlefu)
Als ich anfing, es zu lesen, konnte ich sehen, wie deutlich es die Probleme lösen konnte, die ich mit der traditionellen OOP-Hierarchie mit Komponenten hatte. Dies waren jedoch in den ersten Lesungen. Als ich auf weitere… „radikale“ ES-Ansätze stieß, wie den bei T-machine .
Ich begann mit den Methoden, die sie verwendeten, nicht einverstanden zu sein. Ein reines Komponentensystem schien entweder übertrieben oder eher nicht intuitiv zu sein, was wahrscheinlich die Stärke von OOP ist. Der Autor geht so weit zu sagen, dass das ES-System das Gegenteil von OOP ist, und obwohl es möglicherweise zusammen mit OOP verwendet werden kann, sollte es dies wirklich nicht tun. Ich sage nicht, dass es falsch ist, aber ich hatte einfach keine Lust auf eine Lösung, die ich gerne implementieren würde.
Für mich und um die Probleme zu lösen, die ich zu Beginn des Beitrages hatte, ohne gegen meine Intuition zu verstoßen, ist es dennoch, eine Hierarchie zu verwenden, die jedoch keine monolithische Hierarchie wie die zuvor verwendeten ist, sondern ein polylithischer (ich konnte kein Wort im Gegensatz zu monolithischen finden), der aus mehreren, kleineren Bäumen besteht.
Das folgende Beispiel zeigt, was ich meine (dies ist inspiriert von einem Beispiel, das ich in Game Engine Architecture, Kapitel 14, gefunden habe).
Ich hätte einen kleinen Baum für Fahrzeuge. Die Wurzelfahrzeugklasse würde eine Renderkomponente, eine Kollisionskomponente, eine Positionskomponente usw. aufweisen.
Dann würde ein Panzer, eine Unterklasse von Fahrzeugen, diese Komponenten erben und eine eigene "Kanonenkomponente" erhalten.
Gleiches gilt für die Charaktere. Ein Charakter hätte seine eigenen Komponenten, dann würde die Spielerklasse ihn erben und einen Input-Controller erhalten, während andere feindliche Klassen von der Charakterklasse erben und einen AI-Controller erhalten würden.
Ich sehe keine wirklichen Probleme mit diesem Design. Obwohl kein reines Entity Controller-System verwendet wird, wird das Problem mit dem Sprudeleffekt und der großen Stammklasse durch die Verwendung einer Mehrbaumhierarchie gelöst, und das Problem der schweren, Code duplizierenden Blätter ist weg, da die Blätter dies nicht tun Ich habe jeden Code am Anfang, nur Komponenten. Wenn eine Änderung an der Blattebene vorgenommen werden muss, ist dies so einfach wie das Ändern einer einzelnen Komponente, anstatt den Code überall einzufügen.
Da ich so unerfahren wie ich bin, sah ich natürlich keine Probleme, als ich anfing, das vererbungslastige Modell mit einer einzelnen Hierarchie zu verwenden. Wenn es also Probleme mit dem Modell gibt, an dessen Implementierung ich gerade denke, würde ich das nicht tun in der Lage sein, es zu sehen.
Deine meinungen?
PS: Ich verwende Java, daher ist die Verwendung von Mehrfachvererbung zur Implementierung dieser Funktion anstelle von normalen Komponenten nicht möglich.
PPS: Die Kommunikation zwischen Komponenten erfolgt durch Verknüpfung abhängiger Komponenten. Dies wird zu einer Kopplung führen, aber ich denke, es ist ein guter Kompromiss.