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
Répondre
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.
Upvote for "Personnellement je dessinerais simplement chaque image" – Martin
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.
Et pourquoi voudriez-vous faire cela? Vraiment, je suis curieux. – jv42
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. –