我检查了 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 都应该自动添加到这个World,而不是一个全新的。
编辑2:
快速了解如何完成:
将此添加到RubeWorldSerializer:public static World mergeWorld;。
像这样改变世界初始化:
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