在Libgdx中定位和旋转动画

时间:2017-09-25 03:35:04

标签: animation opengl-es libgdx

我有20个spites,我想让它们在点击按钮时动画。 两种类型的动画1)位置2)旋转。

有推荐的方法吗?我能想到的唯一方法是递归地在Render方法上调用setposition和angle与delta值,直到达到所需的位置和角度。

2 个答案:

答案 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支持+骨骼绑定和动画。

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
}