LibGDX – текст поверх текстуры в плитке / tilemaps

Есть ли способ поместить текст поверх текстуры в Tilemaps?

Я работаю в игре с шашками, и мне нужно показать, сколько очков в одной плитке. Я использую TiledMap для загрузки платы. Мой код следующий:

GameScreen.java

public class GameScreen implements Screen { private TiledMap board; public GameScreen(final MyGame gam) { board = new TmxMapLoader().load("maps/tablero-64.tmx"); renderer = new OrthogonalTiledMapRenderer(board, 1/64f); boardCamera = new OrthographicCamera(); boardCamera.setToOrtho(false, WIDTH, HEIGHT); boardCamera.position.set(CENTERX, CENTERY, 0); // Added this to avoid continuous rendering Gdx.graphics.setContinuousRendering(false); Gdx.graphics.requestRendering(); } @Override public void render(float delta) { boardCamera.update(); renderer.setView(boardCamera); renderer.render(); renderer.getSpriteBatch().begin(); for (Stack checker : whiteCheckers) checker.draw(renderer.getSpriteBatch(), 1); for (Stack checker : blackCheckers) checker.draw(renderer.getSpriteBatch(), 1); renderer.getSpriteBatch().end(); } } 

Stack.java

 public class Stack extends Actor { static BitmapFont font = new BitmapFont(Gdx.files.internal("fonts/estragelo.fnt"), Gdx.files.internal("fonts/estragelo.png"), true); // Line 31 @Override public void draw(SpriteBatch batch, float parentAlpha) { batch.draw(this.texture, this.boardPosition.x, this.boardPosition.y, this.size, this.size); // This DOESN'T work font.draw(batch, "10", this.boardPosition.x, this.boardPosition.y); // Line 296 } } 

Заранее спасибо.

EDIT: я добавляю журнал ошибок:

 12-24 17:49:18.178: E/AndroidRuntime(3365): FATAL EXCEPTION: GLThread 12-24 17:49:18.178: E/AndroidRuntime(3365): java.lang.ExceptionInInitializerError 12-24 17:49:18.178: E/AndroidRuntime(3365): at my.package.GameScreen.<init>(GameScreen.java:81) 12-24 17:49:18.178: E/AndroidRuntime(3365): at my.package.MainMenuScreen.render(MainMenuScreen.java:36) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.Game.render(Game.java:46) 12-24 17:49:18.178: E/AndroidRuntime(3365): at my.package.MyGame.render(MyGame.java:23) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:487) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.backends.android.surfaceview.GLSurfaceViewCupcake$GLThread.guardedRun(GLSurfaceViewCupcake.java:713) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.backends.android.surfaceview.GLSurfaceViewCupcake$GLThread.run(GLSurfaceViewCupcake.java:646) 12-24 17:49:18.178: E/AndroidRuntime(3365): Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error loading font file: fonts/estragelo.fnt 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.graphics.g2d.BitmapFont$BitmapFontData.<init>(BitmapFont.java:971) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.graphics.g2d.BitmapFont.<init>(BitmapFont.java:135) 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.graphics.g2d.BitmapFont.<init>(BitmapFont.java:127) 12-24 17:49:18.178: E/AndroidRuntime(3365): at my.package.Stack.<clinit>(Stack.java:31) 12-24 17:49:18.178: E/AndroidRuntime(3365): ... 7 more 12-24 17:49:18.178: E/AndroidRuntime(3365): Caused by: java.lang.ArrayIndexOutOfBoundsException 12-24 17:49:18.178: E/AndroidRuntime(3365): at com.badlogic.gdx.graphics.g2d.BitmapFont$BitmapFontData.<init>(BitmapFont.java:836) 12-24 17:49:18.178: E/AndroidRuntime(3365): ... 10 more 

EDIT 2: Проблема была в шрифте. Шрифт Estragelo генерирует два файла PNG, но вы можете указать его только в конструкторе BitmapFont. Поэтому я перешел на шрифт Arial, и он работает. Но теперь у меня такая же проблема, как в начале. Это дает мне тот же результат, что и делать:

 public void draw(SpriteBatch batch, float parentAlpha) { BitmapFont font = new BitmapFont(); font.draw(batch, "10", this.boardPosition.x, this.boardPosition.y); } 

В некотором роде он рисует номер, но в плохом положении и плохом размере. Это результат (boardPosition – (4,0) и (3,7), где размещаются шашки):

Это новый результат

Новый ответ:

Поскольку ваш новый шрифт BitmapFont статичен, он будет загружен до инициализации Gdx. Вот почему это не сработает. Чтобы этого избежать, вы можете оставить пустой font статического поля и назначить его в конструкторе GameScreen :

 public class Stack extends Actor { static BitmapFont font; @Override public void draw(SpriteBatch batch, float parentAlpha) { //your draw stuff } } 

А затем назначить шрифт в конструкторе:

 public class GameScreen implements Screen { public GameScreen(final MyGame gam) { //your initializers and settings Stack.font=new BitmapFont(Gdx.files.internal("fonts/estragelo.fnt"), Gdx.files.internal("fonts/estragelo.png"), true); } 

Старый ответ:

Вы должны создать BitmapFont с такими инструментами, как Hiero или [BMFont] ( http://www.angelcode.com/ products / bmfont /), чтобы создать шрифт и использовать полученные файлы:

 font=new BitmapFont(Gdx.files.local("fonts/font.fnt"), Gdx.files.local("fonts/font.png"), true); 

В моем случае файлы шрифтов находятся в подпапке «шрифты» моего рабочего пространства.

В BMFont вы можете выбрать размер, стиль и т. Д. Шрифта.

Редактировать: вы должны учитывать непревзойденный рендеринг для игры, потому что не нужно, чтобы настольная игра перерисовывала графику в каждом кадре.