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

时间:2014-03-01 23:12:35

标签: c++ qt game-engine qtquick2

我正在使用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和桌面。

2 个答案:

答案 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; 
    }
    

来源:Game loop in Qt

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

答案 1 :(得分:1)

简单游戏的常用游戏循环可能看起来像这样(不确定我是否理解正确)。

每个代表游戏对象的类都有2个公共方法:update();和render(); 在每次调用QTimer对象时,您将遍历所有游戏对象并调用其更新方法。之后,为render method();

重复相同的操作

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