Android Libgdx assetManager:资产未加载
Android Libgdx assetManager: asset not loaded
我在使用 assetManager 加载我的资产时遇到了一个奇怪的问题。我的 assetManager 是一个单独的 class,我让一切变得更短、更整洁。我的资产 class 不是静态的。我将所有资产加载到非静态 assetDescriptor 中。
我加载了启动画面,它在显示时加载了我的所有资产。当我调用另一个屏幕时,我加载的资产无法加载并导致我的游戏崩溃。闪屏确实加载了,但是当它分配一个新屏幕时它崩溃了。
我在这个问题上花了 2 天时间。尝试超过 15 种变化。不占上风。
我的错误信息是:
com.badlogic.gdx.utils.GdxRuntimeException: Asset not loaded: stuff.png
at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:144)
at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:167)
at com.nectar.pewdybird.mainMenu.<init>(mainMenu.java:71)
at com.nectar.pewdybird.pewdyBird.render(pewdyBird.java:68)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
Splash.class:
public Assets assets;
public void create(){
assets = new Assets();
assets.load();
}
public void render(){
if(assets.update()) {
setScreen(new mainMenu(this));
dispose();
} else {
//Splash Screen
gl.glClearColor(0,0,0,1);
gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
//Draws SplashScreen
batch.end();
}
}
public void dispose(){
this.screen.dispose();
this.batch.dispose();
}
mainMenu.class
public Assets assets;
private Texture Stuff;
public mainMenu(Splash game){
assets = game.assets;
Stuff = game.assets.manager.get(game.assets.stuff);
}
Asset.class
public AssetManager manager = new AssetManager(new InternalFileHandleResolver());
public final AssetDescriptor<Texture> stuff =
new AssetDescriptor<Texture>("stuff.png", Texture.class);
public void load(){
manager.load(stuff);
//12 More loads
manager.finishLoading();
}
public boolean update(){
return manager.update();
}
感谢您阅读并可能帮助解决我可能很简单的问题。
看看你的 mainMenu
class。您正在创建一个新的 Assets
对象,它没有任何资产,因此不要创建新的 Assets
对象,而是使用 Splash
的资产对象,因为您在该对象上加载了资产。
public Assets assets;
public Texture Stuff;
public mainMenu(){
assets = new Assets(); // why are you creating new Assets here
Stuff = assets.manager.get(assets.stuff);
}
实际上,您是通过在 Splash
class
中使用参数化构造函数来创建 mainMenu
的对象
public mainMenu(Splash splash){
assets = splash.assets; // instead of creating new take reference of Splash class assets
Stuff = assets.manager.get(assets.stuff);
}
我在使用 assetManager 加载我的资产时遇到了一个奇怪的问题。我的 assetManager 是一个单独的 class,我让一切变得更短、更整洁。我的资产 class 不是静态的。我将所有资产加载到非静态 assetDescriptor 中。
我加载了启动画面,它在显示时加载了我的所有资产。当我调用另一个屏幕时,我加载的资产无法加载并导致我的游戏崩溃。闪屏确实加载了,但是当它分配一个新屏幕时它崩溃了。
我在这个问题上花了 2 天时间。尝试超过 15 种变化。不占上风。
我的错误信息是:
com.badlogic.gdx.utils.GdxRuntimeException: Asset not loaded: stuff.png
at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:144)
at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:167)
at com.nectar.pewdybird.mainMenu.<init>(mainMenu.java:71)
at com.nectar.pewdybird.pewdyBird.render(pewdyBird.java:68)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
Splash.class:
public Assets assets;
public void create(){
assets = new Assets();
assets.load();
}
public void render(){
if(assets.update()) {
setScreen(new mainMenu(this));
dispose();
} else {
//Splash Screen
gl.glClearColor(0,0,0,1);
gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
//Draws SplashScreen
batch.end();
}
}
public void dispose(){
this.screen.dispose();
this.batch.dispose();
}
mainMenu.class
public Assets assets;
private Texture Stuff;
public mainMenu(Splash game){
assets = game.assets;
Stuff = game.assets.manager.get(game.assets.stuff);
}
Asset.class
public AssetManager manager = new AssetManager(new InternalFileHandleResolver());
public final AssetDescriptor<Texture> stuff =
new AssetDescriptor<Texture>("stuff.png", Texture.class);
public void load(){
manager.load(stuff);
//12 More loads
manager.finishLoading();
}
public boolean update(){
return manager.update();
}
感谢您阅读并可能帮助解决我可能很简单的问题。
看看你的 mainMenu
class。您正在创建一个新的 Assets
对象,它没有任何资产,因此不要创建新的 Assets
对象,而是使用 Splash
的资产对象,因为您在该对象上加载了资产。
public Assets assets;
public Texture Stuff;
public mainMenu(){
assets = new Assets(); // why are you creating new Assets here
Stuff = assets.manager.get(assets.stuff);
}
实际上,您是通过在 Splash
class
mainMenu
的对象
public mainMenu(Splash splash){
assets = splash.assets; // instead of creating new take reference of Splash class assets
Stuff = assets.manager.get(assets.stuff);
}