Ich verdiene mein Geld in C # Im Allgemeinen entkopple ich in dieser Sprache gerne alles mit Hilfe von Schnittstellen an den Himmel. Dies hat mir im Enterprise-Code gute Dienste geleistet, aber beim Schreiben von Spielen in C # tendiere ich zur Vererbung, da ich einige Standardverhaltensweisen für Basisklassen definieren kann. Ich fühle mich dabei allerdings dreckig, als würde ich einem Architekturgott nicht gehorchen, der einmal sagte "Komposition gegenüber Vererbung bevorzugen". Ich weiß, dass es nicht schwarz-weiß ist, aber ich habe auch das Gefühl, dass ich Schnittstellen mit ein bisschen mehr Arbeit verwenden und ungefähr das Gleiche erreichen könnte.
Was machen andere Leute? Ist die Vererbung der richtige Ansatz für Spiele oder sollte ich einige Schnittstellen überarbeiten?
quelle
Antworten:
Vererbung in Spielen ist tatsächlich eines der schlimmsten Dinge, die Sie tun können - insbesondere in Bezug auf Entitäten. Lesen Sie hier, warum. Komposition über Vererbung bringt Sie mit Spielen weit. Wie für andere Bereiche Ihres Motors, ist es nicht wirklich wichtig. Angenommen, Sie rufen einen externen Netzwerkdienst an und erben dann einen generischen Diensttyp an z. HTTPService und SocketService - ähnlich wie in den gewohnten Unternehmensanwendungen.
Es sei denn , Ihr Spiel ist wirklich einfach, Sie werden wollen eine komponentenbasierte Einheit (CBE) Architektur verwenden. Die allgemeine Idee ist, dass bei Entitäten der Grund dafür, dass sie so häufig zusammengesetzt und nicht geerbt werden, darin besteht, dass Sie erst zur Laufzeit wissen können, über welche Funktionen eine bestimmte Entität verfügt. Nehmen Sie zum Beispiel das Schiff des Spielers in einem Weltraum-Shooter. Bis zu einem bestimmten Zeitpunkt im Spiel wissen Sie nicht, welche Waffen, Rüstungen, Systeme (dh Komponenten) der Spieler aufnehmen, kaufen, verkaufen, verlieren, zerstören usw. wird. Der einzig realistische Weg, dies zu modellieren, ist durch Objektzusammensetzung. Das Plus in diesem Szenario ist, dass Sie auch vollständig anpassbare Feinde haben können, die auf die gleiche Weise aufgebaut sind, anstatt Feinde, die jedes Mal, wenn Sie diesen Feindtyp sehen, exakt gleich sind. Mit CBEs sehen Sie vielleicht einen Marsfrachter und denken: "Ah, es hat nur winzige Laser, ich mache es kaputt." Normalerweise ist das der Fall, aber wenn Sie plötzlich in Reichweite kommen, stellen Sie fest, dass es einen großen Hintern hat Wurmlochgewehr. Überraschung Überraschung!
Die Komponentisierung hebt die implizite Verknüpfung von Logik auf, und das ist GUT.
quelle
Für diejenigen, die Deutsch sprechen, ein interessantes Buch: http://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Implementierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr=8-1
Hier erfahren Sie, wann und warum Sie welche Architektur verwenden: /programming/1901251/component-based-game-engine-design
Für mich selbst entscheide ich meine Architektur in Abhängigkeit von der Größe des Projekts und der Möglichkeit, den Code zu erweitern oder wiederzuverwenden. Warum stundenlang in die Architektur eines Mikroprojekts investieren, bei dem es unwahrscheinlich ist, dass Sie den Code erneut verwenden? In der gleichen Zeit können Sie das Projekt fertig haben.
Komposition gegen Komponenten Komponenten sind coole, ausgefallene Dinge, aber in den meisten Projekten / Architekturen erledigt Komposition diese Dinge auch (ohne komponentenbasierten Overhead). Es kommt darauf an, was Ihr Komponentensystem für eine Komposition bietet, die es nicht kann.
all das war schon lange ohne komponenten möglich
quelle