如何在多个屏幕中处理 AssetManager
How to handle AssetManager in multiple screens
public static AssetManager assets = new AssetManager();
应该避免,但是如何在多个屏幕中处理 AssetManager?这是一个好的解决方案吗?
public class myGame {
assetMananger manager = new AssetManager();
...
public assetManager getAssetMananger(){
return manager;
}
}
public class GameScreen implements Screen{
private AssetManager manager;
public GameScreen(myGame game){
manager = game.getManager();
}
public void render(){
manager.load(...);
}
Gdx.app.getApplicationListener()
return ApplicationListener
实例。您可以对已实现的 class 进行类型转换,然后轻松访问该 class.
的任何方法或数据成员
这样:
((GdxTest)Gdx.app.getApplicationListener()).assets // <-- You can use from where you want in your project.
ApplicationListener
实施 class :
public class GdxTest extends ApplicationAdapter {
public Assets assets;
@Override
public void create() {
assets= new Assets();
}
....
@Override
public void dispose() {
assets.dispose();
}
}
Assets
class 处理所有 assets/resources 游戏
public class Assets implements Disposable {
public AssetManager assetManager;
public Assets(){
assetManager=new AssetManager();
}
...
@Override
public void dispose() {
assetManager.dispose();
}
}
在 create()
方法中加载所有资源并在所有数据加载到 AssetManager
时显示启动画面。 (小型项目的最佳方式)
否则,对于拥有大量资源的大型项目,请卸载不必要的资源 -> 加载新资源,同时加载时向用户显示加载屏幕。
我的方法总是这样:-
创建我自己的管理器 class 接收实例 AssetsManager 并在游戏初始加载时加载所有游戏资产
public class Assets implements Disposable{
public static final Assets instance = new Assets();
private AssetManager manager;
// Individual assets
public PlayerAssets playerAssets;
private Assets(){}
public void init(AssetManager manager){
this.manager = manager;
manager.load(..);
manager.finishLoading();
TextureAtlas atlas = manager.get(..);
playerAssets = new PlayerAssets(atlas);
}
public void dispose(){
manager.dispose();
}
/** Sample Inner class for catching loaded game assets */
public PlayerAssets{
public final AtlasRegion legs;
PlayerAssets(TextureAtlas atlas){
legs = atlas.find(..);
}
}
}
在您的游戏中 class 您加载了所有游戏资产。
public class MyGame extends Game {
@Override
public void create(){
Assets.instance.init(new AssetManager()); // loading your resources
setScreen(new GameScreen());
}
}
根据下面的评论更新
处置您的资产。您可能想要为所有屏幕创建摘要 class,如下所示
public abstract class AbstractScreen implements Screen{
protected Game game;
public AbstractScreen(Game game){
this.game = game;
}
}
. . . . . .
public void dispose(){
Assets.instance.dispose();
}
然后您的所有屏幕都将扩展此 class。例如
public class MenuScreen extends AbstractScreen {
public MenuScreen(Game game){
super(game);
}
}
调用screen实例dispose方法会释放所有资源,
您可以在您可能更喜欢不同行为的地方覆盖它
例如
@everride
public void dispose(){
// super.dispose();
// Release other screen resources
}
在哪里调用 screen dispose 完全由您决定。
此外,您可能希望在加载资产时显示加载屏幕,以避免因加载延迟而出现黑屏
如果您重写上述处置,处置屏幕将不会处置资产
public static AssetManager assets = new AssetManager();
应该避免,但是如何在多个屏幕中处理 AssetManager?这是一个好的解决方案吗?
public class myGame {
assetMananger manager = new AssetManager();
...
public assetManager getAssetMananger(){
return manager;
}
}
public class GameScreen implements Screen{
private AssetManager manager;
public GameScreen(myGame game){
manager = game.getManager();
}
public void render(){
manager.load(...);
}
Gdx.app.getApplicationListener()
return ApplicationListener
实例。您可以对已实现的 class 进行类型转换,然后轻松访问该 class.
这样:
((GdxTest)Gdx.app.getApplicationListener()).assets // <-- You can use from where you want in your project.
ApplicationListener
实施 class :
public class GdxTest extends ApplicationAdapter {
public Assets assets;
@Override
public void create() {
assets= new Assets();
}
....
@Override
public void dispose() {
assets.dispose();
}
}
Assets
class 处理所有 assets/resources 游戏
public class Assets implements Disposable {
public AssetManager assetManager;
public Assets(){
assetManager=new AssetManager();
}
...
@Override
public void dispose() {
assetManager.dispose();
}
}
在
create()
方法中加载所有资源并在所有数据加载到AssetManager
时显示启动画面。 (小型项目的最佳方式)否则,对于拥有大量资源的大型项目,请卸载不必要的资源 -> 加载新资源,同时加载时向用户显示加载屏幕。
我的方法总是这样:-
创建我自己的管理器 class 接收实例 AssetsManager 并在游戏初始加载时加载所有游戏资产
public class Assets implements Disposable{
public static final Assets instance = new Assets();
private AssetManager manager;
// Individual assets
public PlayerAssets playerAssets;
private Assets(){}
public void init(AssetManager manager){
this.manager = manager;
manager.load(..);
manager.finishLoading();
TextureAtlas atlas = manager.get(..);
playerAssets = new PlayerAssets(atlas);
}
public void dispose(){
manager.dispose();
}
/** Sample Inner class for catching loaded game assets */
public PlayerAssets{
public final AtlasRegion legs;
PlayerAssets(TextureAtlas atlas){
legs = atlas.find(..);
}
}
}
在您的游戏中 class 您加载了所有游戏资产。
public class MyGame extends Game {
@Override
public void create(){
Assets.instance.init(new AssetManager()); // loading your resources
setScreen(new GameScreen());
}
}
根据下面的评论更新
处置您的资产。您可能想要为所有屏幕创建摘要 class,如下所示
public abstract class AbstractScreen implements Screen{
protected Game game;
public AbstractScreen(Game game){
this.game = game;
}
}
. . . . . .
public void dispose(){
Assets.instance.dispose();
}
然后您的所有屏幕都将扩展此 class。例如
public class MenuScreen extends AbstractScreen {
public MenuScreen(Game game){
super(game);
}
}
调用screen实例dispose方法会释放所有资源, 您可以在您可能更喜欢不同行为的地方覆盖它 例如
@everride
public void dispose(){
// super.dispose();
// Release other screen resources
}
在哪里调用 screen dispose 完全由您决定。 此外,您可能希望在加载资产时显示加载屏幕,以避免因加载延迟而出现黑屏 如果您重写上述处置,处置屏幕将不会处置资产