AssetManager纹理给出黑色矩形

时间:2017-02-28 22:25:12

标签: java opengl libgdx

当我必须用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)。

1 个答案:

答案 0 :(得分:0)

 Texture.setAssetManager(assets);

当您设置AssetManager时,每次游戏恢复时都需要调用AssetManager的update()方法。

如果您没有设置AssetManager,通常的托管纹理机制将启动,因此您不必担心任何事情。