Qt在游戏循环的短时间内停止关键事件

时间:2017-03-17 01:37:12

标签: c++ qt keyboard-events game-loop

我正在重写keyPressEvent以将玩家移到QGraphicsScene上。播放器的动画需要1000毫秒(在继续之前应该完成)。

我的问题是,如果用户按下键,它将发送大量事件,实际上会导致明显的延迟。有没有什么方法可以暂时禁用事件监听,除了设置一些布尔值?

进一步提出这个问题;我有一个游戏循环,并且所有移动都应该以例如1000毫秒(想想所有玩家在同一个刻度上移动的旧游戏 - 一切都保持同步)。除非用户在确切的时刻点击,否则他们将不得不等待他们的移动出现的下一个滴答。所以这里的问题是如何缓冲用户按下例如在刻度线前200ms,当刻度线发生时,它会执行最近的按下(向上,向下,向左,向右)。

或者我是否接近这个错误?

1 个答案:

答案 0 :(得分:1)

听起来你想要做的就是让你的keyPressEvent()回调方法非常轻量级;即除了设置一个表示用户按下了哪个键的变量之外,它应该什么都不做:

void MyClass :: keyPressEvent(QKeyEvent * keyEvent)
{
   // all we'll do for now is remember what the user pressed (overwriting any previously-cached value)
   this->userPressedKey = key->key();  
   keyEvent->accept();
}

void MyClass :: tick()  // called every 200mS or whatever
{
   if (this->userPressedKey != Qt::Key_Unknown)
   {
      processKeyPressPerMyGameLogic(this->userPressedKey);
      this->userPressedKey = Qt::Key_Unknown;  // clear the state in preparation for the next tick() call
   }
   doOtherGameLogicHere();
}

如果您希望用户能够每回合执行多个键事件而不只是一个,则可以用{{1}替换this->userPressedKey(当前为int类型的成员变量)或类似的。