Le Calendrier de Linkvent, le Jour 3 : MVC avec Cocos2D

Le 3 décembre 2010, dans Cocos2D Linkvent le Calendrier, par Steffen Itterheim by Steffen Itterheim

Le lien d'aujourd'hui est du contrôleur de la Vue modèle (MVC) le dessin de design et comment l'exécuter dans Cocos2D. Bartek Wilczyński de la Pologne a écrit une classe de travaux dirigés de deux parties de comment exécuter ce dessin de design et explique pourquoi c'est un bon choix de design :

Comment exécuter le dessin MVC dans le jeu Cocos2D – la Partie 1
Comment exécuter le dessin MVC dans le jeu Cocos2D – la Partie 2

Pendant que je lisais que, je me suis souvenu que Jeremy Flores avait créé un dépôt github avec sa mise en oeuvre d'un dessin MVC dans Cocos2D. Il a doublé son projet Cocos2D-MNC, comme dans le contrôleur du Noeud modèle. Le code est publié selon la licence de MIT. The code is published under the MIT license.

Le dessin MVC est un peu semblable au système composant d'objet d'un jeu que j'ai décrit ici. Pour les deux systèmes, l'idée générale n'est pas de sousclasser CCSprite et installer votre logique de jeu là. CCSprite est déjà une classe de représentation visuelle complète pour votre joueur, ennemi et que non. Mais dans certains cas, vous avez besoin de plus qu'un lutin, ou une combinaison d'effets de particule et d'un lutin. Dès que vous arrivez là, il est beaucoup mieux d'avoir un CCNode contenant (agrégeant) tous les éléments visuels de votre objet de jeu, en manipulant toute la logique de jeu de cet objet et en actualisant les éléments visuels. Le CCNode devient le contrôleur, en contrôlant les vues. Comme les vues (les lutins, les effets, les dessins de GL, etc.) le mouvement en écran, le noeud de contrôleur interroge les noeuds visuels pour les renseignements publics et dirige le code de logique de jeu, qui peut actualiser à tour de rôle les vues. CCSprite already is a complete visual representation class for your player, enemy, and what not. But in some cases, you need more than one sprite, or a combination of a sprite and particle effects. Once you get there, it’s much better to have a CCNode containing (aggregating) all the visual elements of your game object, while handling all the game logic of that object and updating the visual elements. The CCNode becomes the controller, controlling the views. As the views (sprites, effects, GL drawings, etc.) move on screen, the controller node polls the visual nodes for state information and runs the game logic code, which in turn may update the views.

Dans les termes très simples, c'est mon approche pragmatique du dessin MVC qui travaille aussi tout à fait bien. C'est sans aucun doute déjà un grand saut en avant comparé au fait de sousclasser abondamment la classe CCSprite. Si vous remarquez que vous le faites beaucoup, vous devriez vous faire une faveur et lire en haut sur le dessin de design de MVC. If you notice that you’re doing that a lot, you should do yourself a favor and read up on the MVC design pattern.

Ajoutez votre lien vers le Cocos2D Linkvent le Calendrier

Avez-vous quelque chose pour partager avec la communauté Cocos2D ? Je n'ai pas reçu assez de soumissions pour remplir tous les jours jusqu'au Noël, bien que j'aie vraiment assez de liens pour poster celui chaque jour, je posterais un lien sur votre site Internet ou poste de blog.

Cocos2D Xcode le Projet sur Github

Le 4 novembre 2010, dans cocos2d, outils, Xcode, par Steffen Itterheim by Steffen Itterheim

Mon Cocos2D Xcode le projet est maintenant sur Github. La source ouverte, libre, correctement MIT Agréé, inclut le rootViewController et soutient Cocos2D v0.99.5 rc0.

Je continue à travailler aussi (avec) une version très améliorée du projet de Xcode. Il intègre de la cire (Lua) et un Système de Composante d'Objet de Jeu que j'ai appelé “gocos”. Vient aussi avec les classes d'avantage beaucoup plus utiles. Also comes with a lot more useful convenience classes.

