我用Libgdx做文字动画。试着做这样的事
font1 = new BitmapFont(Gdx.files.internal("fontLabel/fonty.fnt"), false);
font1.getRegion().getTexture()
.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
touchPos = new Vector3();
listchar = new TextButton[pause.length()];
advances = new FloatArray();
post = new FloatArray();
font1.computeGlyphAdvancesAndPositions(pause, advances, post);
但是computeGlyphAdvancesAndPositions
不再退出了,该怎么办?
编辑
我读过这个博客帖子,它说要使用GlyphLayout
,但是我不知道怎么做?GlyphLayout
不接受我想要给出的参数
我想做一些像这段视频中的动画一样的事情,旧的源代码是这里,但是如上所述,由于我突出显示的部分,它不再工作了。
package com.tntstudio.texteffect;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.FloatArray;
public class TECore implements ApplicationListener {
private Stage stage;
private BitmapFont font;
private TextButton[] listchar;
private FloatArray post, advances;
private String text;
private static final float time = 0.5f, delay = 0.2f;
private static final float x = 200f, y = 200f;
@Override
public void create() {
stage = new Stage(800f, 480f, true);
font = new BitmapFont(Gdx.files.internal("data/texteffect.fnt"));
font.getRegion().getTexture()
.setFilter(TextureFilter.Linear, TextureFilter.Linear);
text = "manh phi libgdx";
listchar = new TextButton[text.length()];
advances = new FloatArray();
post = new FloatArray();
font.computeGlyphAdvancesAndPositions(text, advances, post);
final TextButtonStyle style = new TextButtonStyle();
style.font = font;
/*-------- List Text --------*/
for (int i = 0; i < text.length(); i++) {
listchar[i] = new TextButton(String.valueOf(text.charAt(i)), style);
listchar[i].setTransform(true);
listchar[i].setPosition(x + post.get(i), y);
listchar[i].setOrigin(advances.get(i) / 2,
listchar[i].getHeight() / 4);
stage.addActor(listchar[i]);
}
Gdx.input.setInputProcessor(stage);
/*-------- Drop Effect Adapter --------*/
TextButton drop = new TextButton("drop", style);
drop.setPosition(0, 10);
drop.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
dropText();
}
});
stage.addActor(drop);
/*-------- Spin effect Adapter --------*/
TextButton spin = new TextButton("spin", style);
spin.setPosition(0, 100f);
spin.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
spinText();
}
});
stage.addActor(spin);
/*-------- Appear effect Adapter --------*/
TextButton appear = new TextButton("appear", style);
appear.setPosition(0, 300f);
appear.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
appearText();
}
});
stage.addActor(appear);
}
// ///////////////////////////////////////////////////////////////
// Reset Param of a char in text
// ///////////////////////////////////////////////////////////////
private void resetText() {
for (int i = 0; i < text.length(); i++) {
listchar[i].setPosition(x + post.get(i), y);
listchar[i].setOrigin(advances.get(i) / 2,
listchar[i].getHeight() / 4);
listchar[i].setColor(0, 0, 0, 1);
listchar[i].setScale(1f);
}
}
private void dropText() {
resetText();
for (int i = 0; i < text.length(); i++) {
listchar[i].setY(y + 200f);
listchar[i].setColor(0, 0, 0, 0);
listchar[i].addAction(Actions.delay(
delay * i,
Actions.parallel(Actions.alpha(1, time), Actions.moveTo(x
+ post.get(i), y, time, Interpolation.bounceOut))));
}
}
private void spinText() {
resetText();
for (int i = 0; i < text.length(); i++) {
listchar[i].addAction(Actions.delay(delay * i,
Actions.rotateBy(360f, time * 5, Interpolation.elastic)));
}
}
private void appearText(){
resetText();
for (int i=0; i<text.length(); i++){
listchar[i].setScale(0f);
listchar[i].setColor(0, 0, 0, 0);
listchar[i].addAction(Actions.delay(delay*i, Actions.parallel(Actions.alpha(1, time), Actions.scaleTo(1, 1, time, Interpolation.swingOut))));
}
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
发布于 2017-03-26 09:07:33
自版本1.5.6 of libGDX
以来,BitmapFont.computeGlyphAdvancesAndPositions
移除方法更倾向于GlyphLayout
。
BitmapFont.computeGlyphAdvancesAndPositions
返回两个数组,其中包含给定CharSequence
字符的进位和位置。
使用GlyphLayout
检索相同的信息
GlyphLayout
对象并设置所需的字体和文本:
GlyphLayout布局=新的GlyphLayout();layout.setText(字体、文本);GlyphRun
包含与BitmapFont.computeGlyphAdvancesAndPositions
返回的高级数组相当的xAdvances
;不同的是,数组的第一个位置包含相对于绘图位置的X偏移量,而i-th
字符的实际前进宽度位于数组的i-th + 1
元素中:
startingOffset = run.xAdvances.get(0);ithAdvance = run.xAdvances.get(i + 1);最后:
advances.get(i)
被run.xAdvances.get(i + 1)
取代post.get(i)
被positions[i]
取代,如前面所示(或以相同的方式)https://stackoverflow.com/questions/42954159
复制