2017-03-22 2 views
3

Ich mache Textanimation in Libgdx. Der Versuch, so etwas wieLibgdx computeGlyphAdvancesAndPositions existiert nicht

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

Aber computeGlyphAdvancesAndPositions nicht mehr verlassen zu tun, was zu tun ist?

EDIT

Ich lese diese blog post die sagt GlyphLayout zu verwenden, aber ich weiß nicht, wie das zu tun? GlyphLayout nicht die Parameter nehme ich

ich so etwas wie die Animation tun, wollen in this video, die alte Quellcode geben wollen, ist here Aber wie bereits erwähnt, funktioniert es nicht mehr, weil der Abschnitt I hervorgehoben.

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 stattdessen verwendet werden kann, die jeweils Glyphe Position zur Verfügung stellt. – Aryan

+0

@AbhishekAryan braucht es die gleichen Parameter? – Lynob

Antwort

2

Seit version 1.5.6 von libGDX, wobei das Verfahren BitmapFont.computeGlyphAdvancesAndPositionswas removed für GlyphLayout.

BitmapFont.computeGlyphAdvancesAndPositions zurückgegeben 2 Arrays, die die Fortschritte und Positionen der Zeichen der angegebenen CharSequence enthalten.

  1. erstellen GlyphLayout Objekt und stellen Sie die gewünschte Schriftart und Text:

    GlyphLayout layout = new GlyphLayout(); 
    layout.setText(font, text); 
    
  2. die bereitgestellte Text gespaltet wird in "runs" auf Basis

    Um die gleichen Informationen GlyphLayout abrufen auf Zeilenumbrüchen; falls es keine Zeilenumbrüche der gesamte Text in dem ersten Durchlauf gespeichert werden:

    GlyphRun run = layout.runs.get(0); 
    
  3. GlyphRunxAdvances enthält, die mit den Fortschritten Array von BitmapFont.computeGlyphAdvancesAndPositions zurück vergleichbar ist; der Unterschied ist, dass die erste Position des Array enthält die X an die Zeichnungsposition versetzt ist, während die tatsächliche Fortschritt Breite des i-th Zeichens im i-th + 1 Elemente des Arrays ist:

    float startingOffset = run.xAdvances.get(0); 
    float ithAdvance = run.xAdvances.get(i + 1); 
    
  4. leider die Positionen die einzelnen Zeichen des Textes ist nicht mehr leicht verfügbar, aber wir können sie, indem die Fortschritte der vorherigen Zeichen erhalten:

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

Fazit:

  • advances.get(i) von run.xAdvances.get(i + 1)
  • post.get(i) ersetzt wird durch positions[i] ersetzt, wie gezeigt, das vor dem (oder in äquivalenter Weise)