com.bladecoder.engine.anim.WalkTween.java Source code

Java tutorial

Introduction

Here is the source code for com.bladecoder.engine.anim.WalkTween.java

Source

/*******************************************************************************
 * Copyright 2014 Rafael Garcia Moreno.
 * 
 * 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 com.bladecoder.engine.anim;

import java.util.ArrayList;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.Json.Serializable;
import com.badlogic.gdx.utils.JsonValue;
import com.bladecoder.engine.actions.ActionCallback;
import com.bladecoder.engine.assets.EngineAssetManager;
import com.bladecoder.engine.model.CharacterActor;
import com.bladecoder.engine.model.SpriteActor;
import com.bladecoder.engine.util.ActionCallbackSerialization;
import com.bladecoder.engine.util.InterpolationMode;

/**
 * Tween for frame animation
 */
public class WalkTween extends SpritePosTween implements Serializable {

    private ArrayList<Vector2> walkingPath;
    private int currentStep = 0;
    private float speed = 0;

    private ActionCallback walkCb;

    public WalkTween() {
    }

    public void start(CharacterActor target, ArrayList<Vector2> walkingPath, float speed, ActionCallback cb) {
        this.walkingPath = walkingPath;
        this.speed = speed;
        this.currentStep = 0;

        if (cb != null) {
            walkCb = cb;
        }

        restart();
        walkToNextStep(target);
    }

    private void walkToNextStep(CharacterActor target) {
        Vector2 p0 = walkingPath.get(currentStep);
        Vector2 pf = walkingPath.get(currentStep + 1);

        target.startWalkAnim(p0, pf);

        float s0 = target.getScene().getFakeDepthScale(p0.y);
        float sf = target.getScene().getFakeDepthScale(pf.y);

        //      float segmentDuration = p0.dst(pf)
        //            / (EngineAssetManager.getInstance().getScale() * speed);

        // t = dst/((vf+v0)/2)
        float segmentDuration = p0.dst(pf) / (EngineAssetManager.getInstance().getScale() * speed * (s0 + sf) / 2);

        segmentDuration *= (s0 > sf ? s0 / sf : sf / s0);

        InterpolationMode i = InterpolationMode.LINEAR;

        if (Math.abs(s0 - sf) > .25)
            i = s0 > sf ? InterpolationMode.POW2OUT : InterpolationMode.POW2IN;

        if (currentStep == walkingPath.size() - 2 && walkCb != null) {
            start(target, Type.NO_REPEAT, 1, pf.x, pf.y, segmentDuration, InterpolationMode.LINEAR, i, walkCb);
        } else {
            start(target, Type.NO_REPEAT, 1, pf.x, pf.y, segmentDuration, InterpolationMode.LINEAR, i, null);
        }
    }

    private void segmentEnded(CharacterActor target) {

        currentStep++;

        if (currentStep < walkingPath.size() - 1) {
            walkToNextStep(target);
        } else { // WALK ENDED
            target.stand();
        }
    }

    @Override
    public void update(SpriteActor a, float delta) {
        super.update(a, delta);

        if (isComplete())
            segmentEnded((CharacterActor) a);
    }

    @Override
    public void write(Json json) {
        super.write(json);

        json.writeValue("path", walkingPath);
        json.writeValue("currentStep", currentStep);
        json.writeValue("speed", speed);

        json.writeValue("walkCb", ActionCallbackSerialization.find(walkCb), walkCb == null ? null : String.class);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void read(Json json, JsonValue jsonData) {
        super.read(json, jsonData);

        walkingPath = json.readValue("path", ArrayList.class, Vector2.class, jsonData);
        currentStep = json.readValue("currentStep", Integer.class, jsonData);
        speed = json.readValue("speed", Float.class, jsonData);

        String walkCbSer = json.readValue("walkCb", String.class, jsonData);
        walkCb = ActionCallbackSerialization.find(walkCbSer);
    }
}