72 votes

Comment organiser le code d'un jeu en fonction du modèle MVC?

Je suis un étudiant de première année au collège aller pour mon diplôme en informatique... j'ai programmé beaucoup depuis plusieurs années, mais juste dernièrement, j'ai été faire de plus en plus dans les idées théoriques sur l'organisation du code, des modèles de conception, les différences de langues, etc.

J'ai une classe Java, donc j'ai laissé tomber mon C++ de recherche/développement et passent en Java et JOGL (Java, OpenGL). C'est merveilleux! Mais c'est à côté de la question.

Je veux faire un petit jeu de rôle, mais c'est une question vraiment s'applique à toute sorte de jeu. Comment vous organisez-vous le jeu d'objets dans une manière qui est structuré, comme le Modèle-Vue-Contrôleur de schéma? Il semble être un excellent modèle, très largement utilisé et fait beaucoup de sens, mais je vais avoir de la difficulté à trouver comment la mettre en œuvre.

Par exemple, j'ai besoin de garder une trace d'un prêt global de l'objet de dessin à l'écran. Je dois avoir des classes qui implémentent MouseListener, MouseMotionListener, MouseWheelListener, et KeyListener (ou une classe, un tout-en-un d'entrée de manager). Et je dois mettre mon jeu de données à un endroit où toutes ces différentes classes peuvent y accéder et les modifier; si quelqu'un appuie sur un bouton sur le clavier, la saisie de la gestion de classe doit en quelque sorte faire l'action que la clé est mappé; si un cadre doit être établi, la classe graphics besoin de trouver un moyen de faire une boucle par toutes les différentes "choses" et les dessiner.

Et mon plus gros problème, l'interface graphique; où est le lien dans tout cela? C'est quelque chose comme l'entrée, mais pas tout à fait, et il doit à la fois à définir et à obtenir des morceaux de données de la partie réelle de la simulation... Et complique encore PLUS si je décide de l'essayer et d'ajouter des réseaux, qui (similaire à l'interface graphique) doit également avoir accès à beaucoup de données pour la modification et la lecture...

Oh, je suis tout confus. Je ne sais pas comment faire tout ce travail ensemble dans une manière orientée objet... Il est assez facile d'écrire des choses qui correspondent clairement aux patrons, mais quand vous avez des tonnes de choses qui se passent, le tout associé à une boucle de jeu, en modifiant les uns des autres et le jeu de données et ainsi de suite, ... je ne sais même plus. Peut-être que je suis juste ce qui en fait un plus gros marché qu'il est réellement.

Quelqu'un d'autre a senti de cette façon? S'il vous plaît offrir un peu de clarté à ma situation, donc je peux passer moins de temps à s'inquiéter et de ne pas savoir par où commencer!

-Ricket

Edit: Trouvé un joli schéma qui pourrait m'aider à comprendre tout cela... Source: (attention, fichier PS!) http://www.tucs.fi/publications/attachment.php?fname=TR553.ps.gz

http://img10.imageshack.us/img10/6278/mvcdiagramgamesbl5.png

Edit2: j'aime aussi ce gars explication de la façon dont il a planifié son MVC jeu: http://interactivesection.wordpress.com/2007/11/19/dum-de-dum-drum-my-first-mvc-game-development/

Edit3: un Autre excellent article! http://dewitters.koonsolo.com/gamemvc.html

57voto

John Munsch Points 12653

Il pourrait vous aider à penser le Modèle comme une sorte de jeu de l'API. Quel serait votre jeu d'être réduit à si il n'y avait pas d'INTERFACE utilisateur pour le jeu ordonné depuis le début? Vous mentionnez que ce que vous avez à l'esprit est un RPG, donc dans ce cas, vous pouvez imaginer avoir le caractère de joueur, son inventaire, des sorts, des capacités, des Pnj, et même des choses comme la carte et les règles de combat tout en faisant partie du modèle. C'est comme les règles et les morceaux de Monopole, sans pour autant les détails de la façon dont le match de la finale de l'affiche ou de la façon dont l'utilisateur va interagir avec elle. C'est comme le Tremblement de terre comme un ensemble abstrait des objets 3D en mouvement par l'intermédiaire d'un niveau avec des choses comme l'intersection de collision et de calcul, mais pas de rendu, les ombres, ou des effets sonores.

