2012-11-09 9 views
7

To jest moja obecna metoda renderowania na moim poziomie w mojej grze Libgdx. Próbuję narysować BitmapFont na prawym górnym rogu mojego poziomu, ale wszystko, co dostaję, to garść białych pudełek.Jak narysować bitmapfont na scenie w 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(); 
     } 

Chciałbym dodać czcionkę wynik w jakiś aktor, a następnie zrobić scene.addActor (myScore), ale nie wiem jak to zrobić. Podążyłem za tutorialem Steigert'a, aby stworzyć główną klasę gry, która tworzy instancję sceny, czcionkę w klasie AbstractLevel, która jest następnie rozszerzana o ten poziom.

Do tej pory nie używam żadnej niestandardowej czcionki, tylko pusta nowa BitmapFont(); aby użyć domyślnej czcionki Arial. Później chciałbym użyć własnej, bardziej fantazyjnej czcionki.

Odpowiedz

12

Spróbuj przenieść font.draw do pliku stage.draw. Dodanie go do aktora byłoby bardzo proste, wystarczy stworzyć nową klasę i rozciągają się jak aktor

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; 
    } 

} 

nadzieję, że to pomaga!

Edit 1: Sponsorowane System.out.println(myScore.getCurrentScore()); Wystarczy, aby upewnić się, że nie jest to problem. Możesz go po prostu zwrócić, aby zwrócił float lub int, a gdy wykonasz bit "Score:"+, przekształci go w sam ciąg.

+1

Dzięki! To może wystarczyć, ale znalazłem całkiem niesamowite narzędzie o nazwie ** Label **, które używa dokładnie tego, czego potrzebuję. Wydłużyłem etykietę jako mój wynik i dodałem ją do sceny jako zwykły aktor. Działa jak marzenie. –

3

W takim przypadku najpierw musisz zadzwonić pod numer this.getBatch().end. W ten sposób:

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

Nie wiem dlaczego, ale to działa dla mnie.

-2

Jeśli używasz Scene2D, spróbuj użyć sceny i aktorów. Nie musisz pisać długich kodów, sprawdź wtyczkę MTX, która jest bardzo łatwa w użyciu. Można tworzyć niesamowite doświadczenie użytkownika

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

1

Mam rozwiązać podobny problem z białymi skrzynek zamykając partię przed rozpoczęciem etapu rysunku. Dzieje się tak dlatego, że stage.draw() uruchamia kolejną partię i unieważnia poprzednią partię, która nie zakończyła się końcem().

Tak więc w obecnym przykładzie chciałbym przenieść this.getBatch() end() przed wyciągnięciem scenę.

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