Libgdx e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(tex
e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(textureAtlasPath,TextureAtlas.class); 最终皮肤=新皮肤(阿特拉斯); //将位图字体添加到皮肤 for(int-fontSize:parameter.fontSizesToCreate){ skin.add(“font_”+fontSize,manager.get(“font”+fontSize+“.ttf”)); } //现在加载皮肤,因为json文件中的字体现在可用 skin.load(文件); 返回皮肤; } @凌驾 public void loadAsync(最终AssetManager管理器、最终字符串文件名、最终文件句柄文件、最终SkinParameter参数){ }} 公共类皮肤扩展com.badlogic.gdx.scenes.scene2d.ui.Skin{ 皮肤(最终纹理图谱){ 超级(阿特拉斯); } @凌驾 公共空间处置(){ 对于(字符串bitmapFontKey:this.getAll(BitmapFont.class).keys()){ 删除(bitmapFontKey,BitmapFont.class); } super.dispose(); }}Libgdx e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(tex,libgdx,dependencies,assets,dispose,skin,Libgdx,Dependencies,Assets,Dispose,Skin,e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(textureAtlasPath,TextureAtlas.class); 最终皮肤=新皮肤(阿特拉斯); //将位图字体添加到皮肤 for(int-fontSize:parameter.fontSizesToCreate){ skin.add(“f
非常优雅的解决方案。谢谢分享!
public class Test extends Game {
private AssetManager assetManager;
private Skin skin;
private Batch batch;
@Override
public void create() {
this.assetManager = new AssetManager();
final FileHandleResolver resolver = new InternalFileHandleResolver();
assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
assetManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));
final ObjectMap<String, Object> resources = new ObjectMap<String, Object>();
final FreetypeFontLoader.FreeTypeFontLoaderParameter fontParam = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
fontParam.fontFileName = "ui/font.ttf";
fontParam.fontParameters.size = (int) (16 * Gdx.graphics.getDensity());
assetManager.load("font16.ttf", BitmapFont.class, fontParam);
assetManager.finishLoading();
resources.put("font_16", assetManager.get("font16.ttf", BitmapFont.class));
assetManager.load("ui/ui.json", Skin.class, new SkinLoader.SkinParameter(resources));
assetManager.finishLoading();
skin = assetManager.get("ui/ui.json", Skin.class);
batch = new SpriteBatch();
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
skin.get("font_16", BitmapFont.class).draw(batch, "Test123", 10, 10);
batch.end();
}
@Override
public void dispose() {
super.dispose();
// enabling the next line will get rid of the Pixmap already disposed exception
// skin.remove("font_16", BitmapFont.class);
assetManager.dispose();
batch.dispose();
}
}
public void dispose () {
if (atlas != null) atlas.dispose();
for (ObjectMap<String, Object> entry : resources.values()) {
for (Object resource : entry.values())
if (resource instanceof Disposable) ((Disposable)resource).dispose();
}
}
public class SkinLoader extends AsynchronousAssetLoader<Skin, SkinLoader.SkinParameter> {
public static class SkinParameter extends AssetLoaderParameters<Skin> {
private final String fontPath;
private final int[] fontSizesToCreate;
public SkinParameter(final String fontPath, final int... fontSizesToCreate) {
if (fontPath == null || fontPath.trim().isEmpty()) {
throw new GdxRuntimeException("fontPath cannot be null or empty");
}
if (fontSizesToCreate.length == 0) {
throw new GdxRuntimeException("fontSizesToCreate has to contain at least one value");
}
this.fontPath = fontPath;
this.fontSizesToCreate = fontSizesToCreate;
}
}
public SkinLoader(final FileHandleResolver resolver) {
super(resolver);
}
@Override
@SuppressWarnings("unchecked")
public Array<AssetDescriptor> getDependencies(final String fileName, final FileHandle file, final SkinParameter parameter) {
if (parameter == null) {
throw new GdxRuntimeException("SkinParameter cannot be null");
}
// texture atlas dependency
final Array<AssetDescriptor> dependencies = new Array<AssetDescriptor>();
dependencies.add(new AssetDescriptor(file.pathWithoutExtension() + ".atlas", TextureAtlas.class));
// bitmap font dependencies
for (int fontSize : parameter.fontSizesToCreate) {
final FreetypeFontLoader.FreeTypeFontLoaderParameter fontParam = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
fontParam.fontFileName = parameter.fontPath;
// enable anti-aliasing
fontParam.fontParameters.minFilter = Texture.TextureFilter.Linear;
fontParam.fontParameters.magFilter = Texture.TextureFilter.Linear;
// create font according to density of target device display
fontParam.fontParameters.size = (int) (fontSize * Gdx.graphics.getDensity());
dependencies.add(new AssetDescriptor("font" + fontSize + ".ttf", BitmapFont.class, fontParam));
}
return dependencies;
}
@Override
public Skin loadSync(final AssetManager manager, final String fileName, final FileHandle file, final SkinParameter parameter) {
// load atlas and create skin
final String textureAtlasPath = file.pathWithoutExtension() + ".atlas";
final TextureAtlas atlas = manager.get(textureAtlasPath, TextureAtlas.class);
final Skin skin = new Skin(atlas);
// add bitmap fonts to skin
for (int fontSize : parameter.fontSizesToCreate) {
skin.add("font_" + fontSize, manager.get("font" + fontSize + ".ttf"));
}
// load skin now because the fonts in the json file are now available
skin.load(file);
return skin;
}
@Override
public void loadAsync(final AssetManager manager, final String fileName, final FileHandle file, final SkinParameter parameter) {
}}
public class Skin extends com.badlogic.gdx.scenes.scene2d.ui.Skin {
Skin(final TextureAtlas atlas) {
super(atlas);
}
@Override
public void dispose() {
for (String bitmapFontKey : this.getAll(BitmapFont.class).keys()) {
remove(bitmapFontKey, BitmapFont.class);
}
super.dispose();
}}