所以我改变了我的游戏更新功能,根据实际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个像素)时,他并不总是落空。
答案 0 :(得分:1)
我现在正打电话,所以我无法检查你的样品。因此,如果我正在阅读你的碰撞检测内容,那么你更新玩家位置然后检查碰撞。如果帧速率足够低或物体移动得足够快,则意味着物体可以通过屏障“相位”。在帧更新之前完全位于帧的一侧,并且在帧更新之后完全位于帧的另一侧。
有几种方法可以解决这个问题,最直接的方法是不仅要测试对象现在的位置,还要测试它移动时的位置。实现一个碰撞检测算法,该算法可以检测玩家或物体必须通过的所有区域,以便从a到b获取并将碰撞基础化。
同时结帐gamedev.stackexchange.com。这通常是提出游戏特定问题的好地方。