2

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

提前感谢您的回答

4

2 回答 2

3

我检查了 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此处输入您已经存在的内容,并且在加载第二个场景时,所有BodiesJoints应该自动添加到 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
于 2013-11-02T06:47:11.467 回答
0

我不了解 libGDX 加载器,在加载器的 C++ 版本中,可以轻松修改主要加载函数以将现有世界作为参数。如果现有世界不为空,它将被使用而不是创建一个新世界。否则,将照常创建一个新世界。

之前(伪代码!):

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;
}

同样的想法可能也可以用许多其他语言来实现。

于 2013-11-03T10:46:48.110 回答