首页 > 解决方案 > libGDX - Box2D 世界步骤中的无限循环

问题描述

我正在开发一个带有libGDX的小游戏,它使用Box2D进行碰撞检测。这工作得很好,直到我在游戏中添加了一个箭头,这样玩家就可以射击了。自从我添加了这个功能后,我面临着游戏时不时卡住并且不再反应的问题。

我认为这种行为的原因是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 velocityIterations, int positionIterations);

问题:

有时当使用新的“射箭”功能时,执行似乎停止并且游戏只是冻结。它真的很难重现,因此我无法真正说出真正的根本原因是什么。仅在向 Box2D 世界添加新箭头时出现,但问题并非一直出现。


到目前为止我已经尝试过:


编码:

由于我似乎无法可靠地重现该问题,因此我也无法创建一个最小的可重现示例。我只能指向游戏的GitHub 存储库。对此感到抱歉:(当前代码放在分支projectile_bug中。

稍微解释一下代码:


重现步骤:

由于我并不真正知道问题的根本原因,因此只能通过在地图上射击一些箭头来重现该错误:


问题:

我不确定是什么导致了这个错误,而且我对 Box2D 还是很陌生。如果有人对如何解决此问题有任何想法或知道解决此问题的方法,那真的会对我有很大帮助。此外,如果您知道一些相关的、报告的错误或类似的东西,它也会有所帮助。

提前致谢。

标签: javalibgdxbox2d

解决方案


好吧,我咬它。以我的经验,box2d 在大多数情况下会崩溃或挂起,因为身体或固定装置没有被正确销毁,或者当有一些对被破坏的身体的悬空引用时。所以我只是试图PhysicsWorld.getInstance().removeBodiesAndFixtures();在 step 函数之后从你的代码中删除这个语句,瞧,它有效。不错的游戏顺便说一句。这当然不是解决方案,但它可能会提示您在哪里搜索根本原因。


推荐阅读