2008-11-03 6 views
1

J'ai une toile de 800x600 dans une fenêtre de 300x300. Quand j'appuie sur une certaine touche, je veux que la toile bouge dans cette direction.
Je l'ai fait dans le code de la fenêtre derrière:Mouvement saccadé dans WPF

 
protected override void OnKeyDown(KeyEventArgs e) 
{ 
    base.OnKeyDown(e); 
    Key keyPressed = e.Key; 

    if (keyPressed == Key.W) 
    { 
     gcY += 5; 
    } 
    if (keyPressed == Key.S) 
    { 
     gcY -= 5; 
    } 
    if (keyPressed == Key.A) 
    { 
     gcX += 5; 
    } 
    if (keyPressed == Key.D) 
    { 
     gcX -= 5; 
    } 

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); 
} 

Eh bien, cela fonctionne, mais le mouvement est saccadé. Et si je maintiens une touche, W par exemple, alors il fait une pause d'une fraction de seconde, avant de se déplacer.
Y a-t-il un moyen de rendre le mouvement plus fluide et de supprimer la pause lorsque vous maintenez une touche enfoncée?
Merci.

Répondre

3

Votre configuration accepte actuellement l'entrée de clé spammée (en maintenant une touche enfoncée). La façon dont je l'ai vu dans la plupart des jeux avec une entrée basée sur les événements est d'utiliser un tableau booléen, keydown[256], mappant le clavier (l'index étant la valeur de la clé); toutes les valeurs initialisées à false.

Lorsque la touche est enfoncée, vous réglez le l'indice approprié à true dans la méthode keydown et dans votre jeu/boucle de rendu, vous appelez gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); en fonction de ce que les clés du tableau sont true. Vous définissez la valeur de clé à false lorsque la clé est libérée dans la méthode d'événement keyrelease (je ne suis pas sûr de ce qu'il est en C#).

De cette façon, vous obtiendrez un défilement régulier et le démarrage ne sera pas retardé.

+0

Salut, merci. Mais savez-vous pourquoi cela fonctionne et la façon dont je l'ai eu avant ne le fait pas? – jkidv

1

Oui, vous pouvez intégrer l'heure dans votre calcul. Actuellement, vous ajoutez/soustrayez 5 chaque fois que l'événement se déclenche, et ce n'est pas vraiment prévisible.

Pour atténuer le mouvement, assurez-vous de ne pas tirer plus de X fois par seconde en utilisant un DateTime.

comme:

private static DateTime nextUpdate 

if (nextUpdate <= DateTime.Now) 
{ 
//Move 
nextUpdate = DateTime.Now.AddMilliseconds(100); 
} 

Je n'ai pas VS en ce moment, donc je ne suis pas parfaitement sûr de la syntaxe, mais vous voyez l'idée.

Questions connexes