我正在用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世界添加新箭头时出现,但问题并非总是出现。
到目前为止,我已经尝试了:
0x0000
,这样它就不会与任何其他对象发生碰撞。这实际上解决了这个问题(或者至少我不能再复制它了)。但这并没有多大帮助,因为一支没有击中任何东西的箭在游戏中不是很有用
类别_障碍
)发生冲突,似乎也能解决问题,但我不知道为什么,而且这仍然不是真正的解决方案
代码:
由于我似乎甚至不能可靠地重现这个问题,我也无法创建一个最小的可重现示例。我只能指向游戏的GitHub回购。对此很抱歉:(当前代码放在分支projectile_bug。
要稍微解释一下代码:
GameScreen
有一个渲染
方法,其中调用了World.step
方法(导致循环的方法)。 Dwarf
有一个刽子手专用动作
方法,它通过一些工厂方法开始创建箭头。Project tileFactory
有一个createProject tileFactory
方法,该方法创建箭头并将其添加到世界中。物理类
类中。箭头的夹具使用遮罩MASK_PLAYER_ATTACK
复制的步骤:
因为我真的不知道问题的根本原因,这个错误只能通过在地图上发射一些箭头来重现:
桌面
-子项目中的类桌面启动器
中的main方法启动游戏
问题是:
我不确定是什么导致了这个错误,我对Box2D还是个新手。如果有人知道如何修复这个问题,或者知道解决这个问题的方法,那真的会对我有很大帮助。此外,如果你知道一些相关的、报告的错误或类似的东西,它也会有所帮助。
提前谢谢。
好吧,我咬一口。根据我的经验,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