com.esotericsoftware.spine.superspineboy.EnemyView.java Source code

Java tutorial

Introduction

Here is the source code for com.esotericsoftware.spine.superspineboy.EnemyView.java

Source

/******************************************************************************
 * Spine Runtimes Software License
 * Version 2.1
 * 
 * Copyright (c) 2013, Esoteric Software
 * All rights reserved.
 * 
 * You are granted a perpetual, non-exclusive, non-sublicensable and
 * non-transferable license to install, execute and perform the Spine Runtimes
 * Software (the "Software") solely for internal use. Without the written
 * permission of Esoteric Software (typically granted by licensing Spine), you
 * may not (a) modify, translate, adapt or otherwise create derivative works,
 * improvements of the Software or develop new applications using the Software
 * or (b) remove, delete, alter or obscure any trademarks or any copyright,
 * trademark, patent or other intellectual property or proprietary rights notices
 * on or in the Software, including any copy thereof. Redistributions in binary
 * or source form must include this license and terms.
 * 
 * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

package com.esotericsoftware.spine.superspineboy;

import com.esotericsoftware.spine.Animation;
import com.esotericsoftware.spine.AnimationState;
import com.esotericsoftware.spine.AnimationState.AnimationStateAdapter;
import com.esotericsoftware.spine.Bone;
import com.esotericsoftware.spine.Event;
import com.esotericsoftware.spine.EventData;
import com.esotericsoftware.spine.Skeleton;
import com.esotericsoftware.spine.Slot;
import com.esotericsoftware.spine.attachments.Attachment;
import com.esotericsoftware.spine.superspineboy.Assets.SoundEffect;
import com.esotericsoftware.spine.superspineboy.Enemy.Type;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.MathUtils;

/** The view class for an enemy. */
class EnemyView extends CharacterView {
    Enemy enemy;
    Animation hitAnimation;
    Slot headSlot;
    Attachment burstHeadAttachment;
    Color headColor;

    EnemyView(final View view, Enemy enemy) {
        super(view);
        this.enemy = enemy;

        skeleton = new Skeleton(view.assets.enemySkeletonData);
        burstHeadAttachment = skeleton.getAttachment("head", "burst01");
        headSlot = skeleton.findSlot("head");
        hitAnimation = skeleton.getData().findAnimation("hit");

        animationState = new AnimationState(view.assets.enemyAnimationData);

        // Play squish sound when enemies die.
        final EventData squishEvent = view.assets.enemySkeletonData.findEvent("squish");
        animationState.addListener(new AnimationStateAdapter() {
            public void event(int trackIndex, Event event) {
                if (event.getData() == squishEvent)
                    SoundEffect.squish.play();
            }
        });

        // Enemies have slight color variations.
        if (enemy.type == Type.strong)
            headColor = new Color(1, 0.6f, 1, 1);
        else
            headColor = new Color(MathUtils.random(0.8f, 1), MathUtils.random(0.8f, 1), MathUtils.random(0.8f, 1),
                    1);
        headSlot.getColor().set(headColor);
    }

    void update(float delta) {
        // Change head attachment for enemies that are about to die.
        if (enemy.hp == 1 && enemy.type != Type.weak)
            headSlot.setAttachment(burstHeadAttachment);

        // Change color for big enemies.
        if (enemy.type == Type.big)
            headSlot.getColor().set(headColor).lerp(0, 1, 1, 1, 1 - enemy.bigTimer / Enemy.bigDuration);

        skeleton.setX(enemy.position.x + Enemy.width / 2);
        skeleton.setY(enemy.position.y);

        if (!setAnimation(view.assets.enemyStates.get(enemy.state), enemy.stateChanged))
            animationState.update(delta);
        animationState.apply(skeleton);

        Bone root = skeleton.getRootBone();
        root.setScaleX(root.getScaleX() * enemy.size);
        root.setScaleY(root.getScaleY() * enemy.size);

        skeleton.setFlipX(enemy.dir == -1);
        skeleton.updateWorldTransform();
    }
}