Mais la grande idée est en fait de téléverser (ou le lien dans github, si je peux trouver si et comment cela travaille) tous les projets dépendants dans un dépôt, pour que vous puissiez télécharger tout immédiatement et il travaille de la boîte. Actuellement il y a 3 projets référés par le cocos2d-projet : gocos (l'appelons une bibliothèque d'avantage et de gameplay détermine le code de Cocos2D), la cire (le soutien de Lua) et évidemment le cocos2d-I-Phone. Donc tout c'est nécessaire va être empaqueté dans un grand paquet, quels vides toute l'incompatibilité de version publie. gocos (let’s call it a library of convenience and gameplay code for Cocos2D), wax (Lua support) and obviously cocos2d-iphone. So everything that’s needed is going to be bundled in one big package, which voids all of the version incompatibility issues.

Vous pouvez faire des expériences encore avec de différentes versions de ces bibliothèques mais dans ce cas je crois que vous savez ce que vous faites et cela s'écoule doivent être attendus. Mais étant un dépôt github, vous pouvez cloner évidemment et commettre des changements.

Apéritif

Voici ce que j'ai fait avec Lua. Je l'utilise actuellement seulement comme un meilleur remplacement plist pour les cadres. C'est mieux que plist parce que vous pouvez faire des observations sur chaque article, vous pouvez les classer facilement, vous pouvez diriger des fonctions et des algorithmes pour produire des valeurs ou charger des données supplémentaires et en général il est beaucoup plus facile de travailler avec que le rédacteur plist. Voici config.lua réduit qui est chargé à la durée d'exécution dans une hiérarchie d'objets de NSDictionary : It’s better than plist because you can comment on each item, you can sort them easily, you can run functions and algorithms to generate values or load additional data, and in general it’s a lot easier to work with than the plist editor. Here’s a reduced config.lua that is loaded at runtime into a hierarchy of NSDictionary objects:

config local =
{
  AccelerometerControls =
  {
    UpdatesPerSecond = 60, - 60 Hz -- 60 Hz
    La sensibilité = 0.997,
    SensitivityX =-2,,
    SensitivityY = 2,
    MaxVelocity = 100,
  },
}

rendez config

Et cette ligne de code charge ces valeurs et les assigne aux propriétés par conséquent appelées de la classe prévue :

[Config loadPropertiesFromKeyPath:@ "AccelerometerControls" target:self];"AccelerometerControls" target:self];

C'est tout ce que vous avez besoin de faire pour transférer les valeurs de config.lua dans un cas de classe. Énorme timesaver! Le seul désavantage consiste en ce qu'il ne peut pas faire la différence actuellement entre le flotteur, l'intervalle et bool (en raison de NSNumber), donc il soutient actuellement seulement des propriétés de flotteur. The only drawback is that it currently can’t differentiate between float, int and bool (due to NSNumber), so it currently only supports float properties.

Livre de cocos2d, le Chapitre 6 : Spritesheets & Zwoptex

Le 30 juillet 2010, dans les Annonces, le livre, cocos2d, par Steffen Itterheim by Steffen Itterheim

Le chapitre 6 – Spritesheets et Zwoptex

