libgdx

2013-08-16 12 views
5

के साथ प्रगतिशील रूप से टेक्स्ट प्रदर्शित करें मैं libgdx के साथ पाठ को क्रमिक रूप से प्रदर्शित करने का एक तरीका ढूंढ रहा हूं, लेकिन मुझे वैसे ही ऐसा करने का कोई तरीका नहीं मिल रहा है। यहां मैंने किया है:libgdx

  • मेरे पास एक टेक्स्ट लेबल है जिसे एक अलग पाठ प्रदर्शित करने के लिए समय-समय पर अपडेट किया जा रहा है। लेबल setWrap(true); और setAlignment(Align.center);
  • हर बार जब मैं लेबल मैं जो मैं इस

    public class DisplayTextAction extends TemporalAction{ 
        private CharSequence completeText; 
    
        @Override 
        protected void update(float percent) { 
         ((Label)actor).setText(
          completeText.subSequence(
           0, 
           (int)Math.round(completeText.length()*percent)); 
        } 
    
        public void setText(String newText){ 
         completeText = newText; 
        } 
    } 
    
  • हर पाठ अद्यतन की तरह बनाया गया एक कस्टम कार्रवाई का उपयोग के पाठ को बदलने के लिए सेट कर दिया जाता है, मैं एक पूल से कार्रवाई कहते हैं, पाठ बदलें और लेबल में कार्रवाई जोड़ें।

यहां मेरी समस्या है: यह एक केंद्रित और लिपटे पाठ के साथ काम करने के तरीके से काम नहीं करता है।

यह तब होता है जब पाठ केंद्रित नहीं है (डॉट्स अंतरिक्ष प्रतिनिधित्व करते हैं):

|h........| 
|hel......| 
|hello....| 

(वर्क्स का इरादा के रूप में)

यह जब पाठ केंद्रित है तो:

|....h....| 
|...hel...| 
|..hello..| 

और इस तरह मैं इसे व्यवहार करना चाहता हूं:

|..h......| 
|..hel....| 
|..hello..| 

इसे ठीक करने का मेरा मूल विचार तारों के 2 सेट, एक दृश्यमान पाठ है, और एक अदृश्य है जो "पैडिंग" के रूप में कार्य करता है। मैं कुछ इस तरह के साथ आया था:

CharSequence visibleText = completeText.subSequence(
    0, 
    (int)Math.round(completeText.length()*percent)); 
CharSequence invisibleText = completeText.subSequence(
    (int)Math.round(completeText.length()*percent), 
    completeText.length()); 

तो मैं तार के अपने दो सेट है, लेकिन मैं एक दिखाई दो अलग अलग फोंट प्रदर्शित करने के लिए (एक तरह से, और एक और एक है जो एक ही लेकिन साथ है नहीं मिल सकता है 0 का अल्फा) या लिबडक्स के साथ एक ही लेबल में शैलियों।

मैं अटक गया हूं, मुझे नहीं पता कि मेरा दृष्टिकोण सही है या अगर मुझे कुछ अलग दिखना चाहिए, और यदि मेरा दृष्टिकोण सही है, तो मुझे नहीं पता कि libgdx का उपयोग करके इसका पालन कैसे करें उपकरण।

संपादित करें:

मैं Jyro117 के निर्देशों का पालन किया है और मैं बड़ी प्रगति कर सकता है, लेकिन मैं इसे कई पंक्तियों पर केन्द्रित पाठ के साथ काम नहीं कर सके।

इस पाठ की कल्पना:

|all those lines are| 
|..for a very long..| 
|........text.......| 

और यह इस

|all th.............| 
|...................| 
|...................| 

|all those line.....| 
|...................| 
|...................| 

|all those lines are| 
|..for a ve.........| 
|...................| 

|all those lines are| 
|..for a very long..| 
|........text.......| 

Jyro117 के समाधान की तरह प्रदर्शित करने के लिए या तो

|all those lines are| 
|for a very long....| 
|text...............| 

सही ढंग से प्रदर्शित देना है।

या

|...................| 
|......all tho......| 
|...................| 

|...................| 
|...all those lin...| 
|...................| 

|all those lines are| 
|......for a v......| 
|...................| 

उत्तर

4

आप ओवर-उलझी समाधान कर रहे हैं।जब आपको सभी पाठ जोड़े जाते हैं तो आपको लेबल के आकार को निर्धारित करने की ज़रूरत है। एक बार जब आप यह निर्धारित कर लेंगे कि लेबल आकार को उन आयामों पर लॉक करें, इसे उस तालिका के अंदर रखें जो उसके आस-पास के क्षेत्र को भरने के लिए विस्तारित हो, और फिर कार्रवाई के साथ अपना लेबल अपडेट करें। (आप एक पूल और आवश्यकतानुसार उपयोग कर सकते हैं, लेकिन सादगी के लिए मैंने नीचे दिए गए कोड से बाहर छोड़ा)।

आपको स्पष्ट रूप से कोड को अनुकूलित करना होगा, लेकिन यह आपको मेरा मतलब है कि कोड का संदर्भ देता है।

यहाँ एक रास्ते में एक कोड स्निपेट यह करने के लिए है:

stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false); 
Gdx.input.setInputProcessor(stage); 

