【发布时间】:2017-10-26 08:29:44
【问题描述】:
我目前正在使用 Qt C++ 开发一个小型 2D 游戏。
在开始开发之前,我只是在尝试一些小事情。游戏。
问题是我不能同时按下 3 个以上的键。
我需要这个,因为我想在同一台 PC 和同一键盘上与 2 到 4 名玩家一起玩。
如果我找不到解决方案,我的玩家将无法同时玩游戏,这是个问题,因为它是实时游戏。
我正在使用基本的 keyPressEvent 来捕捉按键。
然后我将键存储在 QMap(int, bool) 中,以了解女巫键被按下和未按下。
我还使用计时器来处理 QMap 值并在按下一个或多个键时执行一些操作。
问题是当按住 3 键时,我按下了第 4 键。
第4个键没有catch,实际上程序不再调用keyPressEvent。
我的代码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtWidgets>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTimer *timer;
QMap<int, bool> keys;
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *e);
private slots:
void timerOutEvent();
};
#endif // WIDGET_H
Widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
timer = new QTimer();
timer->setInterval(1000/60);
timer->start();
connect(timer, &QTimer::timeout, this, &Widget::timerOutEvent);
}
Widget::~Widget()
{
}
void Widget::timerOutEvent()
{
QString txt = "";
if(keys[Qt::Key_Up])
{
txt += "u";
}
if(keys[Qt::Key_Down])
{
txt += "d";
}
if(keys[Qt::Key_Left])
{
txt += "l";
}
if(keys[Qt::Key_Right])
{
txt += "r";
}
qDebug() << txt;
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
keys[event->key()] = false;
QWidget::keyReleaseEvent(event);
}
void Widget::keyPressEvent(QKeyEvent *event)
{
keys[event->key()] = true;
QWidget::keyPressEvent(event);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
提前感谢您的帮助!
亚历克斯
【问题讨论】:
-
不是答案,但如果您确实想开发游戏,请查看 V-Play。这是 Qt 的游戏引擎:v-play.net
-
我会检查,但我不喜欢使用引擎。如果存在其他解决方案,那将是完美的。