2010-02-26 6 views
1

Hé, je fais un jeu de type Frogger et je me sers d'une minuterie pour que les images défilent à l'écran. J'utilise également l'événement keydown pour gérer quand l'utilisateur déplace la «grenouille». Donc, w déplacé vers le haut, vers le bas s se déplace, etc.keydown gèle timer C#

Le problème que je suis venu à travers est que chaque fois que l'utilisateur appuie sur un bouton de mouvement, le gel de la minuterie. Cela signifie que si l'utilisateur maintient simplement "w" ou "haut", toutes les voitures s'arrêtent de bouger.

est-il un moyen de mettre la minuterie dans un travailleur de fond ou un moyen de faire le report de minuterie tic-tac, même lorsque l'utilisateur se déplace?

Merci pour toute aide!

C'est ce que j'ai actuellement:

public string i; 
    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 68) 
     { 
      i = "right"; 
      backgroundWorker1.RunWorkerAsync(); 
     } 
    } 


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (i == "right") 
     { 
      pictureBox1.Location = new Point((pictureBox1.Location.X + 17), pictureBox1.Location.Y); 
     } 
    } 

Répondre

2

Regardez la fenêtre de sortie lorsque vous exécutez votre programme avec le débogueur. Vous verrez beaucoup de messages IllegalOperationException. La méthode de travail en arrière-plan meurt sur une exception, vous ne la remarquez pas car vous ne vérifiez pas la propriété e.Error dans un gestionnaire d'événements DoWorkCompleted. C'est pourquoi ça ne bouge pas.

Vous n'êtes pas autorisé à définir les propriétés d'un contrôle dans un thread d'arrière-plan. C'est ce que l'exception essaie de vous dire. Vous devrez abandonner l'idée d'utiliser des threads pour implémenter votre logique d'interface utilisateur. Les jeux sont généralement mis en œuvre avec un game loop.

+0

Merci pour votre aide! – Crazyd22

3

Un fil de fond ou travailleur est la solution. Voici un simple travailleur de fond.

 BackgroundWorker bw = new BackgroundWorker(); 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerAsync(); 
    } 


    static Timer _t; 
    static void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     _t = new Timer(); 
     _t.Start(); 
    } 
+0

Merci pour votre aide, je vais donner un aller – Crazyd22

+0

Hope it helps. En outre, cela dépend du fil que votre dessin et le code de traitement sont manipulés, si vous traitez les choses directement dans l'événement keydown sur le thread ui, il pourrait y avoir un blocage. –

+0

Assurez-vous de ne pas utiliser le composant de minuterie piloté par événement WinForms ... – t0mm13b

1

Vous devez mettre en place un fil pour fonctionner en arrière-plan qui garde la trace de la minuterie ou utilisez une classe BackgroundWorker pour le faire pour vous. Si vous voulez un minuteur de précision, utilisez la classe System.Threading.Timer.

Espérons que cela aide, Cordialement, Tom.