我有20个spites,我想让它们在点击按钮时动画。 两种类型的动画1)位置2)旋转。
有推荐的方法吗?我能想到的唯一方法是递归地在Render方法上调用setposition和angle与delta值,直到达到所需的位置和角度。
答案 0 :(得分:1)
当你有一个开始状态和一个结束状态,并且你想填写中间状态时,这被称为'补间(来自中间)。它来自卡通动画,但已经得到更广泛的使用。
LibGDX使用Universal Tween Engine。您可以开始为您想要的任何内容制作动画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;
}
}
}
每个get和set方法中的常量int和'tweenType'允许您补间多个字段组合。在这种情况下,我的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的实例,并且需要使用delta为每个游戏循环更新。我有一个“单例”全局实例,我到处使用它(JJ.TweenManager)。
答案 1 :(得分:1)
您最好使用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
}