gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:27 24 4
gpt4 key购买 nike

我正在使用 QtQuick 2 (Qt5.2) QML 和 C++ 开发游戏。我想要 C++ 中的大部分游戏逻辑(我不想用 JS 来实现),并且我正在尝试使用 QStateMachines 来处理很多逻辑。

现在我的问题是,如何在这种情况下实现适当的游戏循环?

例如,游戏中的对象会在屏幕上的特定路径点之间移动,因此我认为我不能做所有基于状态/事件的事情。在某些时候我需要说“我的对象应该每秒在方向 x 上移动 10 个像素”。因此,例如当我的对象处于“移动”状态时,它应该每秒移动一定量,然后当然会检查某些条件是否必须切换状态(例如切换到“攻击”)。

现在,Qt 示例和网络上的所有演示似乎要么完全基于事件(例如,四连胜式),要么用 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 和桌面。

最佳答案

那就是要走的路: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

这应该足以让您入门。

关于c++ - 如何使用 C++ 和 QtQuick 实现游戏循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22121664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com