2013-02-10 10 views
5

ich Bilder über das Netzwerk bin das Herunterladen und fügen Sie sie UI meiner Libgdx als Bild Schauspieler dies mit:Wie unmanaged Texture nachladen Libgdx nach OpenGL Kontext Verlust

Pixmap pm = new Pixmap(data, 0, data.length); 
Texture t = new Texture(pm); 
TextureRegion tr = new TextureRegion(t,200,300); 
TextureRegionDrawable trd = new TextureRegionDrawable(tr); 
Image icon = new Image(); 
icon.setDrawable(trd); 

diese Gegeben brauche ich irgendwie das Nachladen Texturdaten, da sie verloren gehen, wenn der OpenGL-Kontext verloren geht (z. B. weil der Bildschirm in den Ruhezustand wechselt).

Ich habe versucht, meine eigene Manager-Klasse zu machen, und fügen hinzu

DynamicTextureManager.register(t, pm); // Register texture together with the source pixmap 

den obigen Schnipsel, und in resume() ich tue:

DynamicTextureManager.reload(); 

Die Managerklasse:

public class DynamicTextureManager { 
    private static LinkedHashMap<Texture, Pixmap> theMap = new 
     LinkedHashMap<Texture,Pixmap>(); 
    public static void reload() { 
     Set<Entry<Texture,Pixmap>> es = theMap.entrySet(); 
     for(Entry<Texture,Pixmap> e : es) { 
      Texture t = e.getKey(); 
      Pixmap p = e.getValue(); 

      t.draw(p, 0, 0); 
     } 
    } 

    public static void register(Texture t, Pixmap p) { 
     theMap.put(t, p); 
    } 
} 

Aber das hilft nicht - ich habe immer noch mit der Textur entladen und weiße Flächen statt der i Magier.

Wie soll das gemacht werden? Ich konnte keinen Code finden, der das demonstriert!

+0

Meine Vermutung ist, dass eine 'Textur' das zugrundeliegende Textur-Handle nicht _magisch_wieder herstellt. Versuchen Sie, die Textur selbst neu zu erstellen, oder wechseln Sie zu so genannten _managed_ Texturdaten (überprüfen Sie die Unterklassen von 'TextureData';' PixmapTextureData' unterstützt diesen Begriff nicht. –

+0

Ich habe eine Aufgabe, die dieser sehr ähnlich ist. Ich habe nicht fertig, aber wenn ich es funktioniere (was ich denke, wird die Pixmap aus den Binärdaten neu erstellen) werde ich dies mit einer Antwort aktualisieren. – Jyro117

+0

@ Jyro117 Ich habe meine aktuelle Lösung als Antwort, fühlen sich frei zu verbessern! – johlo

Antwort

1

Hinzufügen meiner Lösung als Referenz. Ich registriere nun das Image-Objekt und das Pixmap-Objekt mit meinem Manager, beim Reload() wird die Textur aus der Pixmap neu erstellt und ich setze die neue Textur für das alte Image. Funktioniert für mich, aber elegantere Lösungen sind willkommen.

import java.util.Map.Entry; 
public class DynamicTextureManager { 
    private static final class MapData { 
     Pixmap pixmap; 
     int width; 
     int height; 
    } 

    private static WeakHashMap<Image, MapData> theMap = new WeakHashMap<Image, MapData>(); 

    public static void reload() { 
     Set<Entry<Image, MapData>> es = theMap.entrySet(); 
     for (Entry<Image, MapData> e : es) { 
      Image i = e.getKey(); 
      MapData d = e.getValue(); 

      Texture t = new Texture(d.pixmap); 
      TextureRegion tr; 
      if(d.width == -1 || d.height == -1) { 
       tr = new TextureRegion(t); 
      } 
      else { 
       tr = new TextureRegion(t,d.width, d.height);     
      } 
      TextureRegionDrawable trd = new TextureRegionDrawable(tr); 
      i.setDrawable(trd); 
     } 
    } 

    public static void register(Image i, Pixmap p) { 
     MapData d = new MapData(); 
     d.pixmap = p; 
     d.width = -1; 
     d.height = -1; 
     theMap.put(i, d); 
    } 

    public static void register(Image i, Pixmap p, int width, int height) { 
     MapData d = new MapData(); 
     d.pixmap = p; 
     d.width = width; 
     d.height = height; 

     theMap.put(i, d); 
    } 

}