(Libgdx和Rube Box2d)合并世界

时间:2013-11-01 23:39:49

标签: java android box2d libgdx

好吧,我使用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文件或如何将不同的世界合并为一个?

提前感谢您的回答

2 个答案:

答案 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,它们都应该可以正常工作,但是在这一点上合并它们并不容易。因为您必须从mWorld2mWorld1或其他方式重新创建所有内容。我建议你以编程方式合并两个JSON文件(libGDX已经有必要的JSON工具,但你可能会使用其他小的json库,如Jackson),然后加载这个合并的场景。这应该比合并两个Worlds容易得多。

编辑: 如果您需要从一开始就合并Worlds,但过了一段时间,最简单的方法是修改RubeWorldSerializer。特别是这部分:

World world = new World(gravity, allowSleep);
world.setAutoClearForces(autoClearForces);
world.setContinuousPhysics(continuousPhysics);
world.setWarmStarting(warmStarting);

尝试找到一种方法来输入您现有的mWorld1,而在加载第二个场景时,所有BodiesJoints都应自动添加到此World而不是一个全新的。

EDIT2: 快速了解如何做到这一点:

将其添加到RubeWorldSerializerpublic 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;
}

同样的想法也许可以在许多其他语言中完成。