Java 在LibGDX中处理资产管理器
以下是我的OOP设置: 类主游戏扩展了游戏: 类PlayScreen实现屏幕:Java 在LibGDX中处理资产管理器,java,android,libgdx,assets,asset-management,Java,Android,Libgdx,Assets,Asset Management,以下是我的OOP设置: 类主游戏扩展了游戏: 类PlayScreen实现屏幕: public PlayScreen(MainGame game, Assets assets) { this.assets = assets; this.game = game; background = assets.getManager().get(assets.getBackground()); hero = new HeroSprite(290, 1100, this,
public PlayScreen(MainGame game, Assets assets) {
this.assets = assets;
this.game = game;
background = assets.getManager().get(assets.getBackground());
hero = new HeroSprite(290, 1100, this, assets);
// Create Game camera and Hub also
}
public void render(float delta) {
// Clear screen
// Use game batch to draw to screen
}
public void dispose() {
assets.dispose();
}
public HeroSprite(int x, int y, PlayScreen screen, Assets assets){
this.assets = assets;
this.screen = screen;
// Animation Textures
heroWalking = assets.getManager().get(assets.getWalking()); // This is an Asset Descriptor
walkAnime = new Animation(heroWalking) // my own custom animation class which takes the spritesheet and returns the appropriate frames
...
}
// This does not contain a dispose method
类HeroSprite:
public PlayScreen(MainGame game, Assets assets) {
this.assets = assets;
this.game = game;
background = assets.getManager().get(assets.getBackground());
hero = new HeroSprite(290, 1100, this, assets);
// Create Game camera and Hub also
}
public void render(float delta) {
// Clear screen
// Use game batch to draw to screen
}
public void dispose() {
assets.dispose();
}
public HeroSprite(int x, int y, PlayScreen screen, Assets assets){
this.assets = assets;
this.screen = screen;
// Animation Textures
heroWalking = assets.getManager().get(assets.getWalking()); // This is an Asset Descriptor
walkAnime = new Animation(heroWalking) // my own custom animation class which takes the spritesheet and returns the appropriate frames
...
}
// This does not contain a dispose method
Sorr如果那里有很多代码,我会尽量减少。我的主要问题是我是否正确处理了这些问题
看起来不错,我的游戏运行良好。但当我退出游戏,重新进入一个黑屏显示。这在桌面和Android上都会发生
一个有效的解决方案是使用超级清洁应用程序清除Android上的内存。因为这是一个记忆问题,我想这与我的错误处理有关
编辑:显示我的资产类别
public class Assets {
private AssetManager manager;
private AssetDescriptor<Texture> background;
private AssetDescriptor<Texture> wood;
public AssetManager getManager() {
return manager;
}
public AssetDescriptor<Texture> getBackground() {
return background;
}
public AssetDescriptor<Texture> getWood() {
return hero;
}
public Assets(){
manager = new AssetManager();
background = new AssetDescriptor<Texture>("textures/static/bg.png", Texture.class);
hero = new AssetDescriptor<Texture>("textures/static/hero.png", Texture.class);
...
}
public void load(){
manager.load(background);
manager.load(hero);
...
}
public void dispose(){
manager.dispose();
}
}
公共类资产{
私人资产管理人;
私人资产描述人背景;
私有资产描述木材;
公共资产管理器getManager(){
退货经理;
}
公共资产描述程序getBackground(){
返回背景;
}
公共资产描述人getWood(){
回归英雄;
}
公共资产(){
manager=新的AssetManager();
背景=新的AssetDescriptor(“textures/static/bg.png”,Texture.class);
hero=新资产描述器(“textures/static/hero.png”,Texture.class);
...
}
公共空荷载(){
加载(后台);
经理加载(英雄);
...
}
公共空间处置(){
manager.dispose();
}
}
Screen.dispose()
,您应该在退出屏幕且不再需要资产时手动调用dispose。但显然,当您再次需要它们时,您需要再次加载它们,并且需要一个新的AssetManager。因此,如果您的资产不会占用那么多,您应该将其保留在内存中
但在退出时,您需要进行处置Game.dispose()
会自动调用。在这里,您应该调用getScreen().dispose()
,并在effectiveScreen
的dispose()
方法中包含所有需要处理的内容
由于当前看起来不像是在屏幕之间进行处置,这可能是因为您有一个静态AssetManager,因此您应该显示您的Assets()
类。Screen.dispose()
,当您退出屏幕并且不再需要这些资产时,您应该手动调用dispose。但显然,当您再次需要它们时,您需要再次加载它们,并且需要一个新的AssetManager。因此,如果您的资产不会占用那么多,您应该将其保留在内存中
但在退出时,您需要进行处置Game.dispose()
会自动调用。在这里,您应该调用getScreen().dispose()
,并在effectiveScreen
的dispose()
方法中包含所有需要处理的内容
由于目前看起来您并不是在屏幕之间处理资产,这可能是因为您有一个静态资产管理器,您应该显示您的
Assets()
类。从PlayScreen的dispose()方法中处理资产有什么需要?您如何退出游戏?您正在使用Gdx.app.exit()?在桌面上,我单击“X”按钮。在Android上,我将应用程序刷走。我从来没有使用过Gdx.app.exit()
PlayScreen的dispose()方法处理资产有什么必要?如何退出游戏?您正在使用Gdx.app.exit()?在桌面上,我单击“X”按钮。在Android上,我将应用程序刷走。我从来没有使用过游戏类的dispose()方法中已经处理的Gdx.app.exit()
assets对象,那么需要调用getScreen().dispose()来处理assets对象吗。由于给定的引用资产对象只能从游戏的create()方法创建一次,所以不能从Screen dispose()方法中释放它。当前所有者已从屏幕的dispose()方法中处置了资产,但他未调用此方法。@AbhishekAryanSpriteBatch
未被处置。如果你有一个阶段
,它既不会被处理掉。好吧,我正在努力跟上。首先,我的资产管理器不是静态的。事实上,我的游戏中几乎每个变量都是私有的。另外,SpriteBatch正在Game类中处理。@Madmenyo所有者正在使用Game类的SpriteBatch,该SpriteBatch正在Game类的dispose()方法中处理。在Screen owner的render()方法中提到,他仅使用Game类的SpriteBatch通过注释进行渲染,没有任何阶段。正确。我不是在用舞台。游戏批处理对象用于绘制到屏幕,该屏幕从游戏类传递到屏幕的构造函数中。资产对象已从游戏类的dispose()方法中处理,那么需要调用getScreen().dispose()来处理资产对象。由于给定的引用资产对象只能从游戏的create()方法创建一次,所以不能从Screen dispose()方法中释放它。当前所有者已从屏幕的dispose()方法中处置了资产,但他未调用此方法。@AbhishekAryanSpriteBatch
未被处置。如果你有一个阶段
,它既不会被处理掉。好吧,我正在努力跟上。首先,我的资产管理器不是静态的。事实上,我的游戏中几乎每个变量都是私有的。另外,SpriteBatch正在Game类中处理。@Madmenyo所有者正在使用Game类的SpriteBatch,该SpriteBatch正在Game类的dispose()方法中处理。在Screen owner的render()方法中提到,他仅使用Game类的SpriteBatch通过注释进行渲染,没有任何阶段。正确。我不是在用舞台。游戏批处理对象用于绘制到屏幕,该屏幕从游戏类向下传递到屏幕的构造函数中。