当我必须用new Sprite(texture)
替换所有new Sprite(manager.get(imgPath,Texture.class))
时,为了优化精灵创建并在开始游戏之前完成所有加载,我得到了这一点。
问题在于,当我使用通用AssetManager加载所有纹理时,我得到黑色矩形。
仍然,每次我需要加载一个纹理时使用一个新的AssetManager()工作正常(可能是因为这个管理器被快速收集并且没有时间处理它创建的纹理?)但是这样就有了没有意义使用它。
下面的setupBody()方法是在我的sprite-body包装器构造函数的末尾调用的。
工作代码(但无用)─每个精灵的一个新的AssetManager:
protected void setupBody(String path){
BodyEditorLoader loader = new BodyEditorLoader(Gdx.files.internal(path));
BodyDef bDef = new BodyDef();
bDef.type = BodyDef.BodyType.DynamicBody;
bDef.position.set(this.position);
bDef.angle = this.rotation;
body = mWorld.createBody(bDef);
body.setUserData(this);
FixtureDef fix = new FixtureDef();
fix.density = 0.1f;
fix.friction = 0f;
fix.restitution = 0.5f;
fix.filter.categoryBits = this.getCategory();
fix.filter.maskBits = this.getMask();
origin = loader.getOrigin("base"+identifier, 1).cpy();
String imgPath = loader.getImagePath("base"+identifier);
AssetManager manager = new AssetManager();
manager.load(imgPath,Texture.class);
manager.finishLoading();
Texture baseSpriteTexture = manager.get(imgPath,Texture.class);
Texture baseSpriteTexture = new Texture(imgPath);
baseSprite = new Sprite(baseSpriteTexture);
loadHighlightedSprite(loader, identifier);
attachFixture(loader, identifier, fix);
}
代码让我不眠......想法是拥有一个非静态管理器:
protected void setupBody(String path){
/*no changes before */
String imgPath = loader.getImagePath("base"+identifier);
AssetManager manager = SmallIntestineDemoGame.getAssets();
manager.load(imgPath,Texture.class);
/* no changes after */
}
SmallIntestineDemoGame $ getAssets():
public class SmallIntestineDemoGame extends Game {
public AssetManager assets;
@Override
public void create() {
setScreen(new GameScreen());
}
public static AssetManager getAssets() {
return ((SmallIntestineDemoGame) Gdx.app.getApplicationListener()).assets;
}
public void setupAssets(){
this.assets = new AssetManager();
Texture.setAssetManager(assets);
}
}
调试:
调试我的资产经理让我感到困惑。即使我添加更多资产,经理资产价值的大小也会停留在33:
我测试了两个案例──每个精灵创建时,app都带有一个新的AssetManager()(后面是完成加载和所有必需的东西)。并将一个独特的资产管理器传递给所有精灵创作:
我在draw方法中设置了一个断点,除了sprite.texture.glhandle之外,两个精灵几乎没有区别! 当使用相同的管理器创建所有sprite纹理时,它们的纹理glhandle设置为0,这解释了黑色矩形。但是当使用本地新创建的资产管理器创建每个精灵时,glhandle具有一些适当的值(2269)。
答案 0 :(得分:0)
Texture.setAssetManager(assets);
当您设置AssetManager时,每次游戏恢复时都需要调用AssetManager的update()
方法。
如果您没有设置AssetManager,通常的托管纹理机制将启动,因此您不必担心任何事情。