因此,我只是更改了游戏更新功能,以根据实际FPS与固定游戏FPS之间的差异来更新Alle动作。
例如,我将游戏设置为固定的60
FPS。
如果实际的FPS是20
,我将计算出这样的差异:((20 * 100) / 60) / 100
这将导致0.333
因此,1
游戏循环的差异为1 - 0.333 = 0.677
因此,不会根据正常游戏循环来更新所有游戏动作:x += speedX * 1
但宽度增加了一个值:x += speedX * 1.677
因此,现在我的游戏在每个系统上以相同的速度运行,只需要较少的图片,但这不是问题。
我不确定是否会导致碰撞检测失败,但是我猜想随着游戏速度的提高以匹配当前的fps,碰撞检测不再能够跟踪所有事件,因为位置被跳过了。它只会检查玩家周围是否有碰撞。
我该如何解决这个问题?
编辑:
这是冲突检测的示例:
var xi = this._game.level.getField(this.x);
var yi = this._game.level.getField(this.y);
var left = this._game.level.levelData["col"][(xi-1) + "," + yi] ? (xi-1) * 32 : null;
var right = this._game.level.levelData["col"][(xi+1) + "," + yi] ? (xi+1) * 32 : null;
var top = this._game.level.levelData["col"][xi + "," + (yi-1)] ? (yi-1) * 32 : null;
var bottom = this._game.level.levelData["col"][xi + "," + (yi+1)] ? (yi+1) * 32 : null;
// Will hit ground ?
if (this.y + this.height >= bottom && bottom != null) {
this.ground = true;
if (!this.jumping) this.y = bottom - this.height;
}
// Left
if (this.x <= left + 32 && left != null) {
this.x = left + 32;
}
// Right
if (this.x + this.width >= right && right != null) {
this.x = right - this.width;
}
this
是玩家。和
left/right
是网格上的碰撞图块位置。每个图块为32x32,播放器为25x25。
这是完整的游戏:[已删除]
编辑:问题实际上是在其他地方,因为bottom不为null。
当我将播放器放在
bottom - (this.height + 1)
而不是bottom - this.height
(高1像素)时,他不会一直掉下去。 最佳答案
我现在正在手机上,所以我无法检查您的样品。因此,如果我正确地阅读了您的碰撞检测材料,则可以更新玩家位置,然后检查碰撞。如果帧频足够低或物体移动得足够快,则意味着物体可以“穿过障碍物”。在帧更新之前完全位于其一侧,而在帧更新之后完全位于其另一侧。
有两种方法可以解决此问题,最直接的方法是不仅测试对象现在的位置,还测试对象在移动时的位置。实现碰撞检测算法,该算法检测玩家或对象从a到b所必须经过的所有区域,并基于此进行碰撞。
还要签出gamedev.stackexchange.com。通常,这是一个问游戏特定问题的好地方。