Bonjour,
Je viens vers vous concernant l'architecture d'un jeu. Jusqu'à maintenant, j'avais pour habitude d'utiliser une architecture basé sur l'héritage et la décoration.
Un object nommé "Component" contenait une base et d'autres classes "IDrawable", "IUpdatable".... venais s'ajouter. J'avais donc un objet "Entity" qui héritait de Component + IDrawable + IUpdatable.... et une class sprite qui héritait de Component avec sa gestion spécifique etc... Côté fonctionnenement, je parcourais les Entity via un foreach qui executait via polymorphisme "Update()", "Draw()".... ça marche pas trop mal mais je trouvais que ça cassais la notion Responsabilité. En effet, Un sprite avait donc le role de gerer les input, l'affichage, la physique etc...
un exemple que j'ai pu trouve de ce qui ressemblait au mieux à ce que j'avais fais :
Source : http://www.raywenderlich.com/24878/i...cture-in-games
J'ai donc fais mes recherches sur le sujet et je suis tombé sur une autre façon de faire et qui, d'après ce que j'ai compris était réellement utilisé dans l'industrie. L'idée est de défini un object de base qui contiendrais une liste de composant (DrawComponent, InputComponent etc...).
Voici à quoi ça pourrais ressembler :
Source : http://www.quora.com/Are-dynamic-com...-game-industry
Pour que le modèle fonctionne, l'objet de jeu contient une collection de composant sur lequel il s'abonne et chaque composant instancé à une référence sur son parent (objet de jeu). Il faut aussi que les composants puissent discuter. Pour ce faire, j'ai vu qu'il était possible de créer un système de message en interne permettant de communiquer.
Exemple si dans composant, si je dois mettre à jour la position :
Meme si mon exemple n'est pas top car chaque message à ses paricularité et qu'il faudrait faire une classe de base message etc... l'idée est là.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 composant : parentObject->SendMessage(MSG_MOVE, 1, 1); object : void SendMessage(MESSAGE_ID id, int a, int b) { // pour chaque composant défini dans mon objet component->SendMessage(id, a, b); } composant position : void SendMessage(MESSAGE_ID id, int a, int b) { switch(id) { case MSG_MOVE: position->x += a; position->y += b; break; ..... } }
Cependant, dans ce cas de figure, je rencontre un soucis dans le cas suivant : Imaginons que le personnage s'approche d'un coffre et souhaite l'ouvrir. Le coffre est dans un autre objet et je pourrais lui envoyer un message "MSG_ACTION".
De mon point de vue, je vois qu'une seule approche possible. Il faudrait que j'ai une référence de ma scene sur chaque objet de façon à pouvoir envoyer un message depuis un objet vers ma scene en disant "l'objet A a effectué une action" puis d'envoyer un message à tout les objets de la scene en disant "Une action a été effectué par A". Je ne la trouve pas pertinente car ça risque d'impacter les performances si j'ai beaucoup d'objets dans ma scene. De plus, il faudrait que j'envoi une référence de l'objet A et j'ai peur que ça casse le couplage.
Que pensez-vous de ma seconde approche ? Comment puis-je informer depuis un objet A qu'une action a été faite et que l'objet B qui est le coffre près du personnage s'active mais pas tout les objets de la scène ?
Disont que mon principal problème est le liens entre objets du jeu, j'ai du mal à concevoir comment interragir entre-eux.
Merci par avance !
Partager