Поместите курсор ввода в любое подходящее текстовое поле и нажмите клавишу «А».Что вы увидите, как только вы нажмете клавишу, будет напечатана буква «А», затем будет пауза, а затем за первой буквой «А» последуют многие другие.Именно так работают события нажатия клавиш.И ваша программа получает их именно так.Сначала вы получаете одно событие, когда клавиша фактически нажата, а затем после задержки вы получаете много автоматически повторяющихся событий, если пользователь хочет ввести один символ много-много раз.
Он отлично работает для ввода текста, но в играх обычно требуется плавное движение.Если это так, вам нужно перемещать свой корабль не по получении события, а регулярно, например, по таймеру.И вам нужно будет перехватить события 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;
}
}
Затем просто убедитесь, что Ship :: timerEvent () вызывается при каждом событии таймера в игре.