web-dev-qa-db-fra.com

Comment puis-je dessiner du texte en utilisant Libgdx / Java?

J'ai eu beaucoup de mal à googler comment dessiner du texte 2D simple avec Libgdx. Voici le code que j'ai rassemblé jusqu'à présent:

SpriteBatch spriteBatch;
BitmapFont font;
CharSequence str = "Hello World!";
spriteBatch = new SpriteBatch();
font = new BitmapFont();

spriteBatch.begin();
font.draw(spriteBatch, str, 10, 10);
spriteBatch.end();

Le code dessine la chaîne Hello World, cependant, il gâche tous mes autres dessins. Ils sont là, seulement brutalement mutilés, et bougent et tout ça. J'ai essayé Gdx.gl11.glPushMatrix() et Gdx.gl11.glPopMatrix() à peu près tous les sous-ensembles d'instructions.

J'ai réduit les dessins mutilés jusqu'à l'appel de font.draw(), si cela est supprimé, tout fonctionne bien (mais bien sûr, il n'y a pas de texte à ce moment-là).

28
Asgeir

Je ne vois pas beaucoup de raisons de créer un lot séparé pour le dessin de texte. En utilisant gdxVersion = '1.4.1' (construit avec gradle dans Android Studio) ce code dessine le texte avec succès:

BitmapFont font = new BitmapFont(); //or use alex answer to use custom font

public void render( float dt )
  {
    batch.setProjectionMatrix(camera.combined); //or your matrix to draw GAME WORLD, not UI

    batch.begin();

    //draw background, objects, etc.
    for( View view: views )
    {
      view.draw(batch, dt);
    }

    font.draw(batch, "Hello World!", 10, 10);

    batch.end();
  }

Notez que vous dessinez ici les coordonnées du monde du jeu, donc si votre personnage se déplace (dans le jeu de plateforme, par exemple), le texte se déplacera également. Si vous voulez voir du texte, qu'il sera fixé à l'écran, quelque chose comme Label/TextField ou comment il est appelé dans différents cadres d'interface utilisateur, je recommande d'utiliser Stage (et TextArea pour le texte), voir par exemple comment utiliser Étape ici: http://www.toxsickproductions.com/libgdx/libgdx-basics-create-a-simple-menu/

23
Deepscorn

Quand j'ai créé la police Bitmap, c'était comme ceci:

font = new BitmapFont(Gdx.files.internal("Calibri.fnt"),Gdx.files.internal("Calibri.png"),false);

essayez ceci en téléchargeant un fichier de police (pendant le téléchargement d'une police, veuillez vérifier si le fichier .fnt et le fichier .png sont inclus pour le même)

13
alex

Essayez d'appeler plusieurs batch.begin () et batch.end ():

CharSequence str = "Hello World!";
spriteBatch = new SpriteBatch();
font = new BitmapFont();

spriteBatch.begin();
font.draw(spriteBatch, str, 10, 10);
spriteBatch.end();
spriteBatch.begin();
//draw your other sprites here
spriteBatch.draw(...);
spriteBatch.end();

ou utilisez simplement une autre instance de SpriteBatch

4
user1708101

Pour créer un fichier .fnt, utilisez hiero qui est fourni par le site Web de LibGDX.

Définissez la taille de la police 150, cela créera un .fnt fichier et un .png fichier. Copiez les deux fichiers dans votre dossier d'actifs.

Pour déclarer la police:

BitmapFont font;

Pour charger la police: (dans la méthode create)

font = new BitmapFont(Gdx.files.internal("data/rayanfont.fnt"), false);
//rayanfont is the font name

Rendre:

batch.begin();
font.setScale(.2f);
font.draw(batch, "hello", x,y);
batch.end();

Cela fonctionnera en douceur.

3
sandeep kundliya