我有20個賤人,我希望它們在單擊按鈕時動畫。 兩種類型的動畫1)位置2)旋轉。在Libgdx中定位和旋轉動畫
有沒有推薦的方法來做到這一點?只有我能想到的方法是在Render方法中遞歸地調用設置角度和增量值,直到達到所需的位置和角度。
我有20個賤人,我希望它們在單擊按鈕時動畫。 兩種類型的動畫1)位置2)旋轉。在Libgdx中定位和旋轉動畫
有沒有推薦的方法來做到這一點?只有我能想到的方法是在Render方法中遞歸地調用設置角度和增量值,直到達到所需的位置和角度。
當你有一個開始狀態和一個結束狀態,並且你想要填充中間狀態時,這就是所謂的「補間(來自中間)」。它來自卡通動畫,但已經逐漸普遍使用。
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)。
你也可以使用spine 2d進行動畫。它的成本,但它是值得的。 60美元我認爲,您可以獲得完整的libgdx支持+骨骼操縱和動畫。
如果你想用但只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
}
這也是我的想法,我希望有更好的方法。謝謝 – pats
感謝您的回覆,您能否給我舉一個很好的例子。假設我想讓精靈從屏幕的頂部移動到底部。 – pats
@pats添加了一個示例,以便您看到它是否適合您的案例 – BinaryMonkL