2017-02-28 5 views
0

new Sprite(texture)new Sprite(manager.get(imgPath,Texture.class))に置き換えなければならないときは、スプライトの作成を最適化してゲームを開始する前にすべての読み込みを行う必要があります。AssetManagerのテクスチャが黒い四角形を与える

問題は、共通のAssetManagerを使用してすべてのテクスチャを読み込むと、黒い四角形が表示されることです。

テクスチャをロードする必要があるたびに、新しいAssetManager()を使用すると、(このマネージャはすぐにガレージが収集され、作成したテクスチャを処理する時間がないためかもしれませんが)それを使用する点はありません。

下記のsetupBody()メソッドは、スプライトボディラッパーコンストラクタの最後に呼び出されます。眠れぬ私を保つ

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); 
} 

コード─アイデアは、単一の非静的マネージャを持つことです:

作業コード(まだ役に立たない)─各スプライトの1つの新しいAssetManagerは

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を除いて2つのスプライトの間にほとんど違いはありませんでした。 同じマネージャを使用してすべてのスプライトテクスチャを作成すると、そのテクスチャglhandleが0に設定され、黒い四角形が説明されます。しかし、ローカルで新しく作成されたアセットマネージャを使用して各スプライトを作成すると、glhandleには適切な値が設定されます(2269)。

+0

何が間違っているかを確認するのに関連するコードが十分に表示されていません。すべてをロードする場所や、スプライトを作成するためのテクスチャ参照を取得する場所など。 – Tenfour04

+0

私はまだすべてをロードしていません。私はちょうど1つのAssetManagerを使ってみました。その瞬間、私は1つずつロードします(setupBody()内にfinishLoading()があります)。 実際にsetupBody()はすべてが完了した場所です。 ゲームは多くのOrganPartインスタンスを作成することから始まります。 OrganPartはスプライト本体ラッパーです。それはbox2d本体とスプライトを持っています。すべてOrganPartコンストラクタの最後で呼び出されるsetupBody()で初期化されます。 – neogineer

+0

私はここにいます。 – neogineer

答えて

0
Texture.setAssetManager(assets); 

あなたがAssetManagerを設定した場合、あなたはAssetManagerのupdate()方法をあなたのゲームを再開するたびに呼び出す必要があります。

AssetManagerを設定しないと、通常の管理されたテクスチャメカニズムが起動しますので、何も心配する必要はありません。

+0

あなたはそのようにやって意味: /* GameScreen $レンダリング()*/ @Override ます。public voidレンダリング(フロートデルタ){ 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

関連する問題