2010-11-28 3 views
1

J'ai un programme WinForms, dans lequel j'ai un objet animé qui se déplace lorsque j'appuie sur Haut, Bas, Gauche et Droite. Le mouvement de l'objet est animé à l'intérieur d'une minuterie, appelée toutes les 30 ms. La minuterie commence à l'événement KeyDown et s'arrête sur l'événement KeyUp. Donc, si je tiens par exemple à gauche, et immédiatement après avoir relâché la touche gauche et appuyé sur une autre, il y a une petite pause (environ une demi-seconde), avant qu'elle ne bouge dans cette direction. Ce problème n'apparaît pas, si je me tiens à gauche, le relâcher, et attendre un peu, et puis appuyez sur droite. Dans ce cas, il se déplacerait immédiatement à droite. Il n'apparaît pas non plus si je tiens à gauche, puis je commence à me tenir à droite, alors que je suis toujours à gauche. Dans ce cas, il commencerait à bouger immédiatement aussi. Le problème n'apparaît que lorsque je relâche la touche et que j'appuie immédiatement sur une autre.System.Timers.Problème de démarrage après la sortie d'une autre clé

événement KeyDown:

private void form_KeyDown(object sender, KeyEventArgs e) 
    { 
     k = 0; 
     watch.Start(); 

     if (e.KeyCode == Keys.Left) 
     { 
      direction = MOVE_LEFT; 
     } 
     else if (e.KeyCode == Keys.Right) 
     { 
      direction = MOVE_RIGHT; 
     } 
     else if (e.KeyCode == Keys.Up) 
     { 
      direction = MOVE_UP; 
     } 
     else if (e.KeyCode == Keys.Down) 
     { 
      direction = MOVE_DOWN; 
     } 
     timerMove.Start(); 
    } 

événement KeyUp:

private void form_KeyUp(object sender, KeyEventArgs e) 
    { 
     timerMove.Stop(); 
    } 

événement Timer (mouvement d'animation)

void charMovement(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (direction == MOVE_LEFT) 
     { 
       timerMove.Interval = 30; 
       CharSize(11, 15); //mainChar.Size = new System.Drawing.Size(11, 15); 
       //code for movement 

     } 
     else if (direction == MOVE_RIGHT) //... etc. etc. 
+1

Dans les applications WinForms, vous devez utiliser un 'System.Windows.Forms.Timer', pas un' System.Timers.Timer'. Comment ça gâche votre animation? – SLaks

+0

Je ne peux pas l'utiliser, car cela dérange mon animation. Je l'ai déjà essayé, mais les gens de stackoverflow m'ont dit d'utiliser le Timers.Timer à la place. Au moins mon animation fonctionne bien maintenant, le seul problème que je semble avoir est celui que j'ai dit ci-dessus. – NoelAramis

+0

Comment ça gâche votre animation? – SLaks

Répondre

1

Le problème n'est pas les minuteurs, mais le réglage de la pause de répétition de votre clavier. Si vous appuyez et maintenez une touche, il y a une pause entre la première et la deuxième lettre. Une pause plus longue entre les lettres suivantes. C'est ce que vous voyez.

Vous pouvez oublier les événements du clavier et utiliser un seul battement de cœur, vérifier quelles touches sont enfoncées et agir ensuite dessus. Il semble que WinForms n'ait pas quelque chose comme GetKeySate, mais vous pouvez utiliser la fonction P/Invoke the win32.

Ou vous pouvez lancer votre propre version de GetKeyState et vous rappeler quelles touches sont enfoncées dans KeyDown et réinitialiser l'indicateur dans KeyUp. La minuterie de déplacement continue à fonctionner tant que vous appuyez sur au moins une touche.

+0

Merci, j'ai essayé et ça marche! – NoelAramis

0

essayer de faire ceci si vous ne l'avez pas encore fait

FormName.KeyPreview = true;

aussi, utilisez seulement une méthode .. pas deux .. tendance est la touche serait lu deux fois car il y a un haut et un bas ... essayez d'utiliser KeyPreview = true; puis utilisez KeyPress au lieu de KeyDown et KeyUp

+0

J'ai déjà essayé. Fondamentalement, le programme n'a pas découvert que j'ai appuyé sur les touches fléchées, donc j'ai essayé d'écraser une méthode que j'ai trouvée sur internet, ce qui me permettrait de savoir si les touches fléchées étaient enfoncées, mais ça ne l'était toujours pas. travail. – NoelAramis

+0

pourquoi ne pas utiliser System.Windows.Forms.Timer .. cela fonctionne aussi ... pour votre animation .. juste être sûr de savoir quand l'arrêter ... –

+0

Je l'ai utilisé, et cela fonctionne exactement la même chose. Je n'ai vu aucun changement dans le comportement du programme. – NoelAramis

Questions connexes