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和桌面.
这是要走的路: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中的游戏循环
这应该是足够的信息让你开始.
简单游戏的通常游戏循环可能如下所示(但不确定我是否理解正确)。
每个代表游戏对象的类都有 2 个公共方法: update(); 和渲染();每次调用 QTimer 对象时,您都会迭代所有游戏对象并调用它们的更新方法。之后,对 render method() 重复相同的操作;
在更新方法中,每个对象决定在游戏地图上做什么(移动/射击/站立/...)并更改其坐标/属性。在渲染方法中,每个对象只在显示器上绘制自己。
| 归档时间: |
|
| 查看次数: |
6062 次 |
| 最近记录: |