在 libGDX 中一个接一个地淡入文本字符串
Fade in strings of text one by one in libGDX
我正在尝试用 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
不断更新自己,我觉得如果这样做是一种浪费正在计算应用 运行ning 的整个时间。
另外,我不知道如何使用这种方法将文本逐条淡入淡出。
那么我应该怎么做呢?我感觉我的方法可能完全错了,但我还不够熟悉 libGDX 不知道怎么做。
我想你可以包装
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();
我正在尝试用 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
不断更新自己,我觉得如果这样做是一种浪费正在计算应用 运行ning 的整个时间。
另外,我不知道如何使用这种方法将文本逐条淡入淡出。
那么我应该怎么做呢?我感觉我的方法可能完全错了,但我还不够熟悉 libGDX 不知道怎么做。
我想你可以包装
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();