2010-12-11 9 views
1

Je ne sais pas s'il existe un moyen de réduire la vitesse d'exécution (Mettre à jour et tirer le temps entre les appels). J'ai besoin de ralentir la fréquence des appels parce qu'ils se produisent trop vite, et cela a pour conséquence de montrer ce que j'ai besoin de montrer en très peu de temps, si peu qu'en fait l'utilisateur ne peut rien voir.Diminuer la vitesse d'exécution dans XNA

L'objectif est de montrer plus lentement la progression de ce qui représente la logique de mon application.

Si le titre n'est pas clair, je me réfère à XNA Game Framework.

+0

Vous voulez ralentir le jeu? –

+1

Pourriez-vous expliquer ce que cela signifie: * aiment montrer plus lentement la progression de ce qui représente la logique de mon application * –

+1

Vous ne devriez pas compter sur la vitesse à laquelle les mises à jour/tirages sont appelés en premier lieu, il n'y a aucune garantie re appelé à une vitesse constante. – Doggett

Répondre

4

Je vous recommande d'avoir un code à l'intérieur de votre méthode de mise à jour des mises à jour la logique de votre jeu toutes les x secondes.

Définir:

int millisecondsPerFrame = 1000 //Update every 1 second 
int timeSinceLastUpdate = 0 //Accumulate the elapsed time 

Maintenant, sur votre mise à jour, vous pouvez avoir quelque chose comme:

timeSinceLastUpdate += gameTime.ElapsedGameTime.TotalMilliseconds; 
if(timeSinceLastUpdate >= millisecondsPerFrame) 
{ 
    timeSinceLastUpdate = 0; 

    //YOUR GAMES LOGIC GOES HERE 
} 

Avec cette approche, vous ne devez pas ralentir l'ensemble du programme.

+0

:) J'aime votre solution, est plus naturel que mon. – mjsr

1

J'ai trouvé la réponse dans MSDN. La clé est définie sur vrai IsFixedTimeStep, puis augmente ou diminue la variable TargetElapsedTime

D'abord j'ai besoin de mettre à vrai la propriété IsFixedTimeStep, alors je pourrais jouer avec la variable TargetElapsedTime (taux à quel Update est appel) qui est par défaut 1/60 sec, trop rapide pour ce que j'ai besoin de montrer, donc je l'ai mis en 1/2 sec, et ajouter deux clés pour modifier cette valeur en cours d'exécution.

IsFixedTimeStep = true; 
TargetElapsedTime = TimeSpan.FromSeconds(0.5); 

Et puis dans la méthode de mise à jour que je pouvais jouer avec le TargetElapsedTime pour accélérer et ralentir la mise à jour appelle:

if ((Keyboard.GetState().IsKeyDown(Keys.W))) 
{ 
    TargetElapsedTime += TimeSpan.FromSeconds(0.1f); 
} 
if ((Keyboard.GetState().IsKeyDown(Keys.S))) 
{ 
    if ((TargetElapsedTime - TimeSpan.FromSeconds(0.1f))>TimeSpan.Zero) 
    { 
     TargetElapsedTime -= TimeSpan.FromSeconds(0.1f);  
    } 

} 
0

Je suis d'accord avec certaines des autres réponses ici. Vous ne voulez pas vraiment ralentir l'exécution du jeu. Il n'y a aucun intérêt à le faire. Plus la conception plus tard sur la piste devient plus difficile que vous êtes coincé avec ce temps constant.

Le problème avec l'utilisation des delta temporels est que vous ne pouvez jamais être sûr de la fréquence à laquelle votre méthode de mise à jour sera appelée. Il y a un certain nombre de facteurs qui pourraient faire que cela tourne trop vite ou trop lentement. Si votre boucle de jeu est lente, même pour une fraction, vous pourriez manquer une coche entière dans votre jeu. Pour quelque chose comme un jeu de sport ce serait mauvais.

Utilisez plutôt une minuterie. .NET dispose d'un modèle d'événement incroyable et d'une classe de minuteur prédéfinie. Il est initialisé et vous le dites à quelle fréquence vous voulez faire une boucle. Chaque boucle déclenche un événement que vous pouvez écouter. Les avantages de ce sont deux fois. Premièrement, vous pouvez être assuré que votre tic sera proche de ou quand vous le demanderez. Deuxièmement, il ne fonctionne pas dans la logique du jeu principal permettant à vos programmes d'être mieux structurés. Vous pouvez même lier plus d'un événement à la minuterie vous permettant de me rendre plus modulaire avec votre code.

Try this ...

//create a new instance of a timer 
//and set it to 1000 millisecond interval(1 second) 
Timer t = new Timer(1000); 

//Add a listener to the elapsed event 
t.Elapsed += new ElapsedEventHandler(t_Elapsed); 

//start the timer 
t.Start(); 

void t_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    // I am called each second 
}