当前位置: 首页 > 知识库问答 >
问题:

libGDX-Box2D世界级无限循环

从渊
2023-03-14

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

我认为这种行为的原因是Box2D世界步骤中的某个地方有一个无休止的循环。当我使用调试器停止执行时,停止点总是在World.step(浮动、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世界添加新箭头时出现,但问题并非总是出现。

到目前为止,我已经尝试了:

  • 为了验证问题是否存在于Box2D代码中,我尝试将箭头装置的遮罩更改为0x0000,这样它就不会与任何其他对象发生碰撞。这实际上解决了这个问题(或者至少我不能再复制它了)。但这并没有多大帮助,因为一支没有击中任何东西的箭在游戏中不是很有用
  • 更改夹具的遮罩,使其不会与特定类别(称为类别_障碍)发生冲突,似乎也能解决问题,但我不知道为什么,而且这仍然不是真正的解决方案

代码:

由于我似乎甚至不能可靠地重现这个问题,我也无法创建一个最小的可重现示例。我只能指向游戏的GitHub回购。对此很抱歉:(当前代码放在分支projectile_bug。

要稍微解释一下代码:

  • GameScreen有一个渲染方法,其中调用了World.step方法(导致循环的方法)。
  • Dwarf有一个刽子手专用动作方法,它通过一些工厂方法开始创建箭头。
  • 最后,类Project tileFactory有一个createProject tileFactory方法,该方法创建箭头并将其添加到世界中。
  • Box2D夹具所使用的类别和遮罩被放置在物理类类中。箭头的夹具使用遮罩MASK_PLAYER_ATTACK

复制的步骤:

因为我真的不知道问题的根本原因,这个错误只能通过在地图上发射一些箭头来重现:

  • 使用桌面-子项目中的类桌面启动器中的main方法启动游戏
  • 在世界各地移动并使用空格键发射一些箭头
  • 希望虫子出现。。。通常需要相当多的箭头才能让虫子出现(我增加了投射物_虫子分支的射速,以加快速度)

问题是:

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

提前谢谢。

共有1个答案

云长恨
2023-03-14

好吧,我咬一口。根据我的经验,box2d在大多数情况下都会在尸体或固定装置未正确销毁,或者有一些关于已销毁尸体的悬空引用时崩溃或挂起。所以我试着从你的代码PhysicsWorld中删除这个语句。getInstance()。移除车身和固定装置() 就在step函数之后,瞧,它工作了。顺便说一句,这当然不是解决方案,但它可能会给你一个寻找根本原因的提示。

 类似资料:
  • 我正在使用ContactListener测试box 2D中两个物体之间的碰撞 这是我在世界上使用的所有contactListener类。设置ContactListener(new Box2DWorld(this))以添加它 我的dedub是这样的 beginContact preSolve postSolve。preSolve postSolve beginContact preSolve END

  • 我正在尝试使用LibGDX来掌握游戏开发的窍门,到目前为止,我已经理解了它的一切,因为它是基本的Java,并且很好地使用了接口和超级类。 我正在努力将图形融入到LibGDX项目中,我正在使用Tiled创建地图,我了解它的工作原理以及如何渲染它们。 我也开始进入Box2D学习物理,我能够包装我的地图(平铺的…)用Box2D。 当我尝试从Spine导入项目时,出现了问题,我访问了以下链接:https:

  • 我想创造一个像飞鸟一样的游戏。我想让玩家在屏幕上不断跳跃。我创造了这个代码,它不像一只扑翼鸟跳 代码: 问题是当用户在屏幕上快速点击时,玩家就像火箭一样被击中。当玩家跌倒时,跳跃更低。我该如何解决这个问题,并获得相同的跳跃强度? 我的解决方案:

  • 问题内容: 我刚刚开始使用libgdx创建游戏。它是使用scene2d ui的自上而下的2d射击游戏。现在我想,我可以在某些程度上增加黑暗和光明,但是我不想使用box2d重写所有内容。我不需要逼真的阴影,只需某种环境光和围绕我角色的光圈即可,不受周围墙壁和其他障碍物的影响。所以我想知道libgdx中是否有任何照明系统?或者我可以不使用box2d物体/世界而使用box2dlights吗?谢谢 问题答

  • 问题内容: 我有一个使用FitViewport的尺寸为800x480的游戏世界,最初使用像素来渲染box2d物体+固定装置,因此所有物理效果看起来都是漂浮而缓慢的。通过查看文档,我发现box2d使用度量单位,因此我将box2d的位置和大小转换为32倍,因此最终得到了25x15米的box2d世界。 我遇到的问题是,现在box2d对象变得非常小。如何缩小它们,使它们在屏幕上显示常规尺寸? 问题答案:

  • 我开始在libgdx中开发terraria克隆,并生成了图块。图块被分成16x16的块,但是生成所有的块需要太长的时间。目前,我正在生成400个块(102400个块)。我是这样产生这些块的: 区块类内部的平铺生成代码: 生成一个如此大小的世界大约需要2分钟。我知道这是一个很大的数字,但我很好奇Terraria(或任何其他克隆)是如何设法使时间变小的。谢谢! 编辑:这是块类(http://paste