Question

Dites que vous construisez un jeu de Tetris. Comme tout programmeur approprié, vous avez votre logique de vue d'un côté, et votre logique métier de l'autre côté; probablement un plein sur MVC passe.

Lorsque le modèle envoie son update(), la vue se redessine, comme prévu.

Mais ... si vous vouliez ajouter, par exemple, une animation à disparaître une ligne, comment voulez-vous mettre en œuvre que dans la vue?

Faire des hypothèses que vous voulez --- sauf que « Tout est bien encapsulé ».

Était-ce utile?

La solution

Personnellement, je separate draw l'écran aussi souvent que possible, même s'il n'y avait aucune mise à jour de la position du bloc. Je devrais donc une boucle quelque part avec un "mise à jour" et "rendre" partie. Mise à jour joue la balle à la logique qui fait ou ne pas mise à jour des positions et / ou le retrait du bloc. Rendu joue la balle à la partie graphique, qui tire les blocs où ils devraient être.

Maintenant, s'il y a des lignes à effacer, la logique sait et peut marquer ces lignes à supprimer. Je suppose ici, que chaque pièce se compose de 4 blocs simples et l'un de ces blocs est un objet unique. Maintenant, quand ce bloc a le « mourir » ensemble -flag, vous pouvez prendre quelques désamorcent parties disparaître le bloc (disons, 500ms à exploser). Passé ce délai, l'objet peut être disposé et le bloc une ligne tombe au-dessus vers le bas. Pourquoi 500ms? Eh bien, vous devriez certainement utiliser le mouvement en fonction du temps car cela maintient la vitesse de jeu de la même sur différents ordinateurs.

BTW, il y a déjà si appelés moteurs de jeu qui fournissent une telle mise à jour-rendu en boucle. Par exemple XNA, si vous allez la ligne .NET. Vous pouvez également coder votre propre moteur mais méfiez-vous, ce n'est pas une tâche facile et il est très consommatrice de temps. Je l'ai fait une fois et ne vous attendez pas à être un moteur comme la source du moteur; -)

Autres conseils

La plupart des jeux exécutent une boucle qui redessine en permanence la vue du jeu aussi vite que possible, plutôt que d'attendre un changement dans l'état de modèle et puis rafraîchissez la vue.

Si vous aimez le modèle de vue du modèle, il pourrait bien fonctionner pour la vue de continuer à tirer quelques types d'objets après leur retrait du modèle, les décolorant sur quelques millisecondes.

Une autre approche serait de combiner la classe MVC avec quelque chose comme l'exécution différentielle - la « vue » est un modèle de ce qui est présenté, mais le code de dessin compare le flux des événements, la « vue » crée avec le flux du rendu précédent . Donc, si dans un cours d'eau, il y a une ligne, et la suivante il n'y a pas, le code de dessin peut animer la différence. Cela permet de dessiner à l'écart de l'abstraction vue. Fréquemment, la « vue » dans MVC est une collection de widgets, au lieu d'être quelque chose qui attire l'affichage directement, de sorte que vous vous retrouvez avec des hiérarchies imbriquées MVC de toute façon: l'application est MVC (modèle de données, objets de vue, contrôleur de l'application), où le objet de visualisation a une collection de widgets dont chacun est MVC (état widget (par exemple bouton enfoncé), aspect et la convivialité / boîte à outils de liaison, la cartographie d'événements de la boîte à outils -> Etat du widget).

Je me suis souvent moi-même.

Mes pensées ont été le long de cette ligne:

1) La vue est donnée à l'état des blocs (forme, bla-bla), mais avec des données « transitoire » supplémentaire:

2) Le fait que doit être retiré d'une ligne est codée dans l'état, n'a pas été calculé dans la vue.

3) La vue sait comment dessiner des transitions maintenant:

  • Pas de changement: état est le même pour ce bloc particulier
  • Changement de « tomber » à « verrouillé »: l'état est « verrouillé » (par un bloc de goutte)
  • Changement de « verrouillé » à « éliminer »: état est « éliminé » (par une fin de ligne)
  • Changement de « tomber » à « supprimer »: l'état est « supprimé », mais ancien état était « en baisse »

Son intéressant de penser à un jeu comme MVC. Voilà une perspective que je ne l'ai jamais pris (pour une raison étrange), mais certainement intrigante qui fait beaucoup de sens. En supposant que vous ne mettre en œuvre votre jeu Tetris avec un MVC, je pense qu'il ya deux choses que vous voudrez peut-être prendre en compte en ce qui concerne la communication entre votre contrôleur et votre point de vue: Il y a état, et il y a des événements.

Votre contrôleur est évidemment le point d'interaction centrale pour l'utilisateur. Quand ils émettent des commandes clavier, votre contrôleur les interpréter et faire les ajustements appropriés de l'État. Cependant, parfois le jeu entrer dans un état qui coïncide avec un événement particulier ... comme remplir une ligne avec des blocs qui doivent maintenant être supprimés.

Scoregraphic vous a donné une base solide. Votre point de vue devrait fonctionner sur un cycle fixe pour maintenir une vitesse constante sur plusieurs ordinateurs. Mais en plus de mettre à jour l'écran pour rendre nouvel état, il devrait également avoir une file d'attente d'événements qui peut effectuer des animations en réponse à. Dans le cas de lignes de remplissage de Tetris, votre contrôleur pourrait émettre des objets d'événements fortement typés qui dérivent d'une sorte de type d'événement de base dans la file d'attente de vue, ce qui pourrait ensuite être utilisée par la vue d'effectuer les réponses animées appropriées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top