我正在开发一款看起来相当不错的HTML5 3D fps引擎,但由于这可能是制作3D的最糟糕的语言选择之一,因此有时会出现明显的延迟。
我编程的动作(WASD)与渲染速度无关,所以有时它会非常生涩,但有时候它会以可接受的30+ fps(当然取决于CPU)工作。
我唯一无法理解的是跳跃:目前通过向下降变量添加正常数来完成跳跃(重力始终为负,然后通过碰撞检测进行校正)然后减去常数,这每次渲染一个新帧时都会调用,那就是当fps变低时,我觉得我在月球上。我更喜欢慢动作和慢动作。
如果我使用与移动时相同的方法(计算当前帧和最后一帧之间的时间),扣除的变量有时会变得太大而跳跃的顶点会变化(相比高fps的值的一半) - 这是不可接受的因为跳跃高度必须始终相同。
这里有一些伪代码可以帮助理解问题(在一个渲染例程中调用):
// when clicked on spacebar:
if(spacebar)
{
// this defines jumping apex
jump = 0.5
}
// constant added to y (vertical position) later in the code
cy += jump;
// terminal velocity = -2
if(jump > -2)
{
// gravity (apex multiple to get maximum height)
jump -= 0.05;
}
if(collision_with_floor)
{
// stop falling
cy = 0;
if(jump < 0)
{
jump = 0;
}
}
player.position.y += cy;
现在有时间依赖跳跃(在上面的代码中替换):
// terminal velocity = -2
if(jump > -2)
{
// gravity, 0.4 is an arbitrary constant
jump -= (now - last_frame)*0.4;
last_frame = now;
}
为了更好地说明这是一个正在发生的事情的图像:
蓝点表示帧渲染。
我甚至不确定这是编程跳跃例程的正确方法。基本上抽搐和恒定的跳跃高度比平滑和慢速效果好。
答案 0 :(得分:0)
如果帧更新太慢而无法获得准确的物理,那么也许你可以破解跳跃顶点,以便玩家总是击中它。这里的提示可能是当y速度从正变为负时。如果我正确地读取您的伪代码,那么它看起来像是:
old_cy = cy;
cy += jump;
if(old_cy > 0 && cy <= 0)
player.position.y = jump_apex_height;
就你的图表而言,我们的想法是你想要识别到达橙色线的蓝点,然后将其碰到虚线。
现在我正在思考它,如果玩家真的每次都必须达到跳跃顶点,那么这对于费率更新。