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

Java 在libGDX中逐个淡入文本字符串,java,libgdx,Java,Libgdx,目前我正在尝试用libGDX开发一个游戏。现在,我正在尝试创建一个简短的游戏介绍 简短的介绍只是一个纯色背景,一串串文本(不同大小)一个接一个地消失 现在,我的策略是创建一个变量fade,该变量从0开始,每次游戏更新时增加增量。当fade大于或等于1时,我使用if语句将其限制为1 这是我的一段代码 public class MainMenu implements Screen{ public static SpriteBatch batch; private static Orthograph

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

简短的介绍只是一个纯色背景,一串串文本(不同大小)一个接一个地消失

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

这是我的一段代码

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还不够熟悉,不知道怎么做。

我想你可以总结一下

fade += delta;
if(fade >= 1) {
   fade = 1;
}
if(fade<1)
块中,但是这种优化在这个阶段是浪费时间的。这是无关紧要的,但是如果你在一个循环中对数百个对象执行类似的操作,它将是有用的(这是我建议这样做的唯一原因,所以你可以记住它以备将来使用)

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

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();

谢谢,这很好,但是你能解释一下为什么你需要淡入淡出时间吗?如果该值为1,那么与
fadeepersed/1
相比,它是否与
fadeepersed/1
完全相同?只有将其保留为1秒时才是相同的。如果你省略了它,你就隐藏了一个常数。将常量硬编码到函数或方法中通常是不好的编程实践,因为这会使以后更难找到bug,如果在多个位置使用某个值,则更容易出现bug,并且您失去了快速调整程序许多方面的能力。