1

操作系统::win xp sp3。

Qt:: 4.6

我有类游戏板,其中有一些矩形。我为该矩形定义了 keyPressEvent 以便在屏幕上移动他。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; 
}


}



}
4

1 回答 1

4

将输入光标放在任何适用的文本框中,然后按“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; 
    }
}

然后确保 Ship::timerEvent() 在游戏中的每个计时器事件上都被调用。

于 2010-12-16T08:33:45.050 回答