2012-09-17 45 views
26

Tôi đã gặp rất nhiều rắc rối khi tìm cách vẽ văn bản 2D đơn giản với Libgdx. Đây là mã mà tôi đã đặt cùng nhau cho đến thời điểm này:Làm cách nào để vẽ văn bản bằng Libgdx/Java?

SpriteBatch spriteBatch; 
BitmapFont font; 
CharSequence str = "Hello World!"; 
spriteBatch = new SpriteBatch(); 
font = new BitmapFont(); 

spriteBatch.begin(); 
font.draw(spriteBatch, str, 10, 10); 
spriteBatch.end(); 

Mã này vẽ chuỗi Hello World, tuy nhiên, nó làm hỏng tất cả các bản vẽ khác của tôi. Họ đang ở đó, chỉ bị tàn nhẫn tàn bạo, và di chuyển và tất cả những điều đó. Tôi đã thử Gdx.gl11.glPushMatrix()Gdx.gl11.glPopMatrix() xung quanh chỉ là về mọi tập con của câu lệnh.

Tôi đã thu hẹp các bản vẽ bị cắt xén xuống đến cuộc gọi font.draw(), nếu được thực hiện, mọi thứ hoạt động tốt (nhưng dĩ nhiên không có văn bản).

Trả lời

12

Khi tôi tạo font Bitmap nó là như thế này:

font = new BitmapFont(Gdx.files.internal("Calibri.fnt"),Gdx.files.internal("Calibri.png"),false); 

thử điều này bằng cách tải về một số tập tin phông chữ (khi tải một phông chữ xin vui lòng kiểm tra xem tập tin .fnt và file .png được bao gồm trong cùng)

+0

@Asgeir đừng quên chấp nhận câu trả lời nếu bạn thấy nó hữu ích – alex

+4

Nó không tạo ra sự khác biệt nào. Lập trình nó với ´mới BitmapFont() ´ sẽ sử dụng phông chữ được nhúng mặc định. –

+1

Và BitmapFont một mình không hiển thị. BitmapFont là cấu hình cho cách nó hiển thị văn bản. Các lô rút ra các văn bản bằng cách sử dụng BitmapFont và một String (văn bản để vẽ) – Zoe

2

Cố gắng gọi nhiều batch.begin() và batch.end():

CharSequence str = "Hello World!"; 
spriteBatch = new SpriteBatch(); 
font = new BitmapFont(); 

spriteBatch.begin(); 
font.draw(spriteBatch, str, 10, 10); 
spriteBatch.end(); 
spriteBatch.begin(); 
//draw your other sprites here 
spriteBatch.draw(...); 
spriteBatch.end(); 

hoặc chỉ sử dụng một trường hợp khác nhau của SpriteBatch

+0

Điều này không hoạt động. –

2

Để tạo tệp .fnt, hãy sử dụng hiero được cung cấp bởi trang web của LibGDX.

Đặt kích thước phông chữ 150, nó sẽ tạo tệp .fnt và tệp .png. Sao chép cả hai tệp trong thư mục nội dung của bạn.

Để khai báo font chữ:

BitmapFont font; 

Để tải font: (Trong tạo phương pháp)

font = new BitmapFont(Gdx.files.internal("data/rayanfont.fnt"), false); 
//rayanfont is the font name 

Để render:

batch.begin(); 
font.setScale(.2f); 
font.draw(batch, "hello", x,y); 
batch.end(); 

này sẽ làm việc trơn tru.

+0

Bạn không có nghĩa là 'setScale'? – Cilan

19

Tôi không thấy nhiều lý do tạo lô riêng biệt cho bản vẽ văn bản. Sử dụng gdxVersion = '1.4.1' (được xây dựng với gradle trong Android Studio) mã mà rút văn bản thành công:

BitmapFont font = new BitmapFont(); //or use alex answer to use custom font 

public void render(float dt) 
    { 
    batch.setProjectionMatrix(camera.combined); //or your matrix to draw GAME WORLD, not UI 

    batch.begin(); 

    //draw background, objects, etc. 
    for(View view: views) 
    { 
     view.draw(batch, dt); 
    } 

    font.draw(batch, "Hello World!", 10, 10); 

    batch.end(); 
    } 

Note, mà đây bạn vẽ trong trò chơi thế giới tọa độ, vì vậy nếu nhân vật di chuyển của bạn (trong platformer, cho ví dụ), hơn văn bản cũng sẽ di chuyển. Nếu bạn muốn xem văn bản, nó sẽ được sửa trên màn hình, giống như Label/TextField hoặc cách nó được gọi trong các khung giao diện người dùng khác nhau, tôi khuyên bạn nên sử dụng Stage (và TextArea cho văn bản), xem ví dụ về cách sử dụng Giai đoạn ở đây: http://www.toxsickproductions.com/libgdx/libgdx-basics-create-a-simple-menu/

Các vấn đề liên quan