2012-11-09 18 views
7

Questo è il mio metodo di rendering corrente al mio livello nel mio gioco Libgdx. Sto cercando di disegnare un BitmapFont nell'angolo in alto a destra del mio livello, ma tutto quello che sto ottenendo sono un sacco di scatole bianche.Come disegnare un bitmapfont su uno stage in libgdx?

@Override 
    public void render(
      float delta) { 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     this.getBatch().begin(); 

      //myScore.getCurrent() returns a String with the current Score 
     font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500); 
     stage.act(Gdx.graphics.getDeltaTime()); 
     stage.draw(); 
     this.getBatch().end(); 
     } 

vorrei aggiungere il font punteggio in una sorta di un attore e poi fare uno scene.addActor (myScore), ma non so come fare. Ho seguito il tutorial di Steigert per creare la classe di gioco principale che crea un'istanza della scena, font, nella classe AbstractLevel che viene quindi estesa a questo livello.

Finora, non sto usando alcun carattere personalizzato, solo il nuovo BitmapFont() vuoto; da usare per il font Arial predefinito. Più tardi mi piacerebbe usare il mio font più elegante.

risposta

12

Provare a spostare font.draw dopo lo stage.draw. Aggiunta a un attore sarebbe molto semplice, basta creare una nuova classe ed estendere attore come tale

import com.badlogic.gdx.graphics.g2d.BitmapFont; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.scenes.scene2d.Actor; 

public class Text extends Actor { 

    BitmapFont font; 
    Score myScore;  //I assumed you have some object 
         //that you use to access score. 
         //Remember to pass this in! 
    public Text(Score myScore){ 
     font = new BitmapFont(); 
      font.setColor(0.5f,0.4f,0,1); //Brown is an underated Colour 
    } 


    @Override 
    public void draw(SpriteBatch batch, float parentAlpha) { 
     font.draw(batch, "Score: 0" + myScore.getCurrent(), 0, 0); 
     //Also remember that an actor uses local coordinates for drawing within 
     //itself! 
    } 

    @Override 
    public Actor hit(float x, float y) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Spero che questo aiuti!

Edit 1: provare anche System.out.println(myScore.getCurrentScore()); Giusto per fare in modo che questo non è il problema. Si può semplicemente ottenere per restituire un float o un int e quando si esegue il "Score:"+ bit lo trasformerà in una stringa stessa

+1

Grazie! Questo potrebbe fare il trucco, ma ho trovato un'utilità fantastica chiamata ** Label ** che utilizza esattamente ciò di cui ho bisogno. Ho esteso l'etichetta come punteggio per ora e l'ho aggiunta al palco come attore normale. Funziona come un fascino. –

3

Bene, in questo caso, potrebbe essere necessario chiamare this.getBatch().end prima. Così:

mSpriteBatch.begin(); 
mStage.draw(); 
mSpriteBatch.end(); 
//Here to draw a BitmapFont 
mSpriteBatch.begin(); 
mBitmapFont.draw(mSpriteBatch,"FPS",10,30); 
mSpriteBatch.end(); 

Non so perché, ma funziona per me.

-2

Se si utilizza Scene2D, provare a utilizzare stage e attori. Non è necessario scrivere codici lunghi, controllare il plugin MTX che è molto facile da usare. È possibile creare un'esperienza utente straordinaria

http://moribitotechx.blogspot.co.uk/

1

Ho risolto problema simile con scatole bianche chiudendo batch prima di iniziare fase di disegno. Questo perché stage.draw() avvia un altro batch e invalida il batch precedente non terminato con end().

Così esempio attuale mi trasferirei this.getBatch() end() prima di disegnare fase:.

... 
    font.draw(this.getBatch(), "Score: 0" + myScore.getCurrent(), 600, 500); 
    this.getBatch().end(); 
    stage.act(Gdx.graphics.getDeltaTime()); 
    stage.draw(); 
    } 
Problemi correlati