Javascript 2D游戏:FPS低于20时碰撞检测失败
所以我只是改变了我的游戏更新功能,根据实际FPS和固定游戏FPS之间的差异来更新所有动作 例如,我将游戏设置为固定的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
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左右,这样您的帧速率就不会因为额外的帧速而降低很多。