首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Libgdx computeGlyphAdvancesAndPositions不存在

Libgdx computeGlyphAdvancesAndPositions不存在
EN

Stack Overflow用户
提问于 2017-03-22 14:13:06
回答 1查看 167关注 0票数 2

我用Libgdx做文字动画。试着做这样的事

代码语言:javascript
代码运行次数:0
运行
复制
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不接受我想要给出的参数

我想做一些像这段视频中的动画一样的事情,旧的源代码是这里,但是如上所述,由于我突出显示的部分,它不再工作了。

代码语言:javascript
代码运行次数:0
运行
复制
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() {
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-26 17:07:33

版本1.5.6 of libGDX以来,BitmapFont.computeGlyphAdvancesAndPositions 移除方法更倾向于GlyphLayout

BitmapFont.computeGlyphAdvancesAndPositions返回两个数组,其中包含给定CharSequence字符的进位和位置。

使用GlyphLayout检索相同的信息

  1. 创建一个GlyphLayout对象并设置所需的字体和文本: GlyphLayout布局=新的GlyphLayout();layout.setText(字体、文本);
  2. 所提供的文本将根据换行符分为“run”;如果没有换行符,则整个文本将存储在第一次运行中: GlyphRun run = layout.runs.get(0);
  3. GlyphRun包含与BitmapFont.computeGlyphAdvancesAndPositions返回的高级数组相当的xAdvances;不同的是,数组的第一个位置包含相对于绘图位置的X偏移量,而i-th字符的实际前进宽度位于数组的i-th + 1元素中: startingOffset = run.xAdvances.get(0);ithAdvance = run.xAdvances.get(i + 1);
  4. 不幸的是,文本中单个字符的位置不再容易获得,但是我们可以通过添加前几个字符的进步来获得它们: float[] plus =新的floattext.length();for (int i= 0;i< positions.length;i++) { if (i == 0) { //第一个位置是起始偏移位置= run.xAdvances.get(0);}{ //当前位置是前一个位置加上其前进位置=位置-1+ run.xAdvances.get(i);}

最后:

  • advances.get(i)run.xAdvances.get(i + 1)取代
  • post.get(i)positions[i]取代,如前面所示(或以相同的方式)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42954159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档