Animation 在Libgdx中定位和旋转动画

Animation 在Libgdx中定位和旋转动画,animation,opengl-es,libgdx,Animation,Opengl Es,Libgdx,我有20个唾沫,我想他们是动画时,一个按钮被点击。 两种类型的动画1)位置2)旋转 有推荐的方法吗?我能想到的唯一方法是在Render方法上使用delta值递归调用setposition和angle,直到达到所需的位置和角度

我有20个唾沫,我想他们是动画时,一个按钮被点击。 两种类型的动画1)位置2)旋转


有推荐的方法吗?我能想到的唯一方法是在Render方法上使用delta值递归调用setposition和angle,直到达到所需的位置和角度 LibGDX使用通用Tween引擎。你可以开始你的旅程,以动画任何你想要的。但是,为了更详细地说明它是如何工作的,这里有一个来自我自己的一些东西的例子。关于精灵,有一个类似的用例,但我将精灵包装在一个更通用的类JJRenderNode中。这是我如何让我的班级对被吐温敞开大门的

首先,你需要一个吐温助教来帮助你想要吐温的班级

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;
    }
}
}
然后你可以自由地在你的班级之间穿行,例如:

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

另外,您还需要一个TweenManger的实例,并且需要为每个gameloop使用delta进行更新。我有一个“单独的”全局实例,我到处使用它(JJ.TWeEnMealm)。

< P>当你有一个开始状态和一个结束状态,并且你想要填入中间状态时,这就是所谓的“TWEENEN”(从中间)。它来源于卡通动画,但已被广泛使用

LibGDX使用通用Tween引擎。你可以开始你的旅程,以动画任何你想要的。但是,为了更详细地说明它是如何工作的,这里有一个来自我自己的一些东西的例子。关于精灵,有一个类似的用例,但我将精灵包装在一个更通用的类JJRenderNode中。这是我如何让我的班级对被吐温敞开大门的

首先,你需要一个吐温助教来帮助你想要吐温的班级

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;
    }
}
}
然后你可以自由地在你的班级之间穿行,例如:

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

另外,您还需要一个TweenManger的实例,并且需要为每个gameloop使用delta进行更新。我有一个“singleton”全局实例,在任何地方都可以使用(JJ.TweenManager)。

您也可以使用spine 2d制作动画。这很贵,但值得。我想,只要花60美元,你就可以获得libgdx的全面支持+骨骼装配和动画

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

但是,如果确实希望仅使用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
} 

您也可以使用spine 2d进行动画。这很贵,但值得。我想,只要花60美元,你就可以获得libgdx的全面支持+骨骼装配和动画

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

但是,如果确实希望仅使用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添加了一个例子,这样你们就可以看到它是否适合你们的情况。这也是我的想法,我希望有更好的方法。谢谢这也是我的想法,我希望有更好的方法。谢谢