我目前正在为Android开发游戏,我希望您在我遇到的问题上获得专业知识。
背景
我的游戏融合了帧速率独立运动 在执行必要的速度之前考虑增量时间值 计算
游戏是传统的2D平台游戏。
问题:
这是我的问题(简化)。让我们假装我的角色是一个站在平台顶部的正方形(“重力”是一个恒定向下的characterVelocityDown速度)。
我已将碰撞检测定义如下(假设Y轴指向下方):
鉴于 characterFootY 是我的方形字符底边的y坐标, platformSurfaceY 是我平台的上y坐标, platformBaseY 是我平台的较低y坐标:
if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) {
//Collision Is True
characterFootY = platformSurfaceY;
characterVelocityDown = 0;
} else{
characterVelocityDown = deltaTime * 6;
当游戏以常规速度运行时,这种方法非常适用;但是,如果游戏速度变慢, deltaTime (前一帧与当前帧之间经过的时间)变大, characterFootY + characterVelocityDown < / strong>超出定义碰撞检测的边界,角色直接穿过(就像传送)。
我应如何处理此问题以防止此问题?
先谢谢你的帮助,我期待着向你学习!
答案 0 :(得分:1)
我想这里的问题是减速是不可避免的。您可以尝试优化代码,但是您总是会让用户使用速度较慢的设备或游戏的繁忙部分,而这需要比平时更长的时间来处理所有代码。而不是假设一致的delta,假设相反。代码意识到有人可以尝试在算盘上安装它。
所以基本上,正如SeveN所说,让你的游戏循环处理速度减慢。唯一真正做到这一点的方法(在我公认的有限经验中)将是对大三角洲的限制。这将导致您的时钟没有按时准时运行,但是当您考虑它时,这就是大多数游戏处理减速的方式。你不会在你的奔腾66上启动星际争霸并让它以5 FPS但全速运行,它会减速并正常处理它,尽管是幻灯片。
如果你做了这样的事情,那么在你的游戏放缓期间,它会明显变慢......但计算结果应该仍然存在。
编辑:刚认识到你是SeveN。做得好。
答案 1 :(得分:1)
你需要做的是运行具有恒定增量时间的物理循环,并根据需要用当前刻度迭代它。
const float PHYSICS_TICK = 1/60.f; // 60 FPS
void Update( float dt )
{
m_dt += dt;
while( m_dt > PHYSICS_TICK )
{
UpdatePhysics( PHYSICS_TICK );
m_dt -= PHYSICS_TICK;
}
}
有多种技术用于处理左边的勾号(m_dt)
最小蜱和最大蜱的上限也是必须的。