Libgdx: AssetManager 未加载资产
Libgdx: AssetManager not loading assets
好吧,我只是在与 libgdx 中的 AssetManager 作斗争。我遵循了每个教程,阅读了每个维基页面,但我无法让它工作。
资产class:
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();
}
主要class:
public class TombStone extends Game implements Screen {
@Override
public void create () {
Assets.manager.update();
}
我在屏幕中这样称呼我的纹理 class:
public class StoneScreen implements Screen{
public Texture texture;
public StoneScreen(TombStone gam){
loadStandard();
}
public void loadStandard() {
texture= Assets.manager.get(Assets.background, Texture.class);
}
所以当我 运行 应用程序在显示任何给我之前崩溃了:
"FATAL EXCEPTION: GLThread 32182""Asset not loaded: 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) 你的经理是 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()
方法,只执行一次
我知道不久前有人问过这个问题(并部分回答了),但我会给出我的解决方案。
在您的渲染方法中,输入类似:
if (!assetManager.update()) return;
这应该会更新资产管理器(如果尚未更新)并阻止您渲染卸载的纹理。
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
好吧,我只是在与 libgdx 中的 AssetManager 作斗争。我遵循了每个教程,阅读了每个维基页面,但我无法让它工作。
资产class:
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();
}
主要class:
public class TombStone extends Game implements Screen {
@Override
public void create () {
Assets.manager.update();
}
我在屏幕中这样称呼我的纹理 class:
public class StoneScreen implements Screen{
public Texture texture;
public StoneScreen(TombStone gam){
loadStandard();
}
public void loadStandard() {
texture= Assets.manager.get(Assets.background, Texture.class);
}
所以当我 运行 应用程序在显示任何给我之前崩溃了: "FATAL EXCEPTION: GLThread 32182""Asset not loaded: 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) 你的经理是 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()
方法,只执行一次
我知道不久前有人问过这个问题(并部分回答了),但我会给出我的解决方案。 在您的渲染方法中,输入类似:
if (!assetManager.update()) return;
这应该会更新资产管理器(如果尚未更新)并阻止您渲染卸载的纹理。
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