Okey我只是在libgdx中与AssetManager挣扎。我已经按照每个教程,阅读每个wikipage,但我无法让它工作。
资产类:
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”
答案 0 :(得分:5)
你的代码有这么多错误......
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)您的经理是public
,但您仍然提供其他方法来操纵它(例如更新和处置)。将其设为私有或删除方法,并直接使用Assets.manager
。
2)资产与assets
目录相关。这就是为什么它应该是data/lawn.png
。
3)这就是你得到例外的原因。 AssetManager.load()
只标记要加载的内容,但尚未立即加载它。这是AssetManager.update()
(异步)或AssetManager.finishLoading()
(同步)的作用。如果您在实际加载之前尝试使用AssetManager.get()
,则会出现此异常。只需删除此行即可。
4)扩展Game
AND 实施Screen
是没有意义的。一次只做其中一个。游戏有屏幕,但它不是屏幕本身。
5)您正在标记要一次又一次加载的资产。每帧都会调用render()
。将Assets.load()
移至Screen.show()
方法,该方法仅执行一次。
答案 1 :(得分:0)
我知道这是在不久前被问到的(部分回答),但是我会给出解决方案。 在渲染方法中,输入以下内容:
if (!assetManager.update()) return;
这应该更新资产管理器(如果尚未安装),并阻止您渲染已卸载的纹理。
答案 2 :(得分:0)
AssetManager可以同步和异步方式工作。
异步:显示加载进度栏,在此期间加载资产。这是异步的,因为在更新屏幕时将资产加载到后台。您可以通过反复调用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.load(t1, Texture.class);
assetManager.load(t2, Texture.class);
...
assetManager.load.load(tn, Texture.class);
然后致电
assetManager.finishLoading();
然后,游戏将等到加载资产后再继续,但这确实意味着如果您加载很多东西,它将冻结屏幕。
此处有更多信息:https://github.com/libgdx/libgdx/wiki/Managing-your-assets