2016-02-29 28 views
0

我設法從.txt創建文本,現在我有一個BitmapFont對象。我想用它作爲演員。在演員的方法畫()我用:用於作爲演員的BitmapFont的InputListener在LibGDX中不起作用

FontRed.draw(batch, "Some text!", getX(), getY()); 

顯示文本,但聽衆沒有工作。當我試圖從BitmapFont拍攝一個區域時: batch.draw(FontRed.getRegion(), getX(), getY(), getWidth(), getHeight());

我在屏幕上看到了很多奇怪的符號,而不是我的文字,但我的偵聽器工作。

我認爲它與該事實密切相關,spritebatch是在BitmapFont的方法draw()中發送的。這是我的全碼:

public class Text extends Actor { 
private BitmapFont FontRed; 
private FreeTypeFontGenerator generator; 
FreeTypeFontParameter parameter; 
String FONT_CHARS = ""; 

public Text(GameStateManager gsm){ 
    generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/myfont.ttf")); 
    for(int i = 32; i < 127; i++) FONT_CHARS += (char)i; 
    for(int i = 1024; i < 1104; i++) FONT_CHARS += (char)i; 
    parameter = new FreeTypeFontParameter(); 
    parameter.characters = FONT_CHARS; 
    parameter.size = 82; 
    parameter.color= Color.RED; 
    FontRed = generator.generateFont(parameter); 
    generator.dispose(); 
    setPosition(30, 300); 
    setSize(182, 182); 
    this.addListener(new Listener(gsm)); 
} 

@Override 
public void draw(Batch batch, float parentAlpha) { 
    FontRed.draw(batch, "Some text!", getX(), getY()); 
    // batch.draw(FontRed.getRegion(), getX(), getY(), getWidth(), getHeight()); 

} 

@Override 
public void act(float delta) { 
} 

class Listener extends InputListener { 
    GameStateManager gsm; 
    Listener(GameStateManager gsm){ 
     this.gsm = gsm; 
    } 

    @Override 
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
     event.getListenerActor().setColor(Color.GREEN); 
     System.out.println("it works"); 
     return true; 
    } 

    @Override 
    public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
     gsm.push(new PlayState(gsm)); 
    } 
} 

}

所以,請給我解釋一下爲什麼演員讀心人時spritebatch在BitmapFont的方法來繪製發送(不工作),我怎麼可以從BitmapFont紋理在batch.draw()中使用它?

+1

演員的繪製方式完全獨立於任何聽衆,因此必須有其他事情正在進行。你如何確定聽衆是否在工作?現在你已經設置了演員的顏色,但是在繪製時你沒有使用演員的顏色,所以不可見。你是否說只有在繪製字體區域時纔會出現「它有效」日誌?他們沒有關係。 – Tenfour04

+0

@ Tenfour04,設置演員的顏色並不重要,我忘了刪除它。我的意思是'System.out.println(「它工作」);'當我畫'FontRed.draw(批處理,「一些文本!「getX(),getY());'但是當我繪製'batch.draw(),我的文本,但聽衆的作品,你說他們沒有關係,但該怎麼辦?請幫助我。 –

+0

再次檢查。你會看到,如果你看看你所描述的舞臺和演員的源代碼是不可能的,你必須做一些其他的改變 – Tenfour04

回答

0

正如評論者提到的,如果您在定義Actor的邊界的182 x 182框中單擊,監聽器是否應該工作無關。當你畫使用此行:

batch.draw(FontRed.getRegion(), getX(), getY(), getWidth(), getHeight()); 

要繪製定義完全相同的演員的區域的字體(這與壓扁在一起字體的每個字符紋理),紋理,所以當你點擊可見紋理,聽衆發射。當您使用此線畫圖時:

FontRed.draw(batch, "Some text!", getX(), getY()); 

您正在以與演員邊界無關的方式繪製文本。 BitmapFont .draw()方法的座標參數定義文本的左上角,而Actor的x和y座標定義左下角。當您使用該行代碼進行繪製時,文本會繪製在Actor的邊界下方。如果您點擊文本上方,您的聽衆應該會觸發。

如果你想用的時候觸發只有當你點擊文本本身,你可以使用一個GlyphLayout確定文本的界限與您的字體繪製的監聽器的演員,並用它來設置演員的範圍:

GlyphLayout layout = new GlyphLayout(FontRed, "Some text!"); 
setSize(layout.width, layout.height); 

然後,當你繪製文本,繪製對於演員的左上角:

FontRed.draw("Some text!", getX(), getY(Align.topLeft)); 

不過,我不建議使用這種方法。如果你想製作一個響應點擊的文本對象,我建議你使用來自scene2d.ui的類,如Label或Button。這些類爲您提供了很多控制,並使您可以輕鬆地爲文本提供背景,在文本和Actor邊界之間填充填充字符,並在Actor中對齊文本。

+0

非常感謝你這樣一個特別的解釋!現在它工作,我想我會按照你的建議關於按鈕和標籤。 –