Dans ce chapitre le foyer sera sur Spritesheets (l'Atlas de Texture), ce qu'ils sont et quand, où et pourquoi les utiliser. Évidemment un chapitre de Spritesheets ne serait pas complet sans introduire l'outil Zwoptex. Les graphiques ajoutées dans ce chapitre seront alors utilisées pour le jeu créé dans le chapitre suivant. The graphics added in this chapter will then be used for the game created in the following chapter.

Le chapitre sera soumis vendredi, le 6 août.

N'importe quoi de Spritesheets vous vouliez toujours savoir ?

Faites-moi savoir juste. J'explorerai quelle sorte de gens d'éditions étaient et ont concernant Spritesheets. Je veux m'assurer qu'ils sont tous couverts dans le livre. I want to make sure that they are all covered in the book.

Quittez s'il vous plaît un commentaire ou écrivez-moi un courrier électronique.

Le résumé du fait de travailler sur le Chapitre 5 – les Éléments de construction de Jeu

J'ai trouvé finalement un meilleur titre pour le chapitre. Une grande partie s'agit de travailler avec les Scènes et les Couches. Une classe LoadingScene est exécutée pour éviter le chevauchement de mémoire en traversant entre deux scènes. Les couches sont utilisées pour modifier les objets de jeu seperately d'UI statique. J'explique comment utiliser des dresseurs de contact visés pour manipuler la contribution de contact pour chaque couche individuelle, les contacts avalants ou non. A LoadingScene class is implemented to avoid the memory overlap when transitioning between two scenes. Layers are used to modify the game objects seperately from the static UI. I explain how to use targeted touch handlers to handle touch input for each individual layer, either swallowing touches or not.

L'édition de si à la sous-classe CCSprite ou pas est discuté et un exemple est donnée comment créer des objets de jeu en utilisant la composition et sans sousclasser de CCNode et comment cela change la contribution de contact et le fait de programmer.

À la fin la conservation a spécialisé des classes CCNode telles que CCProgressTimer, CCParallaxNode et la classe CCRibbon avec le CCMotionStreak sont donnés un traitement.

Comme vous pouvez voir des dessins, je fais aussi le progrès satisfaisant lors de la formation d'un grand artiste de pixel. Seulement j'ai une voie looooooong devant moi encore. Mais j'admets, peu je suis au courant de l'art et combien moins je l'ai pratiqué, je suis assez heureux des résultats et m'amusant avec lui. L'aspect frais de cela est que cela devrait être l'art instructif. Cela ne doit pas être bon. Donc je pars devant juste et le fais et ai tendance à être positivement surpris par les résultats. Je toucherai probablement ce sujet dans le chapitre suivant de Spritesheets : action de votre propre art. Ce n'est mieux que rien, c'est le travail toujours créateur même si cela peut être laid à d'autres et cela beaucoup plus satisfait faire tout vous-même, même s'il prend un peu plus long et ne regarde pas comme bon. Au moins c'est tout le vôtre, vous vous amusez et apprenez quelque chose le long de la voie. Et vous pouvez toujours trouver un artiste autrefois plus tard qui distillera juste vos images existantes ou qui remplace vos effets sonores de pet avec quelque chose de plus approprié. But I admit, the little I know about art and how much less I’ve practiced it, I’m pretty happy about the results and having fun with it. The cool aspect of it is that this should be instructive art. It doesn’t have to be good. So I just go ahead and do it and tend to be positively surprised by the results. I’ll probably touch this subject in the next chapter about Spritesheets: doing your own art. It’s better than nothing, it’s still creative work even if it may be ugly to others, and it’s a lot more satisfying to do everything yourself, even if it takes a bit longer and doesn’t look as good. At least it’s all yours, you’re having fun, and learn something along the way. And you can always find an artist sometime later who will just draw over your existing images or who replaces your fart sound effects with something more appropriate.

Btw, si vous cherchez un programme de manipulation d'images décent et libre pour le Mac, j'ai utilisé la Côte depuis environ une année maintenant et je suis assez heureux avec cela.

Levée de la conscience : usage de mémoire & fuites

Le 25 juillet 2010, dans cocos2d, Programmation, Parlant De l'Expérience, par Steffen Itterheim by Steffen Itterheim

En aidant d'autres à résoudre leurs éditions de projet de cocos2d pendant l'année passée il est devenu évident que beaucoup de projets ont au moins un problème important d'une de ces régions :

  • direction de mémoire
  • direction de ressource
  • structure codée

Exemples

Les éditions de direction de mémoire varient normalement d'allouer trop de mémoire, en chargeant trop de textures en haut le devant qui vont seulement être nécessaires plus tard, ou par les fuites de mémoire telles que les scènes pas deallocating en échangeant des scènes. Les problèmes de direction de ressource varient de ne pas ajouter les bonnes ressources à la bonne cible, en ayant pour résultat souvent la grandeur App augmentée parce que les ressources sont ajoutées au paquet, mais n'utilisées jamais par l'App. Cela pourrait vouloir dire aussi de charger des dossiers de ressource identiques sauf qu'ils ont de différents noms de fichier (les copies ?), en finissant la mémoire supplémentaire. Ou pas les lutins fermement faisants les valises dans les Atlas de Texture mais plutôt l'utilisation d'un Atlas de Texture par objet de jeu – pendant que c'est compréhensible d'un point de vue de seperation logique il gaspille vraiment des occasions pour l'optimisation. It could also mean loading identical resource files except that they have different filenames (copies?), using up additional memory. Or not tightly packing sprites into Texture Atlases but instead using one Texture Atlas per game object – while this is understandable from a standpoint of logical seperation it does waste opportunities for optimization.

Finalement, la structure codée ou le manque mènent de cela régulièrement à “tout dans une classe” le design codé qui est le fort probablement un processus évolutionniste, plutôt qu'intentionnel. Il est assez ordinaire de voir des classes avec des milliers de lignes de code, quelquefois même 10 000 lignes passées allant de code dans une classe. D'autres choses utilisent trop de CCLayers sans eux ajoutant un avantage clair, par exemple juste pour grouper tous les noeuds à un ordre de z spécifique ensemble ou les grouper par la fonctionnalité, eg une couche pour les ennemis, un pour les joueurs, un pour le fond, un pour UI, un pour le score, un pour les effets de particule, et cetera – sans n'importe laquelle de ces couches étant utilisées pour à ce quoi ils sont vraiment bons : le fait de modifier des noeuds multiples immédiatement, comme le mouvement, le fait d'escalader, le fait de faire tourner ou la z-recommande eux. Et évidemment il y a la copie & l'enfer de colle, les grands blocs de code reproduit dans les endroits différents seulement pour modifier quelques paramètres au lieu de créer une méthode qui prend les paramètres modifiables comme les arguments. Même les professionnels j'ai travaillé avec reçu si utilisé pour l'action qu'il est devenu difficile juste de surmonter la résistance du fait de laisser vont de vieilles habitudes. Mais ils ont appris. Other things are using too many CCLayers without them adding a clear benefit, for example just to group all nodes at a specific z order together or to group them by functionality, eg one layer for enemies, one for players, one for background, one for UI, one for score, one for particle effects, and so on – without any of these layers being used for what they’re really good at: modifying multiple nodes at once, like moving, scaling, rotating or z-reordering them. And of course there’s the copy & paste hell, large blocks of code reproduced in various places only to modify some parameters instead of creating a method which takes the modifiable parameters as arguments. Even professionals I worked with got so used to doing that it became hard just to overcome the resistance of letting go of old habits. But they learned.

Résumé

Rien de ce design codé et structurant ne me frappe comme bizarre ou surprenant. J'ai écrit le code comme cela moi-même. Je crois aussi si c'est assez bon et les travaux, alors pourquoi bon Dieu non ? C'est une affaire d'expérience et c'est seulement avec l'expérience que vous voyez clairement comment améliorer des choses. Cela se réalise à la courbe d'apprentissage régulière où seulement l'entraînement et les leçons particulières et juste le fait de faire simplement des erreurs et le fait d'apprendre d'eux aident à la longue. C'est comment nous apprenons des choses. I also believe if it’s good enough and works, then why the hell not? It’s a matter of experience and it’s only with experience that you clearly see how to improve things. This boils down to the regular learning curve where only training and tutoring and just simply making mistakes and learning from them helps in the long run. That’s how we learn things.

D'autre part, les choses comme la direction de Ressource et de Mémoire peuvent aussi être apprises mais ils ont une différente nature. Ils peuvent être statistiquement évalués, ils pourraient être calculés et vérifiés automatiquement. Cela me fait me demander s'il n'y a pas quelque automation et outils d'information qui aideraient des promoteurs à accomplir de meilleurs résultats du point de vue de l'usage de mémoire et de la direction de ressource ? Entre-temps c'est tout de la levée de la conscience … This makes me wonder if there isn’t some kind of automation and information tools that would help developers achieve better results in terms of memory usage and resource management? In the meantime it’s all about raising awareness …

Levée de la Conscience de Mémoire

De la manière la plus importante je crois que nous avons besoin de lever plus de conscience à ces éditions aux promoteurs cocos2d. Un pas vers cela serait pour cocos2d pour afficher un “comptoir de mémoire disponible” le long du comptoir de FPS. J'avais l'habitude de rapiécer CCDirector pour simplement afficher la mémoire au lieu de FPS depuis que c'était toujours plus important pour moi. Le type cocos2d le promoteur Joseph m'a envoyé sa version pour afficher tous les deux – je n'ai pas pensé simplement à l'évident. Ainsi si vous voudriez voir FPS et mémoire disponible à côté de l'un l'autre je crois que vous pouvez manipuler les changements dans CCDirector exposé ici : I used to patch CCDirector to simply display memory instead of FPS since that was always more important to me. Fellow cocos2d developer Joseph sent me his version to display both – I simply didn’t think of the obvious. So if you’d like to see FPS and available memory next to each other I think you can handle the changes to CCDirector outlined here:


//CCDirector.h, ajoutent au-dessous de @interface :
+ (double) getAvailableBytes;
+ (double) getAvailableKiloBytes;
+ (double) getAvailableMegaBytes;

//CCDirector.m, ajoutent comme approprié :
#include <sys/sysctl.h>  
#import <mach/mach.h>
#import <mach/mach_host.h>

[...]

+ (double) getAvailableBytes
{
  vm_statistics_data_t vmStats;
  mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
  kern_return_t kernReturn = host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t) &vmStats, &infoCount);

  si (kernReturn! = KERN_SUCCESS)
  {
    rendez NSNotFound;
  }

  revenez (vm_page_size * vmStats.free_count);
}

