Android Libgdx:AssetManager未加载资产
好吧,我只是在与libgdx中的AssetManager进行斗争。我遵循了每一个教程,阅读了每一个维基页面,但我无法让它发挥作用 资产类别:Android Libgdx:AssetManager未加载资产,android,libgdx,assets,Android,Libgdx,Assets,好吧,我只是在与libgdx中的AssetManager进行斗争。我遵循了每一个教程,阅读了每一个维基页面,但我无法让它发挥作用 资产类别: public class Assets { private static final AssetManager manager = new AssetManager(); public static final String background = "data/lawn.png"; public static void load() { ma
public class Assets {
private static final AssetManager manager = new AssetManager();
public static final String background = "data/lawn.png";
public static void load() {
manager.load(background, Texture.class);
}
public static void dispose() {
manager.dispose();
}
public static boolean update() {
return manager.update();
}
主要类别:
public class TombStone extends Game implements Screen {
@Override
public void create () {
Assets.manager.update();
}
我在Screen类中将我的纹理称为:
public class StoneScreen implements Screen{
public Texture texture;
public StoneScreen(TombStone gam){
loadStandard();
}
public void loadStandard() {
texture= Assets.manager.get(Assets.background, Texture.class);
}
因此,当我运行应用程序时,它会在显示任何内容之前崩溃:
“致命异常:GLThread 32182”“未加载资产:assets/data/lawn.png”您的代码有太多错误
public class Assets {
public static final AssetManager manager = new AssetManager(); // 1)
public static final String background = "assets/data/lawn.png"; // 2)
public static void load() {
manager.load(background, Texture.class);
manager.get(background, Texture.class); // 3)
}
public static void dispose() {
manager.dispose();
}
public static boolean update() {
return manager.update();
}
public class TombStone extends Game implements Screen { // 4)
@Override
public void render () {
//assets.manager.update();
Assets.load(); // 5)
Assets.manager.update();
super.render();
}
1) 您的经理是公开的,但您仍然提供其他方法来操作它(例如更新和处置)。将其设置为私有或删除方法,并直接处理资产.manager
2) 资产相对于资产
目录。这就是为什么它应该是data/lawn.png
3) 这就是为什么会出现异常AssetManager.load()
只是标记要加载的内容,但尚未立即加载。这是AssetManager.update()
(异步)或AssetManager.finishLoading()
(同步)所做的。如果在实际加载之前尝试使用AssetManager.get(),则会出现此异常。只需删除这一行
4) 扩展游戏
和实现屏幕
是没有意义的。一次只做其中一个。游戏有屏幕,但它本身不是屏幕
5) 您正在反复标记要加载的资产<代码>渲染()每帧调用一次。将
Assets.load()
移动到屏幕.show()
方法,该方法只执行一次。我知道这是前一段时间提出的(并且部分得到了回答),但我会给出我的修复方法。
在渲染方法中,放置如下内容:
if (!assetManager.update()) return;
这将更新资产管理器(如果尚未更新),并阻止您渲染卸载的纹理。资产管理器可以以同步和异步方式工作
- 异步:在加载资产的过程中,显示一个加载进度条。这是异步的,因为更新屏幕时在后台加载资产。您可以通过反复调用assetManager.update()来完成此操作(作为游戏循环的一部分),直到加载所有资产。这允许您更新进度条。
这意味着您必须确认assetManager已完成加载,才能使用纹理。 示例如下:public MyAppListener implements ApplicationListener { public void load(){ assetManager.load(t1, Texture.class); assetManager.load(t2, Texture.class); assetManager.load(t3, Texture.class); } public void render() { if(manager.update()) { // we are done loading, let's move to another screen! } // display loading information float progress = manager.getProgress() ... left to the reader ... } }
- 同步加载所有资产 因此,您可以按顺序调用一次(而不是在游戏循环中)
assetManager.finishLoading();
游戏会一直等到资源加载后再继续,但这确实意味着如果你加载了很多东西,游戏会冻结你的屏幕
此处的更多信息:通常,您不需要将
资产/
作为路径的一部分。它需要相对于资产目录的路径。不要让AssetManager引用为静态,否则会导致内存泄漏和纹理损坏。我不同意这种说法。我在所有的游戏中都有一个静态资产管理器,它工作得非常好。只要正确实施生命周期方法,并在适当的时间执行Assets.manager.dispose()
,这不会导致任何问题。另外,它非常方便!谢谢你指出那些事情。把它们整理好。但问题依然存在。还有什么可能是错误的吗?你仍然得到这个例外吗?请将代码更新到其当前状态。在create()中,您需要执行Assets.load,而不是update。我建议您阅读有关AssetManager的信息。看起来你读的所有教程都是完全错误的,因为你似乎不知道它是如何工作的。@noone同样,制作静态AssetManager通常是不好的,尤其是在Android上。
assetManager.finishLoading();