libGDX Fonts

libGDX Fonts

איך מכניסים טקסט לתוך משחק שנכתב ב- libGDX?

אז ככה. מכיוון שכל דבר אותו אנו יוצרים בספרייה הזו יתורגם בסופו של דבר ל- OpenGL, גם הטקסט הוא כזה. כלומר ההתייחסות בסופו של דבר היא בתור bitmap – לצייר את צורת האותיות על המסך.

נשתמש בתוכנה בשם Hiero (אפשר להוריד מכאן):

screen-shot-2016-11-14-at-13-30-03

נבחר את הפונט הרצוי, Rendering מסוג Java, ואז בתפריט File נבחר 'Save BMFont files'.

התוצר יהיה שני קבצים: png, ו- fnt.

קובץ התמונה יראה משהו כמו זה:

text

הקובץ השני מכיל את המיקומים של האותיות ברחבי התמונה.

דגשים חשובים:

  • תחשבו טוב טוב על הגודל אותו אתם הולכים לתת לפונט – לא תוכלו אח״כ להשתמש בו ביותר גדול, כי זה יראה מפוקסל – רק ביותר קטן. מצד שני, לא כדאי להגזים עם הגודל – זה סתם יתפוס מקום מיותר בזיכרון.
  • אולי לא קשור ישירות לנושא, אבל עדיין חשוב: זה שיש לכם פונט מותקן במחשב לא בהכרח אומר שמותר לכם לעשות בו שימוש מסחרי בתוך אפליקציה. עדיף למצוא פונט שבוודאות הרישיון שלו מתיר שימוש חופשי (כאן יש הרבה כאלו).

אז אחרי שיצרנו את שני הקבצים הנ״ל, נוסיף אותם לתיקיית ה- assets לתוך תיקייה חדשה בשם fonts.

כדי להשתמש בפונט נעזר במחלקה BitmapFont בצורה הזו:

BitmapFont font = new BitmapFont(Gdx.files.internal("fonts/text.fnt"));
...
 
// on rendering
batcher.begin();
font.draw(batcher, "Hello World", x, y);
batcher.end();
 
// on destroy
font.dispose();

זה טוב ונחמד. אבל מה אם (משום מה) יש לנו אפליקציה בה אנחנו נדרשים לעשרות פונטים, או אפילו צריכים ליצור פונט בזמן אמת, מקובץ ttf?

בשביל זה יש תוסף בשם FreeType. ניצור פרוייקט חדש עם freetype מסומן:

freetype_libgdx

כשנרצה לייצר BitmapFont במהלך המשחק, נעשה כך:

public class FontsExample extends ApplicationAdapter {
	SpriteBatch batch;
	BitmapFont font;
	@Override
	public void create () {
		batch = new SpriteBatch();
		FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/Xenotron.ttf"));
		FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
		parameter.size = 20;
		font = generator.generateFont(parameter);
		font.setColor(Color.WHITE);
		generator.dispose(); // don't forget to dispose to avoid memory leaks!
	}
 
	@Override
	public void render () {
		Gdx.gl.glClearColor(1, 0, 0, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		batch.begin();
 
		font.draw(batch, "Hello", 100, 100);
		batch.end();
	}
 
	@Override
	public void dispose () {
		batch.dispose();
		font.dispose();
	}
}

 

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *