Libgdx 中的资产
Assets in Libgdx
这是我处理资产的方式
我有 Assets class,它有 assetsManager 并且只有文件路径字符串
public class Assets {
public static AssetManager manager = new AssetManager();
public static final String background = "bg.png";
public static final String menu = "menu/menu.atlas";
public static Texture getTexture(String name) {
return manager.get(name, Texture.class);
}
public static TextureAtlas getTextureAtlas(String name) {
return manager.get(name, TextureAtlas.class);
}
public static void dispose() {
manager.clear();
}
}
在屏幕中加载资源
public class MenuScreen implements Screen {
public void show() {
//load assets
Assets.manager.load(Assets.background, Texture.class);
Assets.manager.load(Assets.menu, TextureAtlas.class);
Assets.manager.finishLoading();
}
}
当我使用它们时,我会这样做
Texture background = Assets.getTexture(Assets.background);
我只在游戏中调用dispose Class
public class GameMain extends Game{
@Override
public void dispose() {
super.dispose();
Assets.dispose();
}
}
我的问题:
这是管理资产的正确方法还是我做错了什么?
另一个问题我有一个舞台(其中有使用 textureRegions 的演员)
在 PlayScreen 中处理它(及其纹理)我只调用 stage.dispose()
public class PlayScreen implements Screen{
@Override
public void dispose() {
stage.dispose();
}
}
这样对不对?
通常情况下你不会做任何事情static
。因此,删除每个静态关键字并将 AssetManager 放入您的主 class(扩展游戏)中。将 AssetManager 的 Getter 添加到您的主 class 并将您的主 class 的引用传递给您实例化的每个新屏幕 class。这样屏幕(在您的示例中名为 PlayScreen)可以访问主 class 和 AssetManager 来加载屏幕的资产。
此外,AssetManager 是异步的,因此如果您对其调用 finishLoading()
,它将阻塞主线程,直到加载所有资产。如果您没有太多要加载,这不是问题,但如果游戏变大,通常会使用启动画面并在后台异步加载资产。有关详细信息,请参阅 this libgdx wiki link。
将您的 AssetManager 放在主 class 中(就像您所做的那样)。
在 Screen 的 dispose
方法中也配置舞台和 Screen 的资产。检查 this link 以获取需要手动处理(以防止内存泄漏)的 classes 列表。
另见 示例代码。
这是我处理资产的方式
我有 Assets class,它有 assetsManager 并且只有文件路径字符串
public class Assets {
public static AssetManager manager = new AssetManager();
public static final String background = "bg.png";
public static final String menu = "menu/menu.atlas";
public static Texture getTexture(String name) {
return manager.get(name, Texture.class);
}
public static TextureAtlas getTextureAtlas(String name) {
return manager.get(name, TextureAtlas.class);
}
public static void dispose() {
manager.clear();
}
}
在屏幕中加载资源
public class MenuScreen implements Screen {
public void show() {
//load assets
Assets.manager.load(Assets.background, Texture.class);
Assets.manager.load(Assets.menu, TextureAtlas.class);
Assets.manager.finishLoading();
}
}
当我使用它们时,我会这样做
Texture background = Assets.getTexture(Assets.background);
我只在游戏中调用dispose Class
public class GameMain extends Game{
@Override
public void dispose() {
super.dispose();
Assets.dispose();
}
}
我的问题:
这是管理资产的正确方法还是我做错了什么?
另一个问题我有一个舞台(其中有使用 textureRegions 的演员)
在 PlayScreen 中处理它(及其纹理)我只调用 stage.dispose()
public class PlayScreen implements Screen{
@Override
public void dispose() {
stage.dispose();
}
}
这样对不对?
通常情况下你不会做任何事情static
。因此,删除每个静态关键字并将 AssetManager 放入您的主 class(扩展游戏)中。将 AssetManager 的 Getter 添加到您的主 class 并将您的主 class 的引用传递给您实例化的每个新屏幕 class。这样屏幕(在您的示例中名为 PlayScreen)可以访问主 class 和 AssetManager 来加载屏幕的资产。
此外,AssetManager 是异步的,因此如果您对其调用 finishLoading()
,它将阻塞主线程,直到加载所有资产。如果您没有太多要加载,这不是问题,但如果游戏变大,通常会使用启动画面并在后台异步加载资产。有关详细信息,请参阅 this libgdx wiki link。
将您的 AssetManager 放在主 class 中(就像您所做的那样)。
在 Screen 的 dispose
方法中也配置舞台和 Screen 的资产。检查 this link 以获取需要手动处理(以防止内存泄漏)的 classes 列表。
另见