2017-02-28 3 views
0

Ich habe zu diesem Punkt, wenn ich alle new Sprite(texture) durch new Sprite(manager.get(imgPath,Texture.class)) ersetzen muss, um Sprites zu erstellen und das Laden vor dem Start des Spiels zu optimieren.AssetManager Texturen geben schwarze Rechtecke

Das Problem ist, dass wenn ich einen gemeinsamen AssetManager verwenden, um alle Texturen zu laden, bekomme ich schwarze Rechtecke.

Immer noch mit einem neuen AssetManager() jedes Mal wenn ich eine Textur laden muss, funktioniert gut (vielleicht weil dieser Manager ist schnell garbadge-gesammelt und hat keine Zeit, die Textur zu entsorgen, die es erstellt?), Aber so Es macht keinen Sinn, es zu benutzen.

Die folgende setupBody() -Methode wird am Ende meines Sprite-Body-Wrapper-Konstruktors aufgerufen.

der Code arbeitet (noch nutzlos) ─ einen neuer Assetmanager für jeden Sprit:

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

des Code hält mich schlaflos ─ die Idee ist, einen einzigen nicht-statischen Manager hat:

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

} 

DEBUGGEN:

Debugging mein Asset Manager hat mich verwirrt. Größe der Werte des Wertes von Vermögenswerten Karte des Managers bei 33 selbst stecken bleibt, wenn ich hinzufüge mehr:

ich beiden Fälle getestet ─ die App mit einem neuen Assetmanager() (gefolgt von finishloading und all benötigtes Zeug) für jede Sprite-Erstellung. UND mit einem einzigartigen Asset Manager an alle Sprite-Kreationen weitergegeben:

Ich legte einen Haltepunkt bei der Methode draw und es gab fast keinen Unterschied zwischen den zwei Sprites, außer für sprite.texture.glhandle! Wenn alle Sprites-Texturen mit demselben Manager erstellt werden, wird ihre Textur glhandle auf 0 gesetzt und dies erklärt die schwarzen Rechtecke. Wenn jedoch jedes Sprite mit einem lokal neu erstellten Asset-Manager erstellt wird, hat das glhandle einen geeigneten Wert (2269).

+0

Sie haben nicht genug von Ihrem relevanten Code gezeigt, um zu sehen, was falsch ist. Zum Beispiel, wo Sie alles laden und wo Sie Texturreferenzen erhalten, um Sprites zu erstellen. – Tenfour04

+0

Ich lade noch nicht alles. Ich habe gerade versucht, einen einzigen AssetManager zu verwenden. Im Moment lade ich eins nach dem anderen (Sie sehen das finishLoading() in setupBody()). Eigentlich ist setupBody(), wo alles erledigt ist. Das Spiel beginnt damit, eine Menge OrganPart-Instanzen zu erstellen. OrganPart ist der Sprite-Body-Wrapper. Es hat einen box2d Körper und ein Sprite. all dies wird bei setupBody() am Ende des OrganPart-Konstruktors initialisiert. – neogineer

+0

Wenn Sie weitere Informationen benötigen, bin ich hier. – neogineer

Antwort

0
Texture.setAssetManager(assets); 

Wenn Sie setzen Assetmanager, dann müssen Sie update() Methode der Assetmanager jedes Mal, wenn das Spiel wieder aufgenommen rufen.

Wenn Sie den AssetManager nicht einstellen, wird der übliche verwaltete Texturmechanismus aktiviert, so dass Sie sich um nichts kümmern müssen.

+0

Du meinst, wie das zu tun: /* GameScreen macht $() */ @Override public void machen (float delta) { Gdx.gl.glClear (GL20.GL_COLOR_BUFFER_BIT); SmallIntestineDemoGame.getAssets(). Update(); stage.draw(); stage.act (Delta); hudStage.draw(); } Funktioniert auch nicht. – neogineer

+0

Texture.setAssetManager (Assets); entferne diese Anweisung in der setupAssets() -Methode und überprüfe. – Aryan

+0

noch schwarze Rechtecke. Mit und ohne update() jeden Frame aufrufen. – neogineer