如何在不同的tilesMaps之间共享tileSets?

时间:2015-10-23 15:48:31

标签: libgdx

如果我有几个.tmx文件使用相同的tileSet,显然我只想加载一次tileSet纹理,但是如果我使用常规方法来做,纹理加载两次... < / p>

TmxMapLoader loader = new TmxMapLoader();

TiledMap tiledMap1 = loader.load("map-test.tmx");
TiledMap tiledMap2 = loader.load("map-test.tmx");

Texture texture1 = tiledMap1.getTileSets().getTile(1).getTextureRegion().getTexture();
Texture texture2 = tiledMap2.getTileSets().getTile(1).getTextureRegion().getTexture();

// texture1 is different than texture2

所以我的问题是,有没有办法避免地图多次加载相同的资产?

我可能会写完自己的TmxLoader,因为我不希望它从图像层加载图像,但用实际的游戏对象替换它们......但我想知道 vanilla 方式......

修改 David Saltares提供的解决方案就是我需要的解决方案,所以我会留下正确的代码:

// supossing that both maps use the same tileset image...
TmxMapLoader loader = new TmxMapLoader();
assetManager.setLoader(TiledMap.class, loader);
assetManager.load("map-test1.tmx", TiledMap.class);
assetManager.load("map-test2.tmx", TiledMap.class);

assetManager.finishLoading();
TiledMap tiledMap1 = assetManager.get("map-test1.tmx");
TiledMap tiledMap2 = assetManager.get("map-test2.tmx");

Texture texture1 = tiledMap1.getTileSets().getTile(1).getTextureRegion().getTexture();
Texture texture2 = tiledMap2.getTileSets().getTile(1).getTextureRegion().getTexture();
// now texture1 == texture2 :)

我想知道的是,为什么这不是默认值?我的意思是,默认情况下,assetManager有很多加载器,但不是tmx加载器......

1 个答案:

答案 0 :(得分:1)

使用AssetManager,调用其setLoader方法传递TmxMapLoader的新实例。

通过资产管理器加载地图时,tmx加载程序将尝试处理它并告诉资产管理器所有依赖项。其中一个依赖项将是tile的纹理。资产管理器将满足依赖关系,然后实际上会加载地图。

管理者下的所有资产都被引用计数,因此在同一句柄上调用load(),实际上不会分配更多内存。

这意味着,当加载第二个映射并且管理器尝试满足其依赖关系时,它将发现纹理已经加载。它只会将引用计数增加一个。