2017-03-22 19 views
3

我在Libgdx中做文本動畫。試圖做類似Libgdx computeGlyphAdvancesAndPositions不存在

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已經不退出,該怎麼辦?

編輯

我讀這blog post它說,使用GlyphLayout,但我不知道該怎麼做? GlyphLayout不走,我想給

我想要做的事,如動畫this video參數,舊的源代碼是here但如上所述,它不會了,因爲我強調了部分的工作。

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() { 
    } 
} 
+0

GlyphLayout可以用來代替,其提供每個字形位置。 – Aryan

+0

@AbhishekAryan它採用相同的參數嗎? – Lynob

回答

2

由於libGDXversion 1.5.6,所述方法BitmapFont.computeGlyphAdvancesAndPositionswas removed贊成GlyphLayout

BitmapFont.computeGlyphAdvancesAndPositions返回2個數組,其中包含給定的CharSequence的字符的前進和位置。

要檢索使用GlyphLayout相同的信息:

  1. 創建GlyphLayout對象和設置所需的字體和文本:

    GlyphLayout layout = new GlyphLayout(); 
    layout.setText(font, text); 
    
  2. 提供的文本將被分裂成基於「運行」換行;在情況下,沒有新行整個文本將被存儲在第一運行:

    GlyphRun run = layout.runs.get(0); 
    
  3. GlyphRun包含xAdvances這與由BitmapFont.computeGlyphAdvancesAndPositions返回的進步陣列;所不同的是所述陣列的所述第一位置包含所述X軸偏移相對於所述繪圖位置,而i-th字符的實際提前寬度是在該陣列的i-th + 1元件:

    float startingOffset = run.xAdvances.get(0); 
    float ithAdvance = run.xAdvances.get(i + 1); 
    
  4. 不幸的是,位置文本的單個字符都不再容易得到,但是我們可以通過添加前面的字符的進步獲得他們:

    float[] positions = new float[text.length()]; 
    for (int i = 0; i < positions.length; i++) { 
        if (i == 0) { 
         // first position is the starting offset 
         positions[0] = run.xAdvances.get(0); 
        } else { 
         // current position is the previous position plus its advance 
         positions[i] = positions[i - 1] + run.xAdvances.get(i); 
        }   
    } 
    

結論:

  • advances.get(i)run.xAdvances.get(i + 1)
  • post.get(i)代替由positions[i]代替,得到前(或以等同的方式),其表明