Как заставить ключевое слово работать мгновенно и без задержки в Qt :: 4.6 (C ++)? - PullRequest
1 голос
/ 16 декабря 2010

OS :: win xp sp3.

Qt :: 4.6

У меня есть класс Gameboard, в котором у меня есть некоторый прямоугольник. Я определил keyPressEvent для этого прямоугольника, чтобы переместить егоscreen.Key_A :: rectangle.moveToLeft & Key_D :: rectangle.moveToRight.Problem заключается в том, что ключи работают с задержкой.Когда я отпускаю одну клавишу и нажимаю другую, требуется некоторое время, прежде чем она начнет работать. Я проверил онлайновую документацию 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; 
}


}



}

1 Ответ

3 голосов
/ 16 декабря 2010

Поместите курсор ввода в любое подходящее текстовое поле и нажмите клавишу «А».Что вы увидите, как только вы нажмете клавишу, будет напечатана буква «А», затем будет пауза, а затем за первой буквой «А» последуют многие другие.Именно так работают события нажатия клавиш.И ваша программа получает их именно так.Сначала вы получаете одно событие, когда клавиша фактически нажата, а затем после задержки вы получаете много автоматически повторяющихся событий, если пользователь хочет ввести один символ много-много раз.

Он отлично работает для ввода текста, но в играх обычно требуется плавное движение.Если это так, вам нужно перемещать свой корабль не по получении события, а регулярно, например, по таймеру.И вам нужно будет перехватить события 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 () вызывается при каждом событии таймера в игре.

...