2013-12-22 4 views
5

타일 맵의 텍스처 위에 텍스트를 삽입 할 수있는 방법이 있습니까?LibGDX - 타일/타일 맵의 텍스처 오버 텍스트

나는 체커 기반의 게임에서 일하고 있는데, 얼마나 많은 체커가 하나의 타일에 있는지 보여줄 필요가있다. 나는 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 
    } 
} 

감사 : 내 코드는 다음을합니다.

편집 :

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 

편집 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); 
} 

어떤 식 으로든 나쁜 위치와 나쁜 크기로 숫자를 그립니다. 이것은 (체커가 배치됩니다 (3,7), boardPosition는 (4,0이다) 등) 결과 :

This is the new result

답변

1

새 응답 :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); 
} 

올드 답변 :

글꼴을 만들고 사용하려면 Hiero 또는 [BMFont] (http://www.angelcode.com /products/bmfont /)와 같은 도구로 BitmapFont을 만들어야합니다. 그 결과 파일은 다음과 같습니다 :

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

내 경우 글꼴 파일은 내 작업 영역의 "글꼴"하위 폴더에 있습니다.

BMFont에서는 글꼴의 크기, 스타일 등을 선택할 수 있습니다.

편집 : 보드 게임에서 그래픽을 모든 프레임을 다시 그리는 데 필요하지 않으므로 게임에 대해 noncontinuous rendering을 고려해야합니다.

+0

작동하지 않음 ** Gdx.files.local (**) ** _GdxFileNotFoundException_ 및 ** Gdx.files.internal (...) **을 수신합니다. _ArrayIndexOutOfBoundsException_을 수신합니다.이것은 내 코드입니다 : 'BitmapFont font = new BitmapFont (Gdx.files.internal ("fonts/EstrageloEdessa.fnt"), Gdx.files.internal ("fonts/EstrageloEdessa_0.png"), true); font.draw (배치, "10", this.boardPosition.x, this.boardPosition.y); ' – David

+0

나는 모든 렌더주기마다 새로운'BitmapFont'를 만들기 때문에 그렇게 생각합니다. SpriteBatch가 Font를 생성 할 때마다 새로운 Texture를 추가 할 수 있기 때문에 모든 렌더링주기가 가능합니다 ... 모든 Stack 객체에 대해 동일한 글꼴을 사용하기 때문에 글꼴을 정적으로 만들어야합니다 모든 스택 객체) : 'public class Stack 확장 Actor { static BitmapFont font = new BitmapFont (bla, bla, bla); @Override public void draw (SpriteBatch 일괄 처리, parentAlpha) {// 무언가를 그립니다}} – tly

+0

오류가 발생했습니다. 설명을 변경하고 오류 로그를 추가했습니다. – David

관련 문제