2017-09-25 60 views
0

我有20個賤人,我希望它們在單擊按鈕時動畫。 兩種類型的動畫1)位置2)旋轉。在Libgdx中定位和旋轉動畫

有沒有推薦的方法來做到這一點?只有我能想到的方法是在Render方法中遞歸地調用設置角度和增量值,直到達到所需的位置和角度。

回答

1

當你有一個開始狀態和一個結束狀態,並且你想要填充中間狀態時,這就是所謂的「補間(來自中間)」。它來自卡通動畫,但已經逐漸普遍使用。

LibGDX使用通用吐溫引擎。你可以開始你的旅程,動畫任何你想要的here。但是,爲了更詳細地介紹它的工作原理,下面是我自己的一些例子。一個與精靈相似的用例,但是我的精靈包裝在一個更通用的類JJRenderNode中。以下是我如何讓自己的課堂可以進行補習。

首先,你需要一個TweenAccessor來爲你想補間的類。

public class RenderNodeTweenAccessor implements TweenAccessor<JJRenderNode> { 


public static final int WIDTH = 1; 
public static final int HEIGHT = 2; 
public static final int WIDTH_HEIGHT = 3; 
public static final int ALPHA = 4; 
public static final int ALPHA_WIDTH_HEIGHT=5; 

@Override 
public int getValues(JJRenderNode target, int tweenType, float[] returnValues) { 
    switch (tweenType) { 
     case WIDTH: 
      returnValues[0] = target.getWidth(); 
      return 1; 
     case HEIGHT: 
      returnValues[0] = target.getHeight(); 
      return 1; 
     case WIDTH_HEIGHT: 
      returnValues[0] = target.getWidth(); 
      returnValues[1] = target.getHeight(); 
      return 2; 
     case ALPHA: 
      returnValues[0] = target.getColour().a; 
      return 1; 
     case ALPHA_WIDTH_HEIGHT: 
      returnValues[0] = target.getColour().a; 
      returnValues[1] = target.getWidth(); 
      returnValues[2] = target.getHeight(); 
      return 3; 
     default: 
      assert false; 
      return -1; 
    } 
} 

@Override 
public void setValues(JJRenderNode target, int tweenType, float[] newValues) { 
    switch (tweenType) { 
     case WIDTH: 
      target.setWidth(newValues[0]); 
      break; 
     case HEIGHT: 
      target.setHeight(newValues[0]); 
      break; 
     case WIDTH_HEIGHT: 
      target.setWidth(newValues[0]); 
      target.setHeight(newValues[1]); 
      break; 
     case ALPHA: 
      target.getColour().a=newValues[0]; 
      break; 
     case ALPHA_WIDTH_HEIGHT: 
      target.getColour().a=newValues[0]; 
      target.setWidth(newValues[1]); 
      target.setHeight(newValues[2]); 
     default: 
      break; 
    } 
} 
} 

恆定整數和在每個「tweenType」 get和set方法讓你補間場的多個組合。在這種情況下,我有我的JJRenderNode的寬度,高度和alpha值的不同組合。

你有如下注冊此TweenAccessor:

Tween.registerAccessor(JJRenderNode.class, new RenderNodeTweenAccessor()); 

然後你可以自由地補間類,例如:

Timeline.createSequence() 
       .push(Tween.set(node, RenderNodeTweenAccessor.WIDTH_HEIGHT).target(START_WIDTH, START_WIDTH)) 
       .push(Tween.to(node, RenderNodeTweenAccessor.WIDTH_HEIGHT, 0.4f).target(PuzzleBlockCore.MAX_RENDER_WIDTH, PuzzleBlockCore.MAX_RENDER_WIDTH)) 
       .start(JJ.tweenManager); 

PS。你還需要一個TweenManger的實例,並且這需要用每個遊戲循環的增量更新。我有一個我在任何地方都使用的'singleton'全局實例(JJ.TweenManager)。

+0

感謝您的回覆,您能否給我舉一個很好的例子。假設我想讓精靈從屏幕的頂部移動到底部。 – pats

+0

@pats添加了一個示例,以便您看到它是否適合您的案例 – BinaryMonkL

1

你也可以使用spine 2d進行動畫。它的成本,但它是值得的。 60美元我認爲,您可以獲得完整的libgdx支持+骨骼操縱和動畫。

http://esotericsoftware.com/

如果你想用但只libgdx動畫,你可以創建你的所有精靈的動畫框架,通過循環列表,並切換精靈紋理下一幀的動畫。

private void render() { 
    sprite.set(aninationframes.get(currentFrame) 
    currentFrame = currentFrame + 1} 

雖然,您可能希望每幀添加一個延遲。

If(current time - time > some value) { 
    sprite.set(animationframes.get(currrntFrame) 
    currentFrame = currentFrame + 1 
    time = get current time here 
} 
+0

這也是我的想法,我希望有更好的方法。謝謝 – pats