gpt4 book ai didi

c++ - 如何使用 deltaTime 产生一致的运动

转载 作者:太空狗 更新时间:2023-10-29 23:48:33 26 4
gpt4 key购买 nike

我想创建一个基于速​​度移动的 2d 游戏。正如目前的代码一样,我正在使用增量时间来使帧速率之间的速度变化保持一致。然而,在跳跃时,在 144hz 显示器上运行时,每次跳跃的跳跃高度略有不同(最多约 3 像素差异,最大高度约为 104 像素),但当我切换到 60hz 时,跳跃高度立即增加平均约 5 像素,最大高度约为 109 像素。

我已经尝试过许多不同的变体,我应该用增量时间对哪些值进行归一化,但我总是回到这个最接近我想要的输出的变体。

static bool grounded = false;  

if (!grounded) {
velocity.y += (5000.0f * deltaTime); //gravity
}

if (keys[SPACE_INPUT]) { //jump command
if (grounded) {
position.y = 750;
velocity.y = -1000.0f;
grounded = false;
}
}

//Used to measure the max height of the jump
static float maxheight = position.y;

if (position.y < maxheight) {
maxheight = position.y;
std::cout << maxheight << std::endl;
}

//if at the top of the screen
if (position.y + (velocity.y * deltaTime) < 0) {
position.y = 0;
velocity.y = 0;
grounded = false;

//if at the bottom of the screen minus sprite height
} else if (position.y + (velocity.y * deltaTime) >= 800.0f - size.y) {
position.y = 800 - size.y;
velocity.y = 0;
grounded = true;

//if inside the screen
} else {
grounded = false;
position.y += (velocity.y * deltaTime);
}

我希望结果是无论刷新率如何, Sprite 每次都会向上移动相同的高度,但它会向上移动不同的量,即使在相同的刷新率下,尤其是在不同的刷新率之间。

最佳答案

公认的技术如下:

// this is in your mainloop, somewhere
const int smallStep = 10;

// deltaTime is a member or global, or anything that retains its value.
deltaTime += (time elapsed since last frame); // the += is important

while(deltaTime > smallStep)
{
RunPhysicsForTenMillis();
deltaTime -= smallStep;
}

基本上,您要做的是:每次开始运行物理时,您都会处理给定数量的步骤,比如 10 毫秒,这些步骤加起来就是帧之间的时间。runPhysicsForTenMillis() 函数的作用与上面的类似,但增量时间恒定(我的建议是 10 毫秒)。

这给你:

  • 决定论。无论您的 FPS 是多少,物理将始终以完全相同的步骤运行。
  • 稳健性。如果您的磁盘访问时间较长,或者存在一些流式传输延迟,或者任何使帧变长的事件,您的对象将不会跳入外太空。
  • 在线播放准备。一旦你进入在线多人游戏,你就必须选择一种方法。对于输入传递等许多技术,小步骤在线制作起来会容易得多。

关于c++ - 如何使用 deltaTime 产生一致的运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581471/

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