2D游戏:如果FPS低于20,则碰撞检测失败

时间:2012-01-22 13:43:17

标签: javascript loops frame-rate

所以我改变了我的游戏更新功能,根据实际FPS和固定游戏FPS之间的差异更新了个人动作。

例如,我将游戏设置为固定的60 FPS。 如果实际FPS为20,我会计算差异:

((20 * 100) / 60) / 100会导致0.333 因此1游戏循环的差异为1 - 0.333 = 0.677

因此,所有游戏动作都不会根据正常游戏循环进行更新:

x += speedX * 1但宽度值增加:x += speedX * 1.677

所以现在我的游戏在每个系统上以相同的速度运行,只需少量图片,但这不是问题。

我不完全确定是否会导致collisoin检测失败,但我猜测随着游戏速度增加以匹配当前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个像素)时,他并不总是落空。

1 个答案:

答案 0 :(得分:1)

我现在正打电话,所以我无法检查你的样品。因此,如果我正在阅读你的碰撞检测内容,那么你更新玩家位置然后检查碰撞。如果帧速率足够低或物体移动得足够快,则意味着物体可以通过屏障“相位”。在帧更新之前完全位于帧的一侧,并且在帧更新之后完全位于帧的另一侧。

有几种方法可以解决这个问题,最直接的方法是不仅要测试对象现在的位置,还要测试它移动时的位置。实现一个碰撞检测算法,该算法可以检测玩家或物体必须通过的所有区域,以便从a到b获取并将碰撞基础化。

同时结帐gamedev.stackexchange.com。这通常是提出游戏特定问题的好地方。