Javascript 2D游戏:FPS低于20时碰撞检测失败

Javascript 2D游戏:FPS低于20时碰撞检测失败,javascript,loops,frame-rate,Javascript,Loops,Frame Rate,所以我只是改变了我的游戏更新功能,根据实际FPS和固定游戏FPS之间的差异来更新所有动作 例如,我将游戏设置为固定的60FPS。 如果实际FPS为20I,则计算差值如下: ((20*100)/60)/100,这将导致0.333 所以1游戏循环的差异是1-0.333=0.677 因此,不会根据正常的游戏循环更新所有游戏动作: x+=speedX*1但宽度增加值:x+=speedX*1.677 所以现在我的游戏在每个系统上都以相同的速度运行,只是画面少了,但这不是问题所在 我不完全确定这是否会导致c

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

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

((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;
}
<代码> var席= .yx.alp.gfield(x); var yi=这个.\u game.level.getField(这个.y); var left=this._game.level.levelData[“col”][(xi-1)+“,“+yi]?(xi-1)*32:空; var right=this._game.level.levelData[“col”][(xi+1)+“,“+yi]?(xi+1)*32:空; var top=this._game.level.levelData[“col”][xi+”,“+(yi-1)]?(yi-1)*32:空; var bottom=这个._game.level.levelData[“col”][xi+,“+(yi+1)]?(yi+1)*32:空; //会撞到地面吗? 如果(this.y+this.height>=bottom&&bottom!=null){ 这是事实; 如果(!this.jumping)this.y=底部-this.height; } //左 if(this.x=right&&right!=null){ this.x=右-this.width; }
这是播放器。
和
left/right
是网格上的碰撞平铺位置。 每个磁贴为32x32,播放器为25x25

以下是完整的游戏:[已删除]

编辑:问题实际上在其他地方,因为bottom不是null。
当我把播放器放在
底部-(this.height+1)
而不是
底部-this.height
(高出1个像素),他不会一直掉下去。

我现在在手机上,所以我无法查看你的样本。因此,如果我读对了你的碰撞检测资料,那么你就更新玩家的位置,然后检查碰撞情况。如果帧速率足够低或对象移动速度足够快,这意味着对象可以“相位”正确通过屏障。在帧更新之前完全位于它的一侧,在帧更新之后完全位于它的另一侧

有两种方法可以解决这个问题,最直接的方法是不仅测试对象现在在哪里,而且测试对象在移动时也在哪里。实现一个碰撞检测算法,检测玩家或物体从a到b必须经过的所有区域,并以此为基础进行碰撞


也请查看gamedev.stackexchange.com。这通常是一个问游戏特定问题的好地方

你做错了。更改碰撞对象的LOD,并且不会影响时间。@fazo你在说什么?几乎所有的游戏循环都会随着时间而调整。这就是帧率独立动画LOD=细节级别的基础?这只是一个2D HTML5游戏:@elias94xx你的碰撞检测算法是什么样子的?只是简单的“这两件事现在重叠了吗?”@32bitkid我编辑了我的第一篇文章。实际上,我只移动对象,如果它的当前位置与任何东西都没有碰撞。如果在下一次检查时发生碰撞,位置将被纠正。您可能是对的,当游戏更新更快时,对象会通过屏障。你的想法已经在我脑海里了,只是想确定我选择了最好的方式。我现在将尝试实现该算法,谢谢!解决这个问题的一种方法是实施最小物理时间步长。如果要强制执行60Hz物理模拟,且速度为20 fps,则在一帧中以20 fps帧时间的1/3步进物理三次。当然,物理更新所做的额外工作可以进一步降低帧速率,这被称为“显示井”问题。通常,您可以将额外的帧速数限制在3左右,这样您的帧速率就不会因为额外的帧速而降低很多。