2010-12-16 1 views
1

OS :: win xp sp3.Comment faire pour que le mot-clé fonctionne instantanément sans délai dans Qt :: 4.6 (C++)?

Qt :: 4.6

J'ai la classe Gameboard où j'ai un peu défini rectangle.I keyPressEvent pour ce rectangle afin de le déplacer dans la screen.Key_A :: rectangle.moveToLeft & Key_D :: rectangle. moveToRight.Problem est que les touches fonctionnent avec un délai. Lorsque je relâche une touche et appuie sur une autre, il faut un certain temps avant que celui-ci commence à travailler.J'ai vérifié la documentation Qt en ligne et maintenant pour cet effet mais ne pas maintenant comment faire ces touches pour travailler instantanément entre elles?

extrait de code:

//in Gameboard class  

ship = new QRect(x,y,w,h); 

void Gameboard::keyPressEvent(QKeyEvent* event) 
{ 
switch(event->key()) { 

case Qt::Key_A : 
{ 
    x = x-10; 
    ship->moveTo(x,y); 
    break; 
} 

case Qt::Key_D : 
{ 
    x = x+10; 
    ship->moveTo(x,y); 
    break; 
} 


} 



} 
+0

Pouvez-vous coller du code à partir de votre keyPressEvent()? – Septagram

+0

vous ne devriez pas sentir de retard dans la touche. Faites-vous des travaux de dessin lourds dans le fil de l'interface utilisateur? –

+0

Je fais des choses légères mais les touches ne réagissent pas immédiatement. –

Répondre

3

Mettez le curseur d'entrée dans une zone de texte applicable et appuyez sur la touche 'A'. Ce que vous verrez est une fois que vous appuyez sur la touche, la lettre «A» sera imprimée, puis il y aura une pause, puis la première lettre «A» sera rapidement suivie par beaucoup d'autres. C'est ainsi que fonctionnent les événements keypress. Et votre programme les reçoit exactement comme ça. D'abord, vous recevez un événement lorsque la touche est enfoncée, puis après un délai, vous obtenez beaucoup d'événements automatiquement répétés, au cas où l'utilisateur souhaite entrer un caractère plusieurs fois.

Fonctionne parfaitement pour la saisie de texte, mais dans les jeux, vous avez généralement besoin d'un mouvement fluide. Si c'est le cas, vous devez déplacer votre navire non pas à la réception de l'événement, mais régulièrement, par exemple, sur un événement de minuterie. Et vous aurez besoin d'attraper les deux événements keyPressEvent et keyRelease et de les utiliser pour se souvenir des touches de mouvements actuellement pressées. Ainsi, vous pouvez par exemple faire:

struct Ship { 
    bool is_moving_left, is_moving_right; 
    QPoint position; 
    int speed; 

    ... 

    void timerEvent() 
    { 
     if (is_moving_left) position.setX (position.x() - speed); 
     if (is_moving_right) position.setX (position.x() + speed); 
    } 

    ... 
}; 

... 

void Gameboard::keyPressEvent (OKeyEvent *_event) 
{ 
    switch(event->key()) { 

    case Qt::Key_A : 
     ship->is_moving_left = true; 
     break; 

    case Qt::Key_D : 
     ship->is_moving_right = true; 
     break; 
    } 
} 

... 

void Gameboard::keyReleaseEvent (OKeyEvent *_event) 
{ 
    switch(event->key()) { 

    case Qt::Key_A : 
     ship->is_moving_left = false; 
     break; 

    case Qt::Key_D : 
     ship->is_moving_right = false; 
     break; 
    } 
} 

Alors Assurez-vous de navire :: timerEvent() est appelée à chaque événement de minuterie dans le jeu.

+0

Comment arrêtez-vous le navire? Votre code ne désactive jamais is_moving_xxx. En fait, les deux sont prêts! – TonyK

+0

@TonyK Faites défiler vers le bas, le vaisseau s'arrête sur keyReleaseEvent(). – Septagram

+1

OK, je suis stupide. – TonyK

Questions connexes