2017-02-28 63 views
0

我到这一点时,我不得不更换所有new Sprite(texture)new Sprite(manager.get(imgPath,Texture.class))以优化精灵创建和启动游戏之前做的所有负载。AssetManager纹理给人黑色矩形

问题是,当我使用公共的AssetManager加载所有纹理时,我会看到黑色的矩形。

但是,每次我需要加载纹理时都使用新的AssetManager()可以正常工作(也许是因为此管理器很快被garbadge收集,没有时间处理它创建的纹理?),但那样没有意义使用它。

下setupBody()方法被调用我的精灵体包装器构造的端部。

运行的代码(但没用)─为每个精灵一个新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资产值的值的大小,即使我添加更多:

我测试了这两种情况下─用新AssetManager()的应用程序(其次是finishloading和所有需要的东西)为每个精灵创建。并通过一个独特的资产管理器传递给所有精灵创作:

我在draw方法中设置了断点,除了sprite.texture.glhandle之外,两个精灵几乎没有区别! 当使用相同的管理器创建所有精灵纹理时,它们的纹理glhandle设置为0,这解释了黑色矩形。但是,当使用本地新创建的资产管理器创建每个精灵时,这个精确的句柄有一些适当的值(2269)。

+0

您尚未显示足够的相关代码以查看出了什么问题。像加载所有内容的位置以及获取纹理引用以制作精灵的位置。 – Tenfour04

+0

我还没有加载任何东西。我只是尝试使用一个AssetManager。目前我一个接一个加载(你会在setupBody()内看到finishLoading())。实际上,setupBody()是一切都完成的地方。 游戏通过创建大量OrganPart实例开始。 OrganPart是精灵体包装。它有一个box2d主体和一个精灵。所有这些都是在OrganPart构造函数结尾处调用的setupBody()处初始化的。 – neogineer

+0

如果您需要更多信息,我在这里。 – neogineer

回答

0
Texture.setAssetManager(assets); 

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

如果不设置AssetManager,平时管理质感机制会踢,所以你不必担心什么。

+0

你的意思做的那样: /* GameScreen $渲染()*/ @覆盖 公共无效渲染(浮动三角洲){ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); SmallIntestineDemoGame.getAssets()。update(); stage.draw(); stage.act(delta); hudStage.draw(); } 也不工作。 – neogineer

+0

Texture.setAssetManager(assets);在setupAssets()方法中删除此语句并检查。 – Aryan

+0

仍然是黑色的矩形。有和没有调用update()每一帧。 – neogineer