2010-10-29 27 views
4

J'essaie de créer un moteur de type roguelike au tour par tour pour XNA. En fait, je transfère le jeu d'un travail précédent que j'ai fait en utilisant une librairie roguelike basée sur SDL appelée libtcod. Comment est-ce que je peux modifier le modèle de base XNA pour que le jeu pas redessine l'écran à chaque image, mais, au contraire, quand je veux?Contrôle manuel sur le moment où redessiner l'écran

+0

Et pourquoi voudriez-vous faire cela? Vraiment, je suis curieux. – jv42

+0

Eh bien, quand vous avez un jeu dont les graphismes ne changent pas jusqu'à ce que l'utilisateur appuie sur une touche, il semble stupide de continuer à recalculer et redessiner tout encore et encore. –

Répondre

5

La méthode correcte pour ce faire est d'appeler GraphicsDevice.Present() chaque fois que vous voulez dessiner le tampon arrière sur l'écran.

Maintenant, la difficulté ici est que la classe Game appelle automatiquement Présent pour vous (en particulier dans Game.EndDraw), ce que vous ne voulez pas qu'il fasse. Heureusement Game fournit un certain nombre de façons d'empêcher présent d'être appelé:

La meilleure façon serait de passer outre BeginDraw et avoir return false, d'empêcher un cadre d'être aspirés (y compris la prévention d'être appelé Draw et EndDraw), comme ceci:

protected override bool BeginDraw() 
{ 
    if(readyToDraw) 
     return base.BeginDraw(); 
    else 
     return false; 
} 

Les autres alternatives doivent appeler Game.SuppressDraw ou à passer outre EndDraw telle qu'elle ne remet pas base.EndDraw() jusqu'à ce que vous êtes prêt à avoir une image affichée à l'écran.

Personnellement, je dessinerais simplement chaque image.

+0

Upvote for "Personnellement je dessinerais simplement chaque image" – Martin

2

Vous n'avez pas besoin d'hériter de la classe Game, elle est entièrement facultative. Vous pouvez écrire votre propre classe qui redessine l'écran uniquement lorsque vous le souhaitez. Il y a du code utile dans la classe, donc vous pouvez utiliser Reflector pour copier du code à partir de là et ensuite changer sa logique.