我正在重写keyPressEvent以将玩家移到QGraphicsScene上。播放器的动画需要1000毫秒(在继续之前应该完成)。
我的问题是,如果用户按下键,它将发送大量事件,实际上会导致明显的延迟。有没有什么方法可以暂时禁用事件监听,除了设置一些布尔值?
进一步提出这个问题;我有一个游戏循环,并且所有移动都应该以例如1000毫秒(想想所有玩家在同一个刻度上移动的旧游戏 - 一切都保持同步)。除非用户在确切的时刻点击,否则他们将不得不等待他们的移动出现的下一个滴答。所以这里的问题是如何缓冲用户按下例如在刻度线前200ms,当刻度线发生时,它会执行最近的按下(向上,向下,向左,向右)。
或者我是否接近这个错误?
答案 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
类型的成员变量)或类似的。