+ (double) getAvailableKiloBytes
{
  revenez [CCDirector getAvailableBytes] / 1024.0;
}

+ (double) getAvailableMegaBytes
{
  revenez [CCDirector getAvailableKiloBytes] / 1024.0;
}

[...]

- (vide) showFPS
{
  cadres ++;
  accumDt + = dt;

  si (accumDt> CC_DIRECTOR_FPS_INTERVAL)  {
    frameRate = frames/accumDt;
    cadres = 0;
    accumDt = 0;

    //le seul changement dans showFPS est cette ligne :
    NSString *str = [[NSString alloc] initWithFormat:@" le %.1f  le %.1f", frameRate, [CCDirector getAvailableMegaBytes]];

    [FPSLabel setString:str];
    [libération de str];
  }
}

La levée de la conscience aux Scènes fuyantes

En plus j'hautement, fortement et avec le renforcement extrême (sans retirer un fusil) recommande aux promoteurs cocos2d de fréquemment vérifier les méthodes dealloc de votre scène. Ajoutez de préférence un point d'arrêt là, ou ajoutez au moins la ligne notante : CCLOG (”dealloc : le %”, moi). Si vous voulez une méthode plus visible mais moins indiscrète vous pourriez faire quelque chose comme le solin de l'écran ou le jeu d'un son chaque fois que la dernière scène est deallocated, pour que vous deveniez si utilisés pour cela que quand vous ne le voyez pas ou n'entendez plus il lève immédiatement votre attention. CCLOG(@”dealloc: %@”, self). If you want a more visible but less intrusive method you could do something like flashing the screen or playing a sound whenever the last scene is deallocated, so that you get so used to it that when you’re not seeing or hearing it anymore it immediately raises your attention.

