因此,我只是更改了游戏更新功能,以根据实际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。通常,这是一个问游戏特定问题的好地方。

10-06 07:30
查看更多