如何在LibGDX中绘制BitmapFont?

时间:2012-10-15 12:37:00

标签: java libgdx

我认真地打赌我做了一些愚蠢的事情而且似乎无法注意到它。

package com.me.mygdxgame;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class Locked implements ApplicationListener
{
    private OrthographicCamera camera;
    private SpriteBatch batch;
    private Texture texture;
    private Sprite sprite;
    private BitmapFont font;
    private CharSequence str = "Hello World!";
    private float width;
    private float height;

    @Override
    public void create()
    {
        width = Gdx.graphics.getWidth();
        height = Gdx.graphics.getHeight();

        camera = new OrthographicCamera(1, height / width);
        batch = new SpriteBatch();

        texture = new Texture(Gdx.files.internal("data/libgdx.png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

        TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);

        sprite = new Sprite(region);
        sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
        sprite.setOrigin(sprite.getWidth() / 2, sprite.getHeight() / 2);
        sprite.setPosition(-sprite.getWidth() / 2, -sprite.getHeight() / 2);

        font = new BitmapFont(Gdx.files.internal("data/digib.fnt"),
                Gdx.files.internal("data/digib.png"), false);
    }

    @Override
    public void dispose()
    {
        batch.dispose();
        texture.dispose();
    }

    @Override
    public void render()
    {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        font.setColor(0.0f, 0.0f, 0.0f, 1.0f);

        //sprite.draw(batch);
        font.draw(batch, str, width*0.5f, height*0.5f);
        batch.end();
    }

    @Override
    public void resize(int width, int height)
    {
    }

    @Override
    public void pause()
    {
    }

    @Override
    public void resume()
    {
    }
}

项目是使用他们提供的模板工具生成的 gdx-setup-ui.jar 正如您在代码中看到的那样,我没有费心去除默认代码(只是一些简单的绘制代码来渲染LibGDX徽标)。

所以,通过干净的项目,我在这里遵循了这个指南 http://code.google.com/p/libgdx-users/wiki/addingText2D

并最终使用上面提供的代码到达。

问题是,为什么不会!@#$ ing文字显示!?我改变了这么多次,但仍然没有运气:\

我错过了什么吗?

FYI:字体很好,我把它们放到另一个游戏中然后就可以了。

6 个答案:

答案 0 :(得分:8)

尝试更改投影矩阵,如下所示:

Matrix4 normalProjection = new Matrix4().setToOrtho2D(0, 0, Gdx.graphics.getWidth(),  Gdx.graphics.getHeight());

batch.setProjectionMatrix(normalProjection);

答案 1 :(得分:8)

我所做的只是

    spriteBatch = new SpriteBatch();
 font = new BitmapFont(Gdx.files.internal("data/nameOfFont.fnt"),
         Gdx.files.internal("data/nameOfFont.png"), false);

和渲染方法

spriteBatch.begin();
 font.setColor(1.0f, 1.0f, 1.0f, 1.0f);
 font.draw(spriteBatch, "some string", 25, 160);
 spriteBatch.end();

您可以在我的博客上阅读更多相关信息:http://algorhymes.wordpress.com/2012/11/17/javalibgdx-fonts/

答案 2 :(得分:5)

就我个人而言,我并不是将所有字体转换为.fnt格式的忠实粉丝。如果您需要为特定字体设置不同的尺寸,则必须花费大量时间(和应用空间)来进行所有转换。

您可以使用FreeType Extension并直接从.ttf

加载
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);
BitmapFont font15 = generator.generateFont(15);
BitmapFont font22 = generator.generateFont(22);
generator.dispose();

更多信息here

渲染的方式与watis解释的相同。

答案 3 :(得分:3)

使用libgdx网站提供的hiero创建.fnt文件

设置字体150的大小,它将创建一个.fnt文件和一个png文件

复制你的assests文件夹中的两个文件

现在声明字体

BitmapFont字体;

创建方法

font = new BitmapFont(Gdx.files.internal(“data / 100.fnt”),false); // 100是您可以为您的字体命名的字体名称

in render

font.setscale(.2f);

font.draw(批处理,“无论你想写什么”,x,y);

这将顺利运作

答案 4 :(得分:2)

您的代码的主要问题是您已创建了具有
的相机 viewportWidth = 1&
viewportHeight = width / height

并且你在宽度* 0.5f&高度* 0.5f超出相机范围

将相机初始化更改为

camera = new OrthographicCamera(width, height);

.... 或将绘制字体语句更改为

font.setScale(1,height/width);
font.draw(batch, str, 0.5f, height/width*0.5f);

答案 5 :(得分:1)

你是否尝试像这样手动给位置?我希望这会奏效         batch.setProjectionMatrix(camera.combined);         batch.enableBlending();         batch.begin();
        font.draw(batch,yourString,100,100);
        batch.end();