2010-12-16 3 views
1

ОС :: win xp sp3.Как сделать ключевое слово для немедленной работы без задержки в Qt :: 4.6 (C++)?

Qt :: 4,6

У меня есть класс GameBoard, в котором у меня есть некоторые rectangle.I определены keyPressEvent для этого прямоугольника, чтобы переместить его вокруг screen.Key_A :: rectangle.moveToLeft & Key_D :: прямоугольника. moveToRight.Проблема заключается в том, что ключи работают с задержкой. Когда я выпускаю один ключ и нажимаю еще один, требуется некоторое время, прежде чем начать работать. Я проверил онлайн-документацию Qt и теперь для этого эффекта, но не сейчас, как заставить эти клавиши мгновенно работать без задержки между ними?

фрагмент кода:

//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

Можете ли вы вставить код из своего ключаPressEvent()? – Septagram 2010-12-16 07:50:09

+0

вы не должны чувствовать задержек при нажатии клавиши. Вы делаете тяжелые работы по рисованию в ui-нитке? – 2010-12-16 08:01:57

ответ

3

Put курсор ввода в любой применимой текстовое поле и нажмите клавишу 'A'. То, что вы увидите, - это когда вы нажмете клавишу, будет напечатана буква «A», после чего произойдет пауза, а затем первая буква «A» будет быстро сопровождать многие другие. Именно так работают события нажатия клавиш. И ваша программа получает их именно так. Сначала вы получаете одно событие, когда на самом деле нажата клавиша, а затем после задержки вы получаете много автоматически повторяющихся событий, если пользователь хочет вводить один символ много раз.

Он отлично работает для ввода текста, но в играх вам обычно требуется плавное движение. Если это так, вам нужно переместить свой корабль не после получения события, но регулярно, например, по событию таймера. И вам нужно поймать событие keyPressEvent и keyRelease и использовать их, чтобы помнить, какие клавиши перемещения в данный момент нажаты. Таким образом, можно, например, сделать это:

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; 
    } 
} 

Тогда просто убедитесь, что корабль :: TimerEvent() вызывается на каждом событии таймера в игре.