dorkbox.tweenengine.demo.tests.TimeManipulation.java Source code

Java tutorial

Introduction

Here is the source code for dorkbox.tweenengine.demo.tests.TimeManipulation.java

Source

/*
 * Copyright 2012 Aurelien Ribon
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dorkbox.tweenengine.demo.tests;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Sprite;
import dorkbox.accessors.SpriteAccessor;
import dorkbox.tweenengine.BaseTween;
import dorkbox.tweenengine.Timeline;
import dorkbox.tweenengine.Tween;
import dorkbox.tweenengine.TweenCallback;
import dorkbox.tweenengine.TweenEquations;
import dorkbox.tweenengine.TweenManager;
import dorkbox.tweenengine.demo.Test;

import java.util.Locale;

/**
 * @author Aurelien Ribon | http://www.aurelienribon.com
 */
public class TimeManipulation extends Test {
    private final TweenManager tweenManager = new TweenManager();
    private boolean canBeRestarted = false;
    private boolean canControlSpeed = false;
    private String text = "";
    private int iterationCnt;
    private float speed;

    @Override
    public String getTitle() {
        return "Time manipulation";
    }

    @Override
    public String getInfo() {
        return "Time scale can be easily modified in real-time. "
                + "(Drag the screen to change the animation speed)";
    }

    @Override
    public String getImageName() {
        return "tile-hourglass";
    }

    @Override
    public InputProcessor getInput() {
        return inputProcessor;
    }

    @Override
    protected void initializeOverride() {
        createSprites(4);
        sprites[0].setColor(1, 1, 1, 0);
        sprites[1].setColor(1, 1, 1, 0);
        sprites[2].setColor(1, 1, 1, 0);
        sprites[3].setColor(1, 1, 1, 0);
        launchAnimation();
    }

    @Override
    protected void disposeOverride() {
        tweenManager.killAll();
        canBeRestarted = canControlSpeed = false;
    }

    @Override
    protected void renderOverride() {
        tweenManager.update(Gdx.graphics.getDeltaTime() * speed);

        int w = Gdx.graphics.getWidth();
        int h = Gdx.graphics.getHeight();

        batch.getProjectionMatrix().setToOrtho2D(0, 0, w, h);
        batch.begin();
        font.setColor(Color.WHITE);
        font.draw(batch, String.format(Locale.US, "Current speed: %.2f", speed), 15, h - 15);
        font.draw(batch, text, 15, h - 45);
        batch.end();
    }

    // -------------------------------------------------------------------------
    // ANIMATION
    // -------------------------------------------------------------------------

    private void launchAnimation() {
        canControlSpeed = true;
        canBeRestarted = false;
        iterationCnt = 0;
        speed = 1;
        tweenManager.killAll();

        // The callback (to change the text at the right moments)

        TweenCallback callback = new TweenCallback(TweenCallback.Events.START | TweenCallback.Events.BACK_START
                | TweenCallback.Events.COMPLETE | TweenCallback.Events.BACK_COMPLETE) {
            @Override
            public void onEvent(int type, BaseTween source) {
                switch (type) {
                case Events.START:
                    text = "Iteration: " + (++iterationCnt) + " / " + 3;
                    break;
                case Events.BACK_START:
                    text = "Iteration: " + (--iterationCnt) + " / " + 3;
                    break;
                case Events.COMPLETE:
                    text = "Forwards play complete (touch to restart)";
                    canBeRestarted = true;
                    break;
                case Events.BACK_COMPLETE:
                    text = "Backwards play complete (touch to restart)";
                    canBeRestarted = true;
                    break;
                }
            }
        };

        // The animation itself
        Timeline.createParallel().push(buildSequence(sprites[0], 1, 0.0F, 1.4F))
                .push(buildSequence(sprites[1], 2, 0.2F, 1.0F)).push(buildSequence(sprites[2], 3, 0.4F, 0.6F))
                .push(buildSequence(sprites[3], 4, 0.6F, 0.2F)).addCallback(callback).repeat(2, 0.0F)
                .start(tweenManager);
    }

    private Timeline buildSequence(Sprite target, int id, float delay1, float delay2) {
        return Timeline.createSequence().push(Tween.set(target, SpriteAccessor.POS_XY).target(-0.5F, -0.5F))
                .push(Tween.set(target, SpriteAccessor.SCALE_XY).target(10, 10))
                .push(Tween.set(target, SpriteAccessor.ROTATION).target(0))
                .push(Tween.set(target, SpriteAccessor.OPACITY).target(0)).pushPause(delay1).beginParallel()
                .push(Tween.to(target, SpriteAccessor.OPACITY, 1.0F).target(1).ease(TweenEquations.Quart_InOut))
                .push(Tween.to(target, SpriteAccessor.SCALE_XY, 1.0F).target(1, 1).ease(TweenEquations.Quart_InOut))
                .pushPause(0.5F)
                .push(Tween.to(target, SpriteAccessor.POS_XY, 1.0F).target((6.0F / 5.0F) * id - 3 - 0.5F, -0.5F)
                        .ease(TweenEquations.Back_Out))
                .end()
                .push(Tween.to(target, SpriteAccessor.ROTATION, 0.8F).target(360).ease(TweenEquations.Cubic_InOut))
                .pushPause(delay2).beginParallel()
                .push(Tween.to(target, SpriteAccessor.SCALE_XY, 0.3F).target(3, 3).ease(TweenEquations.Quad_In))
                .push(Tween.to(target, SpriteAccessor.OPACITY, 0.3F).target(0).ease(TweenEquations.Quad_In)).end();
    }

    // -------------------------------------------------------------------------
    // Input
    // -------------------------------------------------------------------------

    private final InputProcessor inputProcessor = new InputAdapter() {
        private int lastX;

        @Override
        public boolean touchDown(int x, int y, int pointer, int button) {
            if (canBeRestarted)
                launchAnimation();
            lastX = x;
            return true;
        }

        @Override
        public boolean touchDragged(int x, int y, int pointer) {
            if (canControlSpeed) {
                float dx = (x - lastX) * camera.viewportWidth / Gdx.graphics.getWidth();
                speed += dx / 4;
            }

            lastX = x;
            return true;
        }
    };
}