【发布时间】:2017-02-28 22:25:11
【问题描述】:
当我必须将所有 new Sprite(texture) 替换为 new Sprite(manager.get(imgPath,Texture.class)) 以优化 sprite 创建并在开始游戏之前完成所有加载时,我已经到了这一点。
问题是,当我使用通用 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:
(来源:hostingpics.net)
我测试了这两种情况 ─ 为每个 sprite 创建使用 new AssetManager() 的应用程序(之后是完成加载和所有必需的东西)。并且将唯一的资产管理器传递给所有精灵创作:
我在 draw 方法设置了一个断点,两个精灵之间几乎没有区别,除了 sprite.texture.glhandle ! 当使用相同的管理器创建所有精灵纹理时,它们的纹理 glhandle 设置为 0,这解释了黑色矩形。但是当使用本地新创建的资产管理器创建每个精灵时,glhandle 具有一些适当的值 (2269)。
【问题讨论】:
-
您没有显示足够多的相关代码来查看问题所在。就像你在哪里加载所有东西以及你在哪里获取纹理引用来制作精灵。
-
我还没有加载所有内容。我只是尝试使用一个 AssetManager。目前我会一一加载(您将在 setupBody() 中看到 finishLoading() )。实际上 setupBody() 是一切都完成的地方。游戏从创建大量的 OrganPart 实例开始。 OrganPart 是 sprite-body 包装器。它有一个 box2d 身体和一个精灵。所有在 OrganPart 构造函数末尾调用的 setupBody() 初始化。
-
如果您需要更多信息,我在这里。