Je gagne de l'argent en C # Généralement dans ce langage, j'aime tout découpler vers le ciel en utilisant des interfaces. Cela m'a bien servi dans le code d'entreprise, mais en écrivant des jeux en C #, je me retrouve à tendre vers l'héritage car je peux définir certains comportements par défaut pour les classes de base. Je me sens sale en faisant cela, comme si je désobéissais à un dieu de l'architecture qui a dit un jour "privilégiez la composition à l'héritage". Je sais que ce n'est pas noir et blanc, mais j'ai également l'impression que je pourrais utiliser des interfaces avec un peu plus de travail et réaliser à peu près la même chose.
Que font les autres gens? L'héritage est-il la bonne approche pour les jeux ou dois-je refactoriser certaines interfaces?
la source
Réponses:
L'héritage dans les jeux est en fait l'une des pires choses que vous puissiez faire - en particulier en ce qui concerne les entités. Lisez ceci pour savoir pourquoi. La composition sur l'héritage vous emmène loin avec les jeux. Quant aux autres domaines de votre moteur, cela n'a pas vraiment d'importance. Supposons par exemple que vous appelez une sorte de service réseau externe, puis vous pouvez hériter d'un type de service générique, par exemple. HTTPService et SocketService - tout comme dans les applications d'entreprise auxquelles vous êtes habitué.
À moins que votre jeu est vraiment simple, vous aurez à utiliser une architecture d'entité à base de composants (CBE). L'idée générale est qu'avec les entités, la raison pour laquelle elles sont si couramment composées plutôt qu'héritées est parce que vous ne pouvez pas savoir avant l'exécution quelles capacités une entité donnée aura.. Par exemple, prenez le vaisseau du joueur dans un jeu de tir spatial. Vous ne savez pas jusqu'à quel moment du jeu, quelles armes, armures, systèmes (c'est-à-dire les composants) que le joueur va ramasser, acheter, vendre, perdre, avoir détruits, etc. Donc, la seule façon réaliste de modéliser cela est par la composition d'objets. Le côté positif de ce scénario est que vous pouvez également avoir des ennemis entièrement personnalisables, construits de la même manière, plutôt que des ennemis qui sont toujours exactement les mêmes chaque fois que vous voyez ce type d'ennemi. Donc, avec les CBE, vous pourriez voir un Martian Freighter et penser: "Ah, il n'a que de minuscules lasers, je vais le retirer", et généralement ce serait vrai, mais quand vous arrivez à portée, vous vous rendez compte qu'il a un gros cul pistolet trou de ver. Surprise Surprise!
La mise en composants supprime le couplage implicite de la logique, et c'est bien.
la source
Pour ceux qui parlent allemand, un livre intéressant: http://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Implementierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr=8-1
Regardez de plus près quand et pourquoi utiliser quelle architecture peut être trouvée ici: /programming/1901251/component-based-game-engine-design
Pour moi, je décide de mon architecture en fonction de la taille du projet et de la possibilité d'étendre ou de réutiliser le code. Pourquoi investir des heures et des heures dans l'architecture d'un micro-projet où il n'y a aucune chance que vous utilisiez à nouveau le code? Dans le même temps, vous pouvez terminer le projet.
Composition vs composants Les composants sont des trucs fantaisistes mais dans la plupart des projets / architectures, la composition fera aussi l'affaire (sans surcharge basée sur les composants). Cela dépend de ce que votre système de composants peut fournir que la composition ne peut pas.
tout cela était possible sans composants il y a longtemps aussi
la source