好吧,我使用RubeLoader在libgdx上加载我的rube文件。
但是我注意到我只能加载一个json文件
代码:
loader = new RubeSceneLoader();
scene = loader.loadScene(Gdx.files.internal("test.json"));
World mWorld ;
mWorld = scene.getWorld();
正如您所看到的,如果我想加载另一个json文件,它会因为这一行而销毁前一个文件:
mWorld = scene.getWorld();
所以我的问题是:如何加载多个json文件或如何将不同的世界合并为一个?
提前感谢您的回答
答案 0 :(得分:3)
我检查了RubeLoader和libGDX的源代码,看不出它为什么要打破第一世界。之后我自己检查过(不是很广泛,但我认为我已经覆盖了你的用例)并且它对我来说很好。
Box2D,LibGDX和RubeLoader支持多个世界。但是,当然你需要多个世界实例。
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
而不是一个全新的。
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
答案 1 :(得分:0)
我不知道libGDX加载器,在加载器的C ++版本中,可以轻松修改主加载函数以将现有世界作为参数。如果现有世界不为null,则将使用它而不是创建新世界。否则,将正常创建一个新世界。
之前(伪代码!):
World loadWorld( File f ) {
World w = <make a new world>
//load the scene into w
return w;
}
后:
World loadWorld( File f, World w ) {
if ( w == null )
w = <make a new world>
//load the scene into w
return w;
}
同样的想法也许可以在许多其他语言中完成。