我检查了 RubeLoader 和 libGDX 的源代码,看不出它为什么要打破第一世界。之后我自己检查了它(不是很广泛,但我想我涵盖了你的用例),它对我来说很好用。
Box2D、LibGDX 和 RubeLoader 支持多个世界。但是当然你需要多个 World 实例。
loader1 = new RubeSceneLoader();
scene1 = loader1.loadScene(Gdx.files.internal("XXXX.json"));
World mWorld1 = scene1.getWorld();
loader2 = new RubeSceneLoader();
scene2 = loader2.loadScene(Gdx.files.internal("ABCD.json"));
World mWorld2 = scene2.getWorld();
现在你有两个Worlds
,它们应该都可以正常工作,但是在这一点上合并它们并不容易。因为您必须从内部或相反的方式重新创建所有mWorld2
内容mWorld1
。我建议您以编程方式合并两个 JSON 文件(libGDX 已经有必要的 JSON 工具,但您可能会使用其他小型 json 库,例如Jackson),然后加载这个合并的场景。这应该比合并两个容易得多Worlds
。
编辑:如果您需要Worlds
从一开始就合并不正确,但过了一段时间,最简单的方法是修改RubeWorldSerializer
. 具体这部分:
World world = new World(gravity, allowSleep);
world.setAutoClearForces(autoClearForces);
world.setContinuousPhysics(continuousPhysics);
world.setWarmStarting(warmStarting);
尝试找到一种方法在mWorld1
此处输入您已经存在的内容,并且在加载第二个场景时,所有Bodies
和Joints
应该自动添加到 thisWorld
中,而不是一个全新的场景。
Edit2:快速了解如何完成:
将此添加到RubeWorldSerializer
: public static World mergeWorld;
。
像这样更改 World 初始化:
World world;
if (RubeWorldSerializer.mergeWorld == null) {
world = new World(gravity, allowSleep);
world.setAutoClearForces(autoClearForces);
world.setContinuousPhysics(continuousPhysics);
world.setWarmStarting(warmStarting);
} else {
world = RubeWorldSerializer.mergeWorld;
}
现在您的加载必须如下所示:
loader1 = new RubeSceneLoader();
scene1 = loader1.loadScene(Gdx.files.internal("XXXX.json"));
World mWorld1 = scene1.getWorld();
RubeWorldSerializer.mergeWorld = mWorld1; // this is important in between your loading.
loader2 = new RubeSceneLoader();
scene2 = loader2.loadScene(Gdx.files.internal("ABCD.json"));
World mWorld2 = scene2.getWorld(); // in theory mWorld2 should be the same like mWorld1 now, and it should be both worlds merged