我正在构建“坦克”游戏,我使用关键事件在地图上运行我的坦克。事实上,我当时只能用一个键,但我需要有能力去做。同时往上走和左走。
下面是我针对单个关键事件的代码:
switch(event->key())
{
case Qt::Key_Up:
if(!ui->widget->playerList[playerID]->canMove(0.3, 20, 20, -20, -20, 1.5)) return;
ui->widget->playerList[playerID]->move(0.3);
ui->widget->updateGL();
break;
case Qt::Key_Down:
if(!ui->widget->playerList[playerID]->canMove(-0.2, 20, 20, -20, -20, 1.5)) return;
ui->widget->playerList[playerID]->move(-0.2);
ui->widget->updateGL();
break;
case Qt::Key_Right:
ui->widget->playerList[playerID]->rotate(10);
ui->widget->updateGL();
break;
case Qt::Key_Left:
ui->widget->playerList[playerID]->rotate(-10);
ui->widget->updateGL();
break;
case Qt::Key_Q:
ui->widget->playerList[playerID]->rotateCannon(10);
ui->widget->updateGL();
break;
case Qt::Key_E:
ui->widget->playerList[playerID]->rotateCannon(-10);
ui->widget->updateGL();
break;
default:
QMainWindow::keyPressEvent(event);
break;
} 发布于 2014-05-23 05:18:49
您可以将按下的键添加到按下的一组键中,并在释放该键时从该集合中移除。因此,您可以将按下的键添加到作为类成员的QSet中:
QSet<int> pressedKeys;可以在事件筛选器中捕获关键事件:
bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{
if(event->type()==QEvent::KeyPress) {
pressedKeys += ((QKeyEvent*)event)->key();
f( pressedKeys.contains(Qt::Key_Up) && pressedKeys.contains(Qt::Key_Left) )
{
// up and left is pressed
}
}
else if(event->type()==QEvent::KeyRelease)
{
pressedKeys -= ((QKeyEvent*)event)->key();
}
return false;
}不要忘记在构造函数中安装事件筛选器:
this->installEventFilter(this);发布于 2014-05-22 20:35:03
也许你可以考虑看看面具?假设您有方向,定义一个有四个位的掩码:
0 0 0 0
U D L R
每次你只需要检查按下了什么键。AND的口罩:
1000 - Up
0111 -下降
0010 -左
0001 -右
https://stackoverflow.com/questions/23816380
复制相似问题