【问题标题】:AssetManager textures giving black rectanglesAssetManager 纹理给出黑色矩形
【发布时间】: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() 初始化。
  • 如果您需要更多信息,我在这里。

标签: java opengl libgdx


【解决方案1】:
 Texture.setAssetManager(assets);

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

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

【讨论】:

  • 你的意思是这样做: /* GameScreen$render() */ @Override public void render(float delta) { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); SmallIntestineDemoGame.getAssets().update();阶段.draw(); stage.act(delta); hudStage.draw(); } 也不行。
  • Texture.setAssetManager(assets);在 setupAssets() 方法中删除此语句并检查。
  • 仍然是黑色矩形。每帧调用和不调用 update()。
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多