从internal
加载一个简单的文本文件很容易:
Gdx.files.internal("data/colors.txt");
但是我现在使用AssetManager
来加载AssetDescriptor<?>
数组中定义的资产,同时显示加载屏幕(带有进度指示器)。 所以我想在我的描述符数组中使用这样的东西:
... new AssetDescriptor<_type_>(Gdx.files.internal("data/colors.txt"), _type_.class), ...
我想通过资产管理器加载文件,所以整体进度可以显示为data/colors.txt
文件可以变得非常大,因此需要更长的时间来加载(我使用一个工具来自动生成一个很长的列表的颜色定义: RRR,GGG,BBB,AAA
,每个在0-255
的范围内)。
有没有这样做的好方法?
我search了wiki的答案,发现没有文本文件的Loader
( 见这里的列表 )。
所以我按照同一页上的说明写我自己的加载程序( 可以在这里find说明 )。 这就是我想到的:
Text
类基本上是一个简单String
的包装:
package mygame.assets; import com.badlogic.gdx.files.FileHandle; public class Text { private String string; public Text() { this.string = new String("".getBytes()); } public Text(byte[] data) { this.string = new String(data); } public Text(String string) { this.string = new String(string.getBytes()); } public Text(FileHandle file) { this.string = new String(file.readBytes()); } public Text(Text text) { this.string = new String(text.getString().getBytes()); } public void setString(String string) { this.string = string; } public String getString() { return this.string; } public void clear() { this.string = new String("".getBytes()); } }
TextLoader
类是Text
types的资源的相应的加载器类:
package mygame.assets.loaders; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetLoaderParameters; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import mygame.assets.Text; public class TextLoader extends AsynchronousAssetLoader<Text, TextLoader.TextParameter> { public TextLoader(FileHandleResolver resolver) { super(resolver); } Text text; @Override public void loadAsync(AssetManager manager, String fileName, FileHandle file, TextParameter parameter) { this.text = null; this.text = new Text(file); } @Override public Text loadSync(AssetManager manager, String fileName, FileHandle file, TextParameter parameter) { Text text = this.text; this.text = null; return text; } @SuppressWarnings("rawtypes") @Override public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, TextParameter parameter) { return null; } public static class TextParameter extends AssetLoaderParameters<Text> { } }
然后,在主类的create()
方法中注册Text
资源及其TextLoader
:
@Override public void create() { // ... // Assuming that the main class contains the global AssetManager assetManager.setLoader( Text.class, new TextLoader( new InternalFileHandleResolver() ) ); // ... }
要使用它:
assetLoader.load( new AssetDescriptor< Text >( "data/colors.txt", Text.class, new TextLoader.TextParameter() ); String string = assetLoader.get( "data/colors.txt", Text.class ).getString(); // Process the string
当你自动生成这些颜色定义,也许你可以生成它,而不是从文件加载。 如果加载的问题是文件的大小,可以考虑使用压缩。 但是,正如你想使用资产加载器,我会添加一些可能有用的链接。
要管理这些颜色定义资源,您可以编写自己的加载程序 。
你也可以考虑一个自定义的JSON序列化 。