代码之家  ›  专栏  ›  技术社区  ›  pats

在Libgdx中定位和旋转动画

  •  0
  • pats  · 技术社区  · 7 年前

    两种类型的动画1)位置2)旋转。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Laurence    7 年前

    当你有一个开始状态和一个结束状态,并且你想要填充中间状态时,这被称为“tweening(来自中间)。它来自卡通动画,但已被广泛使用。

    LibGDX使用通用Tween引擎。你可以开始制作任何你想要的动画 here

    首先,你需要一个TweenAccessor来完成你想要的tween课程。

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

    您必须按以下方式注册此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);
    

    另外,你还需要一个TweenManger的实例,这需要为每个gameloop更新delta。我有一个“单例”全局实例,我在任何地方都使用它(JJ.TweenManager)。

        2
  •  1
  •   Lucas B    7 年前

    http://esotericsoftware.com/

    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
    }