En plaçant tous ceux qui dans le modèle le jeu lui-même est maintenant l'INTERFACE utilisateur agnostique. Il peut être accroché à un texte ASCII interface comme Rogue jeux, ou une ligne de commande de l'INTERFACE utilisateur semblable à Zork, ou un basé sur le web, ou 3D de l'INTERFACE utilisateur. Certains de ces interfaces utilisateur peut être un terrible ajustement selon la mécanique de jeu, mais ils seraient tous être possible.

La couche de la Vue est l'INTERFACE utilisateur dépendant de la couche. Il reflète le choix précis de l'INTERFACE utilisateur, vous êtes allé avec et sera très dédié à cette technologie. Il pourrait être responsable de la lecture de l'état du modèle et le dessin en 3D, ASCII, ou des images et HTML d'une page web. Il est également responsable de l'affichage de mécanisme de contrôle, le joueur doit utiliser pour interagir avec le jeu.

Le Contrôleur de couche est la colle entre les deux. Elle n'aurait jamais dû tout de même le jeu de logique, ni ne devrait être responsable de la conduite de la couche Vue. Il devrait plutôt traduire les mesures prises en Vue de la couche (en cliquant sur les boutons, en cliquant sur les zones de l'écran, une manette de jeu actions, peu importe) dans les actions prises sur le modèle. Par exemple, la suppression d'un élément, d'attaquer un PNJ, que ce soit. Il est également responsable de la collecte des données et de faire la conversion ou de transformation pour le rendre plus facile pour la couche de la Vue à afficher.

Maintenant, la façon dont je l'ai décrit ci-dessus est qu'il y a un très net de séquence d'événements de conduite jeu qui est probablement le seul vraiment approprié pour un jeu web. C'est parce que c'est ce que j'ai passé mon temps sur ces derniers temps. Dans un jeu qui n'est pas motivée par une demande de l'utilisateur et la réponse du serveur web (par exemple, un jeu en cours d'exécution sur la machine de l'utilisateur), vous auriez probablement souhaitez assurez-vous que la couche du Modèle mis en œuvre le modèle Observateur. Par exemple, si les actions prennent place dans le Modèle parce que le temps passe, alors vous pourriez ne pas vouloir avoir de la couche de la Vue constante de l'interrogation du Modèle pour les mises à jour. Au lieu de cela en utilisant le pattern observer le Modèle pourrait informer, tous les observateurs de modifications apportées au Modèle des objets comme ils se produisent. Qui pourrait à son tour être utilisé pour l'invite de mise à jour immédiate à la Vue de refléter la modification.

Ensuite, si les 60 secondes en passant a entraîné dans certaines réparations qui se passe pour le joueur de base, la base peut effectuer des réparations et de l'informer immédiatement de tout observateur attaché à ce que la base est mise à jour. L'Affichage peut être joint en tant qu'Observateur et qu'il a besoin pour ré-afficher la base à cause de son état a changé. La notification elle-même peut-être assez d'informations pour mettre à jour la Vue ou il pourrait avoir à tourner autour et de consulter le modèle afin de mettre à jour, mais le résultat sera le même.

19voto

Charlie Martin Points 62306

Vous êtes bien s'entendre. fondamentalement, posez-vous la question "qui code changerait si je devais changer une partie du programme?"

Si cela changerait la façon dont elle regarde sans changer de base de données, puis c'est dans la vue. Si c'est des données qui pourraient être considérés dans beaucoup de façons, c'est le modèle. Et si c'est comment vous jouez, alors que c'est le contrôle.

Donc, si c'est si vous dessinez un "axe" avec deux lames ou de l'une, c'est la vue. Si c'est le nombre de points de dégâts que vous infligez avec une hache, c'est modèle. Et si c'est si vous balancer la hache en tapant "s" ou en cliquant-droit, c'est le contrôle.

8voto

Adam Smith Points 2167