uiSkin = new Skin(Gdx.files.internal("skin/uiskin.json")); 

Table fullScreenTable = new Table(); 
fullScreenTable.setFillParent(true); 

final String message = "hello"; 
final Label progressLabel = new Label(message, this.uiSkin); 
final TextBounds bounds = progressLabel.getTextBounds(); // Get libgdx to calc the bounds 
final float width = bounds.width; 
final float height = bounds.height; 
progressLabel.setText(""); // clear the text since we want to fill it later 
progressLabel.setAlignment(Align.CENTER | Align.TOP); // Center the text 

Table progressTable = new Table(); 
progressTable.add(progressLabel).expand().size(width, height).pad(10); 

final float duration = 3.0f; 

final TextButton button = new TextButton("Go!", this.uiSkin); 
button.addListener(new ClickListener() { 
    @Override public void clicked(InputEvent event, float x, float y) { 
     progressLabel.addAction(new TemporalAction(duration){ 
      LabelFormatter formatter = new LabelFormatter(message);     
      @Override protected void update(float percent) { 
       progressLabel.setText(formatter.getText(percent)); 
      } 
     }); 
    } 
}); 
stage.addActor(button); 

fullScreenTable.add(progressTable); 
fullScreenTable.row(); 
fullScreenTable.add(button); 

stage.addActor(fullScreenTable); 

संपादित करें:

जोड़ा गया कोड केंद्र और लेबल में शीर्ष संरेखित करें करने के लिए। उचित संरेखण की अनुमति देने के लिए अंत में रिक्त स्थान भरने के लिए कोड भी जोड़ा गया। नोट: मोनो-स्पेस फोंट के लिए केवल उपयोगी।

class LabelFormatter { 
    private final int textLength; 
    private final String[] data; 
    private final StringBuilder textBuilder; 

    LabelFormatter(String text) { 
     this.textBuilder = new StringBuilder(); 
     this.data = text.split("\n"); 
     int temp = 0; 
     for (int i = 0 ; i < data.length; i++) { 
      temp += data[i].length(); 
     } 
     textLength = temp; 
    } 

    String getText(float percent) { 
     textBuilder.delete(0, textBuilder.length()); 
     int current = Math.round(percent * textLength); 

     for (final String row : data) { 
      current -= row.length(); 
      if (current >= 0) { 
       textBuilder.append(row); 
       if (current != 0) { 
        textBuilder.append('\n'); 
       } 
      } else { 
       textBuilder.append(row.substring(0, row.length() + current)); 

       // Back fill spaces for partial line 
       for (int i = 0; i < -current; i++) { 
        textBuilder.append(' '); 
       } 
      } 

      if (current <= 0) { 
       break; 
      } 
     } 

     return textBuilder.toString(); 
    } 
} 
+0

आपके समाधान के लिए धन्यवाद, यह बेहतर काम करता है लेकिन अभी भी वास्तव में व्यवहार नहीं करता है कि मैं इसे कैसे चाहता हूं। मैं अपनी पोस्ट को और अधिक जानकारी के साथ संपादित करूंगा कि यह क्या करता है और यह क्या नहीं करता है। – vaati

+0

मैंने आपकी आवश्यकताओं के अनुरूप फिट करने के लिए कुछ कोड जोड़ा है। इसके लिए आपको एक मोनो-स्पेस फ़ॉन्ट का उपयोग करने की आवश्यकता होगी ताकि रिक्त स्थान वर्ण की चौड़ाई से मेल खाते हों। अन्य प्रकार के फ़ॉन्ट्स के समाधान के लिए बिटमैपफॉन्ट क्लास में बड़े संशोधन की आवश्यकता होती है और ग्लिफ स्थानों को कैसे निर्धारित किया जाता है क्योंकि आपको इसे अंतिम टेक्स्ट लेआउट के बारे में जानकारी देने की आवश्यकता होती है। – Jyro117

+0

मैं देखता हूं। मुझे लगता है कि मेरे पास बिटमैपफॉन्ट के साथ कोई विकल्प नहीं है। जब मुझे समाधान मिलेगा तो मैं फिर से पोस्ट करूंगा। – vaati

 संबंधित मुद्दे