如何解决libGDX-Box2D世界步骤中的无尽循环
我正在使用libGDX开发一款小游戏,该游戏使用Box2D进行碰撞检测。一切正常,直到我在游戏中添加了箭头,以便玩家可以 shoot 。自从我添加了此功能以来,我面临的问题是游戏有时会卡住,并且不再起作用。
我认为此行为的原因是 Box2D世界步骤中某处的无限循环。当我使用调试器停止执行时,停止点始终在World.step(float,int,int)
方法中。不幸的是,这是本机方法,因此我无法找到问题的确切出处:
// from com.badlogic.gdx.physics.Box2d.World
public void step (float timestep,int veLocityIterations,int positionIterations) {
jniStep(addr,timestep,veLocityIterations,positionIterations);
}
private native void jniStep (long addr,float timestep,int positionIterations);
问题:
有时,当使用新的“拍摄箭头” 功能时,执行似乎停止并且游戏只是冻结。确实很难复制,因此我无法真正说出真正的根本原因是什么。仅当在Box2D世界中添加新的 arrow 时,它才会出现,但问题不会一直出现。
到目前为止,我已经尝试过:
- 为了验证问题是否在Box2D代码中,我尝试将箭头的夹具的 mask 更改为
0x0000
,所以它没有不会与任何其他物体碰撞。这实际上解决了这个问题(或者至少我再也无法重现了)。但这并没有太大帮助,因为没有击中任何东西的箭头在游戏中不是很有用... - 更改灯具的 mask ,使其不会与特定类别(称为
CATEGORY_OBSTACLE
)发生冲突,这似乎也可以解决该问题,但是我不知道为什么,并且仍然不是真正的解决方案...
代码:
由于我似乎甚至无法可靠地重现该问题,因此我也无法创建最小可重现的示例。我只能指向游戏的GitHub repo。抱歉:(当前代码位于分支projectile_bug中。
稍微解释一下代码:
- 类
GameScreen
有一个render
方法,从中调用了World.step
方法(导致无限循环的方法)。 - 类
Dwarf
有一个executeSpecialAction
方法,该方法通过某些工厂方法开始创建 arrow 。 - 最后,类
ProjectileFactory
有一个createProjectile
方法,该方法创建 arrow 并将其添加到世界中。
Box 2D固定装置使用的 - 类别 和 masks 放在
PhysicsBodyCategories
类中。 箭头的装置使用遮罩MASK_PLAYER_ATTACK
复制步骤:
由于我不太清楚问题的根本原因,因此只能通过在地图上拍摄一些箭头来重现该错误:
- 在
DesktopLauncher
子项目的类desktop
中,使用 main方法开始游戏。 - 移动到世界各地,并使用空格键 发射一些箭头
- 希望错误出现……通常需要花费很多箭头才能使错误出现(我提高了projectile_bug分支的发射率以加快速度)
问题:
我不确定是什么原因导致了此错误,对于Box2D还是很陌生。如果有人对如何解决此问题有任何想法,或者知道解决此问题的方法,那么它将对我有很大帮助。另外,如果您知道一些相关的,已报告的错误或类似的信息,那么它也可能会有所帮助。
谢谢。
解决方法
好吧,我咬了。根据我的经验,box2d在大多数情况下会崩溃或挂起,因为没有正确地销毁实体或固定装置,或者当悬挂的引用指向被销毁的物体时。因此,我只是尝试在step函数之后从您的代码print(df)
name age county pin
0 mark 22 York_USA_TXS 2225
1 stuart 23 kysjk_USA 2225
2 lewis 22 Monty_KYSJK 2226
中删除此语句,瞧,它起作用了。好游戏顺便说一句。当然,这不是解决方案,但可能会提示您在哪里寻找根本原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。