2016-04-08 6 views
1

Also ich bin auf dieses Problem gestoßen, dass ich einfach nicht schaffen, zu sortieren. Ich mache ein Spiel mit Hilfe von LibGdx und versuche, eine Chat-Bubble-Funktionalität zu erstellen. Das Problem ist, wenn ich versuche, den Hintergrund des Label-Stils zu einem 9patch Drawable zu ändern, skaliert es nicht gut oder überhaupt?LibGdx Etikett Hintergrund mit 9Patch

public class ChatBubble 
{ 
    private Label textLabel; 
    private BitmapFont font; 
    private Label.LabelStyle lStyle; 
    private int scaledWidth = 0; 
    private int scaledHeight = 0; 
    private Timer.Task currentTask; 
    private Texture bkg; 

    public ChatBubble() 
    { 
     font = new BitmapFont(); 
     font.setColor(Color.BLACK); 
     bkg = new Texture("data/ui/chatb.9.png"); 

     NinePatch np = new NinePatch(bkg,11,11,9,10); 
     NinePatchDrawable npd = new NinePatchDrawable(np); 
     lStyle = new Label.LabelStyle(font,font.getColor()); 
     lStyle.background = npd; 

     textLabel = new Label("",lStyle); 
     textLabel.setVisible(false); 
     textLabel.setAlignment(Align.center); 
     currentTask = new Timer.Task() { 
      @Override 
      public void run() { 
       textLabel.setVisible(false); 
      }}; 
    } 

    public void show(String text, float duration) 
    { 
     if(currentTask.isScheduled())currentTask.cancel(); 
     textLabel.setText(text); 
     textLabel.setVisible(true); 
     scaledHeight = (int)textLabel.getPrefHeight(); 
     scaledWidth = (int)textLabel.getWidth()/2; 
     Timer.schedule(currentTask,duration); 
    } 

    public void show(String text) 
    { 
     if(currentTask.isScheduled())currentTask.cancel(); 
     textLabel.setText(text); 
     textLabel.setVisible(true); 
     scaledHeight = (int)textLabel.getPrefHeight(); 
     scaledWidth = (int)textLabel.getWidth()/2; 
     Timer.schedule(currentTask,(float)(text.length()*0.1)); 
    } 

    public void draw(SpriteBatch batch, float x, float y) 
    { 
     if(!textLabel.isVisible())return; 
     textLabel.setPosition(x - scaledWidth, y + scaledHeight); 
     batch.begin(); 
     textLabel.draw(batch, 1); 
     batch.end(); 
    } 
} 

Wie sieht es im Spiel: How it looks ingame

Wie die 9batch aussieht: 9patch

Jede mögliche Hilfe würde geschätzt!

Update: Ich habe herausgefunden, dass meine 9patch skaliert ok, das Problem ist in Label nicht aktualisiert seine Größe, wenn setText() aufgerufen wird, so dass es Breite und Höhe 0 seit Konstruktor war "" .. Aufruf Layout() auf dem Etikett löst das auch nicht.

Antwort

0

Rufen Sie .pack() auf dem Etikett nach .setText(), um es zu Größe selbst zu seinem Text zu erklären (plus welche Polsterung es im Hintergrund ist, drawable). Sie müssen layout() nicht aufrufen, da dies automatisch erfolgt.

Ich bin nicht sicher, der genaue Grund, den Sie manuell aufrufen müssen pack(), aber dies ist in der Regel der Fall mit Widgets, die Sie nicht Kinder einer WidgetGroup-Unterklasse sind (d. H. Tabelle, VerticalGroup, etc.).

+0

ich habe es schon mal probiert, ändert leider nichts. Die Art, wie ich das jetzt gelöst habe, ist Label = neues Label ("", stylewithbkg); jedes Mal, wenn ich eine neue Chat-Blase zeigen .. das ist nicht sehr klug Speicher weise tho :( –