当我第一次开始使用 Qt 时,我遇到了一个similar 的问题,并得到了与您相同的答案(这是正确的)。与使用 SDL 相比,这是一种不同的思维方式。
我想添加一种方法,让您可以控制更新。有人与我分享此内容已有一段时间了,但据我所知,这与确保一致的更新频率有关。
无论它是否比仅使用简单的计时器有所改进,拥有一些实际代码将帮助您入门。此外,获得 delta(计算球和球拍的位置)是您必须自己做的事情,这段代码已经为您做了。
这是GameTimer的肉:
void GameTimer::doUpdate()
{
// Update by constant amount each loop until we've used the time elapsed since the last frame.
static const qreal delta = 1.0 / mFps;
// In seconds.
qreal secondsSinceLastUpdate = mElapsedTimer.restart() * 0.001;
mRemainder += secondsSinceLastUpdate;
while (mRemainder > 0) {
emit updated(delta);
mDateTime = dateFromSimulatedTime();
mRemainder -= delta;
mSimulatedTime += delta;
}
}
在 C++ 中使用,如 this:
void DirectPather::timerUpdated(qreal delta)
{
QHashIterator<QuickEntity*, DirectPathData> it(mData);
while (it.hasNext()) {
it.next();
QuickEntity *entity = it.key();
DirectPathData pathData = it.value();
if (mSteeringAgent->steerTo(entity, pathData.targetPos, delta)) {
mData.remove(entity);
}
}
}
因为这个例子 (quickpather) 是基于 QML 的,所以它有一个复杂的 setter 用于连接到计时器。如果您不需要像示例中那样在 QML 中添加内容,您可以在 C++ 中创建计时器并在必要时直接连接到其更新信号:
connect(mTimer, &GameTimer::updated, foo, &MyGameObject::update);
// ...
connect(mTimer, &GameTimer::updated, bar, &MyOtherGameObject::update);
增量以秒为单位(1.0 == 一秒)。
您可以从示例中获取所需的任何内容来帮助您开始游戏。
直接回答您的一些问题:
我见过一些例子,只是使用一个计时器,然后调整属性,例如这个:https://github.com/NicholasVanSickle/QtQuickTests/blob/master/Pong.qml但这真的是这样做的方法吗?在这种情况下,您将拥有更新 QML 属性和计时器的循环,我不明白它们是如何协同工作的。
我不建议像这个游戏那样在 QML/JavaScript 中执行逻辑。 C++ 比 JavaScript 更适合这个(又名更快)。不过,像脚本这样的东西非常适合 JavaScript。
还有一些使用 QML 的游戏引擎。我想知道如何在游戏循环中使用 QML。例如,您可以在 C++ 中编写游戏循环,然后在其上添加 QML 吗?或者推荐的方法是什么。遗憾的是,我在任何 Qt 文档中都找不到这个。
我的“引擎”使用 C++ 处理所有逻辑(脚本除外,它们相对较小),使用 QML 处理 GUI 和实体(动画、精灵等)。
我认为没有关于这个确切主题的任何文档(用 C++ 编写的带有 QML 前端的游戏),但有一些基于 QML 的游戏示例: