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 中删除此语句,瞧,它起作用了。好游戏顺便说一句。当然,这不是解决方案,但可能会提示您在哪里寻找根本原因。