Je ressens avec vous je me souviens quand j'ai d'abord découvert MVC, j'ai essayé de caser tout. Je n'ai en effet faire un jeu, qui ont utilisé le modèle MVC. Ce que j'ai trouvé plus tard, mais est-ce ce que j'ai fait a été exagéré. J'ai essayé d'adapter à peu près chaque seule classe que j'ai faite dans une seule catégorie dans MVC.

Ce que je suggère, c'est de lire les "Patrons de Conception" par la bande des quatre. Il y a beaucoup de modèles utiles en plus de la MVC. Parfois, il ne fait aucun sens d'utiliser MVC. Surtout pour les jeux je ne suis pas sûr si MVC est une bonne idée. La raison étant que vous ne souhaitez pas afficher un objet de jeu de différentes façons (points de vue), mais vous souhaitez réutiliser un code de dessin pour de nombreux types de jeu des objets.

Pour mon propre moteur de jeu 2D, j'ai utilisé la stratégie motif très activement. Le jeu des objets, comme le joueur et les monstres, j'ai appelé un Sprite. Je laisse le dessin du sprite être traitées par un modèle de stratégie. C'est quand j'ai appelé sprite.draw() , je voudrais faire quelque chose comme ceci:

class Sprite {
  void draw() {
    this.view.draw(this.currentPosition, this.currentOrientation);
  }

  Point  currentPosition;    // Current position of this sprite
  double currentOrientation; // Facing angle of sprite
};

L'avantage de cette approche est que vous pouvez partager un objet de vue entre plusieurs sprites. Parce que en général, il y aura beaucoup de, par exemple, des monstres qui aura la même apparence mais qui sera l'une des positions différentes et éventuellement comporter différents.

Donc, le comportement, je voudrais également utiliser un modèle de stratégie qui serait un objet qui contient le code décrivant le comportement. De cette façon, je peux appliquer le même comportement à plusieurs monstres à différents endroits. Donc, chaque image que j'appellerais une mise à jour() de la fonction de mise à jour de position, d'orientation et de ce monstre.

class Sprite {
  void setUpdateAction(Action action) {
    this.updateAction = action;
  }

  void update(double start_time, double delta_time)
  {
    this.prevPosition = position();  
    advance(delta_time); // Advance to next position based on current speed and orientation

    this.updateAction.execute(this, start_time, delta_time);
  }

  Action updateAction;
};

Il y a des tas de variantes de ce. Dans mon application, j'ai même séparé currentPosition, de la vitesse, de l'orientation et de l'avance() sur un objet distinct appelé MotionState. Il en est ainsi, je peux construire un arbre de recherche de positions et d'orientations, lorsque vous faites des algorithmes de recherche de chemin. Puis je ne veux pas emporter avec moi des informations sur la façon de se comporter chaque mise à jour ou comment sprite doit être établi.

3voto

Dave Swersky Points 25958

Le MVC concept de centralisation de l'interaction de l'utilisateur de logic est un bon modèle pour le développement d'un jeu.

J'ai fait un peu de travail avec des jeux Flash de développement. Ici est un article au sujet de l'objet de piscines en Flash. Le concept est multi-plateforme et peut vous donner quelques idées.

Vous êtes en droit de se préoccuper de toutes les choses qui se passent en même temps. Selon votre conception du jeu, votre boucle de jeu peut avoir beaucoup de choses à régler. C'est là que vous apprendrez à tous les sales optimisation des astuces, souvent à la dure :)

Il existe de nombreuses façons d'organiser votre code - une option pourrait être d'écrire un GameManager classe Singleton. Tous les objets du jeu attacher à elle pour la gestion et l'interaction de l'utilisateur. Le GameManager gère toutes les entrées utilisateur et envoie des messages à son objet piscine. Vous pouvez utiliser les interfaces de: - définir les modes de communication entre les objets du jeu et de la GameManager.

Aussi loin que l'optimisation de la performance va, le filetage est très puissant. Opération asynchrone peut vous assurer que vous n'êtes pas perdre ces précieux cycles.

1voto

Rocket Surgeon Points 381

Tous vos écouteurs et gestionnaires doivent aller dans la classe Controller, l'état des objets à l'écran (par exemple, la position, la couleur, etc.) doit faire partie de vos classes Model et le code qui dessine des éléments à l'écran fera partie de la vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X