如何使用C++和QtQuick实现游戏循环

Ela*_*782 7 c++ qt game-engine qtquick2

我正在用QtQuick 2(Qt5.2)QML和C++开发游戏.我想要C++中的大部分游戏逻辑(我不想用JS做),而我正在尝试将QStateMachines用于很多逻辑.

现在我的问题是,如何在该场景中实现正确的游戏循环?

例如,游戏具有从屏幕上的某些路点移动的对象,因此我认为我无法完成基于状态/事件的所有事情.在某些时候我需要说"我的物体应该每秒向x方向移动10个像素".因此,例如当我的对象处于其"移动"状态时,它应该每秒移动一定量,然后当然必须检查某些条件是否必须切换状态(例如,"攻击").

现在,Qt-examples和web上的所有演示似乎都是完全基于事件的(例如,四行一样的胜利)或用JavaScript编写.所以我在这里有点迷失.

我能找到的一个想法是用一个例如30ms的定时器创建一个QTimer,并将该QTimer的timeout()信号连接到每个移动对象的advance()槽,并在'return app.exec();'之前启动该定时器.像这样:

QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &scene, SLOT(advance()));
timer.start(1000 / 33);
return app.exec();
Run Code Online (Sandbox Code Playgroud)

然后每个对象(例如鼠标)都有一个

void Mouse::advance(int step)
Run Code Online (Sandbox Code Playgroud)

但是,这需要一个QGraphicsScene,我不确定Android/iOS上的QtQuick/QML项目有多好.

这是一个好的解决方案吗?或者我对问题的看法有些错误,我不需要游戏循环来实现我的目标?

解决方案不应该使用Qt中任何仅限桌面的东西,即它应该适用于Android,iOS和桌面.

Dan*_*nez 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; 
    }
    
    Run Code Online (Sandbox Code Playgroud)

来源:Qt中的游戏循环

这应该是足够的信息让你开始.

  • @ArielM. - 您可以通过更详细的解决方案,链接,教程或示例提供更好的答案,而不是投票.这将是一个更聪明的方式来参与讨论. (2认同)

str*_*821 2

简单游戏的通常游戏循环可能如下所示(但不确定我是否理解正确)。

每个代表游戏对象的类都有 2 个公共方法: update(); 和渲染();每次调用 QTimer 对象时,您都会迭代所有游戏对象并调用它们的更新方法。之后,对 render method() 重复相同的操作;

在更新方法中,每个对象决定在游戏地图上做什么(移动/射击/站立/...)并更改其坐标/属性。在渲染方法中,每个对象只在显示器上绘制自己。