在libGDX中逐个淡入文本字符串

时间:2015-02-10 05:50:13

标签: java libgdx

我正在尝试用libGDX开发游戏。现在,我正试图为游戏创建一个简短的介绍。

简短介绍只是一个纯色背景,文字串(不同大小)逐一淡化。

现在,我的策略是创建一个从0开始的变量fade,并在每次游戏更新时增加delta。当fade大于或等于1时,我会使用if语句将其限制为一个。

这是我的代码片段

public class MainMenu implements Screen{

public static SpriteBatch batch;
private static OrthographicCamera camera;
private static Music music;
private static BitmapFont font;
private static CharSequence title, subTitle;
private static float fade;

public MainMenu() {

    music = AssetLoader.getMainMenuMusic();
    music.setLooping(true);
    music.play();

    camera = new OrthographicCamera();
    camera.setToOrtho(true, 480, 800);

    batch = new SpriteBatch();

    title = "Text1";
    subTitle = "Text2";
    fade = 0;

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


}


@Override
public void show() {
    // TODO Auto-generated method stub

}

@Override
public void render(float delta) {
    // TODO Auto-generated method stub

    fade += delta;
    if(fade >= 1) {
       fade = 1;
    }

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    font.setScale(1.0f);
    font.setColor(1, 1, 1, fade);
    font.draw(batch, title, 100, 600);
    font.setScale(0.5f);
    font.draw(batch, subTitle, 200, 500);
    batch.end();

}

当我运行此文件时,我的两行文字将会淡入。但是,fade会在1处不断更新,如果这是在计算,我觉得这样做很浪费应用程序运行的整个时间。

另外,我无法弄清楚如何使用这种方法逐个淡化文本。

那我该怎么做呢?我有一种感觉,我的方式可能是完全错误的,但我不熟悉的是libGDX知道如何做到这一点。

1 个答案:

答案 0 :(得分:5)

我想你可以换行

fade += delta;
if(fade >= 1) {
   fade = 1;
}

if(fade < 1)区块中,但这种优化在此阶段浪费您的时间。它是微不足道的,但是如果你在循环中对数百个对象做这样的事情,它会很有用(这是我建议它的唯一原因,所以你可以记住它以备将来使用)。

顺便说一句,如果你正在淡入某些东西,那么使用曲线而不是像你正在做的线性插值看起来要好得多。 Libgdx已经为这种事情提供了内置的辅助类。你可以这样做:

private static final float FADE_IN_TIME = 1f;
private float fadeElapsed = 0;

fadeElapsed += delta;
float fade = Interpolation.fade.apply(fadeElapsed / FADE_IN_TIME);

如你所问的那样错开两个物体的褪色,它只需要一个额外的参数:

private static final float SUBTITLE_FADE_DELAY = 0.5f;

float fade2 = Interpolation.fade.apply((fadeElapsed-SUBTITLE_FADE_DELAY) / FADE_IN_TIME);

//...

batch.begin();
font.setScale(1.0f);
font.setColor(1, 1, 1, fade);
font.draw(batch, title, 100, 600);
font.setScale(0.5f);
font.setColor(1, 1, 1, fade2);
font.draw(batch, subTitle, 200, 500);
batch.end();