Si n'importe quand pendant le développement de votre projet on n'appelle pas la méthode dealloc pour une scène quand vous changez des scènes, vous divulguez la mémoire. Divulguer la scène entière est une fuite de mémoire de la pire sorte. Vous voulez l'attraper tôt pendant que vous pouvez revenir encore sur vos pas qui pourraient avoir provoqué le problème. Dès que vous arrivez à l'utilisation des centaines d'actifs et des milliers de lignes de code et vous rendez compte ensuite que la scène n'est pas deallocated, vous serez dans pour un trajet amusant essayant de trouver où cela vient de. Dans ce cas, en enlevant des noeuds en les non remarquant jusqu'à ce que vous puissiez vous rapprocher sur le coupable est probablement la meilleure stratégie, à côté de l'utilisation des Instruments (que je n'ai pas trouvé trop utile dans ces cas). You want to catch that early while you can still retrace your steps that might have caused the problem. Once you get to using hundreds of assets and thousands of lines of code and then realize the scene isn’t deallocated, you’ll be in for a fun ride trying to figure out where that’s coming from. In that case, removing nodes by uncommenting them until you can close in on the culprit is probably the best strategy, next to using Instruments (which I haven’t found too helpful in those cases).

J'ai heurté un tel problème une fois parce que je passais l'objet de CCScene aux sous-classes pour qu'ils aient l'accès aux méthodes de la scène. La sous-classe a retenu la scène et a été tirée de CCNode et ajoutée au CCScene comme l'enfant. Le problème avec cela : pendant le nettoyage de la scène il a enlevé correctement tous les noeuds d'enfant mais certains des noeuds d'enfant retenaient encore la scène. À cause de cela on n'a jamais appelé leur méthode dealloc et à tour de rôle la scène n'était jamais deallocated. The problem with that: during cleanup of the scene it correctly removed all child nodes but some of the child nodes still retained the scene. Because of that their dealloc method was never called, and in turn the scene was never deallocated.

Préférez la Composition sur l'Héritage

Le 11 juin 2010, dans la Programmation, Parlant De l'Expérience, par Steffen Itterheim by Steffen Itterheim

Quand la question s'est levée si à la sous-classe CCSprite ou utilisent une classe modèle pour construire votre hiérarchie d'entité de jeu dans le forum cocos2d, j'ai souligné qu'il faudrait essayer de ne pas utiliser l'héritage et garder la hiérarchie d'héritage à comme peu de niveaux que possible. J'ai travaillé avec codebases avec les centaines de milliers de lignes de code et des centaines de types différents d'acteurs dans le monde. Pourtant la hiérarchie d'héritage était 2 classes (parentales) formidables pour presque tous les objets, seulement très peu d'objets de jeu avaient 3 ou 4 classes formidables. Comment pouvez-vous rendre des jeux complexes cette voie ? Yet the inheritance hierarchy was 2 super (parent) classes for almost all objects, only very few game objects had 3 or 4 super classes. How can you make complex games this way?

La réponse est dans la composition, souvent appelée les Composantes de Jeu par les moteurs comme TorqueX et le Moteur de Bouton-poussoir (un moteur de jeu d'Éclat des promoteurs de Moment de torsion originaux). Cette vidéo du Bouton-poussoir mène le promoteur Ben Garney l'explique très bien et illustre aussi le problème avec la surutilisation d'héritage dans les moteurs de jeu. Quelque chose que la plupart des promoteurs inconnues à orienté vers l'objet et/ou la programmation de jeu ont tendance vraiment en fait à surutiliser – j'en attribue la responsabilité aux livres pauvrement écrits et à d'autres sources OOP préliminaires qui accentuent l'héritage sans discuter ses inconvénients. Something that most developers new to object-oriented and/or game programming do in fact tend to over-use – i blame that on poorly written books and other introductory OOP sources which emphasize inheritance without discussing its disadvantages.

Vous pouvez lire plus du système de Composantes de Bouton-poussoir dans leur documentation. Comment ils ont exécuté des Composantes dans TorqueX et ce que les différences sont aux Composantes de Jeu XNA améliore plus loin la compréhension du concept.

Pour la lecture de plus et les arguments lit l'article Wikipedia de la composante a basé l'ingénierie de logiciel. En fait, la langue Objective-C a été inventée pour être capable de créer des composantes de logiciel réutilisables!

La conversation de 2002 GDC de Scott Bila d'Un Système d'Objet de Jeu Guidé par les données (PDF) comme utilisé par le Siège de Cachot contient plus de flèches sur pourquoi l'héritage échoue pour les promoteurs de jeu et ce que les avantages (mais aussi quelques mises en garde) sont avec les moteurs de jeu basés sur la composante. La conversation peut être vieille mais il est valide encore aussi aujourd'hui qu'il est revenu alors. En fait, en 2002 j'ai commencé à travailler sur SpellForce qui a déjà fait introduire un système composant dans son coeur, appelé des Aspects, des Capacités et des Charmes. Il nous a permis d'entrer toutes les données de jeu dans la base de données et les programmeurs avaient besoin d'écrire seulement le code générique qui s'est occupé des données, aussi bien que le cadre de certaines limites et des vérifications de la validité (eg. vous ne pouviez pas utiliser un charme nuisible sur vous, mais si vous vous avez voulu pourrait viser des ennemis avec votre guéris le charme, ou avoir des bâtiments de pousse d'archers … errm). In fact, in 2002 i started working on SpellForce which already had a component system built into its core, called Aspects, Abilities and Spells. It allowed us to enter all the game data in the database and programmers only needed to write the generic code that dealt with the data, as well as setting certain limits and validity checks (eg. you couldn’t use a damaging spell on yourself but if you wanted to you could target enemies with your heal spell, or have archers shoot buildings … errm).

Pendant 2009 GDC Marcin Chady de Divertissement Radical a tenu une présentation semblable. On a appelé la conversation la Théorie et la Pratique d'Architecture de Composante d'Objet de Jeu (PPT).

Mick West a écrit des Entités de Jeu d'article Refactoring avec les Composantes qui décrit les défis et les avantages de changer Tony Hawk codebase d'un modèle d'héritage à un système de composante de jeu.

Un peu plus avancé lu sur l'utilisation composante est un papier en collaboration appelé le Système de Composante d'Objet de Jeu Dynamique pour les Caractères de Comportement Variables qui parle des composantes dans le contexte de machines publiques finies et de comportements NPC avec un système d'activation basé sur la règle.

Le blog d'Architecte de Jeu l'appelle une Anatomie de Désespoir et résume très bon ce que le fait d'escroquer de design de classe basé sur l'héritage est et comment la composition les résout.