我正在使用QtQuick 2(Qt5.2)QML和C ++开发游戏。我想要C ++中的大部分游戏逻辑(我不想用JS做),而且我正在尝试使用QStateMachines来实现很多逻辑。
现在我的问题是,如何在该场景中实现正确的游戏循环?
游戏有例如从屏幕上移动到某些路点的对象,所以我认为我无法做所有基于状态/事件的事情。在某些时候我需要说“我的物体应该每秒向x方向移动10个像素”。因此,例如当我的对象处于其“移动”状态时,它应该每秒移动一定量,然后当然必须检查某些条件是否必须切换状态(例如,“攻击”)。
现在,Qt-examples和网络上的所有演示似乎都是完全基于事件的(例如,四行中的胜利)或用JavaScript编写。所以我在这里有点迷失。
我能找到的一个想法是创建一个QTimer,其定时器为例如30ms并将QTimer的timeout()信号连接到每个移动对象的advance()槽,并在'return app.exec();'之前启动该计时器。像这样:
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &scene, SLOT(advance()));
timer.start(1000 / 33);
return app.exec();
然后每个对象(例如鼠标)都有一个
void Mouse::advance(int step)
但是,这需要QGraphicsScene,我不确定Android / iOS上的QtQuick / QML项目有多好。
这是一个很好的解决方案吗?或者我对问题的看法有些不对,我不需要游戏循环来实现我的目标?
该解决方案不应使用Qt中任何仅限桌面的内容,即它应该适用于Android,iOS和桌面。
答案 0 :(得分:7)
这是要走的路:QTimer。在这里您可以找到一些详细的例子:
Qt游戏的典型循环:
int main(int argc, char* argv[]) {
// init stuff
while(game.isRunning()) {
a.processEvents(); //(a is a QApplication created during the init, should use a better name i guess)
QTime currentTime= QTime::currentTime();
int timeSinceLastUpdate = lastUpdate.msecsTo(currentTime);
while(timeSinceLastUpdate>updateTimeStep){
game.update();
timeSinceLastUpdate-=updateTimeStep;
lastUpdate=lastUpdateaddMSecs(updateTimeStep);
}
renderer.setInterpolateFraction(static_cast<float>(timeSinceLastUpdate)/static_cast<float>updateTimeStep);
renderer.renderGameObjects();
renderer.renderGUI();
renderer.swap();
}
a.exit();
return 0;
}
这应该是足够的信息让你开始。
答案 1 :(得分:1)
简单游戏的常用游戏循环可能看起来像这样(不确定我是否理解正确)。
每个代表游戏对象的类都有2个公共方法:update();和render(); 在每次调用QTimer对象时,您将遍历所有游戏对象并调用其更新方法。之后,为render method();
重复相同的操作在更新方法中,每个对象决定在游戏地图上做什么(移动/射击/站立/ ...)并更改其坐标/属性。在渲染方法中,每个对象只是在显示时自己绘制。