1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.ChannelSystem.Channel; 20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType; 21cfd74d65d832137e20e193c960802afba73b5d38sm 22cfd74d65d832137e20e193c960802afba73b5d38smpublic class NPCAnimationComponent extends GameComponent { 23cfd74d65d832137e20e193c960802afba73b5d38sm 24cfd74d65d832137e20e193c960802afba73b5d38sm // Animations 25cfd74d65d832137e20e193c960802afba73b5d38sm public static final int IDLE = 0; 26cfd74d65d832137e20e193c960802afba73b5d38sm public static final int WALK = 1; 27cfd74d65d832137e20e193c960802afba73b5d38sm public static final int RUN_START = 2; 28cfd74d65d832137e20e193c960802afba73b5d38sm public static final int RUN = 3; 29cfd74d65d832137e20e193c960802afba73b5d38sm public static final int SHOOT = 4; 30cfd74d65d832137e20e193c960802afba73b5d38sm public static final int JUMP_START = 5; 31cfd74d65d832137e20e193c960802afba73b5d38sm public static final int JUMP_AIR = 6; 32cfd74d65d832137e20e193c960802afba73b5d38sm public static final int TAKE_HIT = 7; 33cfd74d65d832137e20e193c960802afba73b5d38sm public static final int SURPRISED = 8; 34cfd74d65d832137e20e193c960802afba73b5d38sm public static final int DEATH = 9; 35cfd74d65d832137e20e193c960802afba73b5d38sm 36cfd74d65d832137e20e193c960802afba73b5d38sm 37cfd74d65d832137e20e193c960802afba73b5d38sm protected static final float RUN_SPEED_THRESHOLD = 100.0f; 38cfd74d65d832137e20e193c960802afba73b5d38sm protected static final float JUMP_SPEED_THRESHOLD = 25.0f; 39cfd74d65d832137e20e193c960802afba73b5d38sm protected static final float FALL_SPEED_THRESHOLD = -25.0f; 40cfd74d65d832137e20e193c960802afba73b5d38sm protected static final float FALL_TIME_THRESHOLD = 0.2f; 41cfd74d65d832137e20e193c960802afba73b5d38sm 42cfd74d65d832137e20e193c960802afba73b5d38sm private int mCurrentAnimation; 43cfd74d65d832137e20e193c960802afba73b5d38sm private SpriteComponent mSprite; 44cfd74d65d832137e20e193c960802afba73b5d38sm private ChannelSystem.Channel mChannel; 45cfd74d65d832137e20e193c960802afba73b5d38sm private int mChannelTrigger; 46cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mFlying; 47cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mStopAtWalls; // Controls whether or not the character will go back 48cfd74d65d832137e20e193c960802afba73b5d38sm // to idle when running into a wall 49cfd74d65d832137e20e193c960802afba73b5d38sm 50cfd74d65d832137e20e193c960802afba73b5d38sm 51cfd74d65d832137e20e193c960802afba73b5d38sm public NPCAnimationComponent() { 52cfd74d65d832137e20e193c960802afba73b5d38sm super(); 53cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 54cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(GameComponent.ComponentPhases.ANIMATION.ordinal()); 55cfd74d65d832137e20e193c960802afba73b5d38sm } 56cfd74d65d832137e20e193c960802afba73b5d38sm 57cfd74d65d832137e20e193c960802afba73b5d38sm @Override 58cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 59cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 60cfd74d65d832137e20e193c960802afba73b5d38sm mChannel = null; 61cfd74d65d832137e20e193c960802afba73b5d38sm mSprite = null; 62cfd74d65d832137e20e193c960802afba73b5d38sm mFlying = false; 63cfd74d65d832137e20e193c960802afba73b5d38sm mStopAtWalls = true; 64cfd74d65d832137e20e193c960802afba73b5d38sm } 65cfd74d65d832137e20e193c960802afba73b5d38sm 66cfd74d65d832137e20e193c960802afba73b5d38sm @Override 67cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 68cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite != null) { 69cfd74d65d832137e20e193c960802afba73b5d38sm GameObject parentObject = (GameObject)parent; 70cfd74d65d832137e20e193c960802afba73b5d38sm 71cfd74d65d832137e20e193c960802afba73b5d38sm final int oldAnimation = mCurrentAnimation; 72cfd74d65d832137e20e193c960802afba73b5d38sm switch(mCurrentAnimation) { 73cfd74d65d832137e20e193c960802afba73b5d38sm case IDLE: 74cfd74d65d832137e20e193c960802afba73b5d38sm idle(parentObject); 75cfd74d65d832137e20e193c960802afba73b5d38sm break; 76cfd74d65d832137e20e193c960802afba73b5d38sm case WALK: 77cfd74d65d832137e20e193c960802afba73b5d38sm walk(parentObject); 78cfd74d65d832137e20e193c960802afba73b5d38sm break; 79cfd74d65d832137e20e193c960802afba73b5d38sm case RUN_START: 80cfd74d65d832137e20e193c960802afba73b5d38sm runStart(parentObject); 81cfd74d65d832137e20e193c960802afba73b5d38sm break; 82cfd74d65d832137e20e193c960802afba73b5d38sm case RUN: 83cfd74d65d832137e20e193c960802afba73b5d38sm run(parentObject); 84cfd74d65d832137e20e193c960802afba73b5d38sm break; 85cfd74d65d832137e20e193c960802afba73b5d38sm case SHOOT: 86cfd74d65d832137e20e193c960802afba73b5d38sm shoot(parentObject); 87cfd74d65d832137e20e193c960802afba73b5d38sm break; 88cfd74d65d832137e20e193c960802afba73b5d38sm case JUMP_START: 89cfd74d65d832137e20e193c960802afba73b5d38sm jumpStart(parentObject); 90cfd74d65d832137e20e193c960802afba73b5d38sm break; 91cfd74d65d832137e20e193c960802afba73b5d38sm case JUMP_AIR: 92cfd74d65d832137e20e193c960802afba73b5d38sm jumpAir(parentObject); 93cfd74d65d832137e20e193c960802afba73b5d38sm break; 94cfd74d65d832137e20e193c960802afba73b5d38sm case TAKE_HIT: 95cfd74d65d832137e20e193c960802afba73b5d38sm takeHit(parentObject); 96cfd74d65d832137e20e193c960802afba73b5d38sm break; 97cfd74d65d832137e20e193c960802afba73b5d38sm case SURPRISED: 98cfd74d65d832137e20e193c960802afba73b5d38sm surprised(parentObject); 99cfd74d65d832137e20e193c960802afba73b5d38sm break; 100cfd74d65d832137e20e193c960802afba73b5d38sm case DEATH: 101cfd74d65d832137e20e193c960802afba73b5d38sm death(parentObject); 102cfd74d65d832137e20e193c960802afba73b5d38sm break; 103cfd74d65d832137e20e193c960802afba73b5d38sm default: 104cfd74d65d832137e20e193c960802afba73b5d38sm assert(false); 105cfd74d65d832137e20e193c960802afba73b5d38sm } 106cfd74d65d832137e20e193c960802afba73b5d38sm 107cfd74d65d832137e20e193c960802afba73b5d38sm if (mChannel != null) { 108cfd74d65d832137e20e193c960802afba73b5d38sm if (mChannel.value != null 109cfd74d65d832137e20e193c960802afba73b5d38sm && ((ChannelSystem.ChannelBooleanValue)mChannel.value).value) { 110cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = mChannelTrigger; 111cfd74d65d832137e20e193c960802afba73b5d38sm } 112cfd74d65d832137e20e193c960802afba73b5d38sm } 113cfd74d65d832137e20e193c960802afba73b5d38sm 114cfd74d65d832137e20e193c960802afba73b5d38sm if (oldAnimation != mCurrentAnimation) { 115cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(mCurrentAnimation); 116cfd74d65d832137e20e193c960802afba73b5d38sm } 117cfd74d65d832137e20e193c960802afba73b5d38sm } 118cfd74d65d832137e20e193c960802afba73b5d38sm } 119cfd74d65d832137e20e193c960802afba73b5d38sm 120cfd74d65d832137e20e193c960802afba73b5d38sm protected boolean shouldFall(GameObject parentObject) { 121cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 122cfd74d65d832137e20e193c960802afba73b5d38sm TimeSystem time = sSystemRegistry.timeSystem; 123cfd74d65d832137e20e193c960802afba73b5d38sm final float airTime = time.getGameTime() - parentObject.getLastTouchedFloorTime(); 124cfd74d65d832137e20e193c960802afba73b5d38sm if (!mFlying && !parentObject.touchingGround() && airTime > FALL_TIME_THRESHOLD) { 125cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 126cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.y < FALL_SPEED_THRESHOLD) { 127cfd74d65d832137e20e193c960802afba73b5d38sm result = true; 128cfd74d65d832137e20e193c960802afba73b5d38sm } 129cfd74d65d832137e20e193c960802afba73b5d38sm } 130cfd74d65d832137e20e193c960802afba73b5d38sm return result; 131cfd74d65d832137e20e193c960802afba73b5d38sm } 132cfd74d65d832137e20e193c960802afba73b5d38sm 133cfd74d65d832137e20e193c960802afba73b5d38sm protected boolean shouldJump(GameObject parentObject) { 134cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 135cfd74d65d832137e20e193c960802afba73b5d38sm 136cfd74d65d832137e20e193c960802afba73b5d38sm if (!mFlying) { 137cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 138cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.y > JUMP_SPEED_THRESHOLD) { 139cfd74d65d832137e20e193c960802afba73b5d38sm result = true; 140cfd74d65d832137e20e193c960802afba73b5d38sm } 141cfd74d65d832137e20e193c960802afba73b5d38sm } 142cfd74d65d832137e20e193c960802afba73b5d38sm return result; 143cfd74d65d832137e20e193c960802afba73b5d38sm } 144cfd74d65d832137e20e193c960802afba73b5d38sm 145cfd74d65d832137e20e193c960802afba73b5d38sm protected boolean shouldRun(GameObject parentObject) { 146cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 147cfd74d65d832137e20e193c960802afba73b5d38sm if (!mFlying && parentObject.touchingGround()) { 148cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 149cfd74d65d832137e20e193c960802afba73b5d38sm if (Math.abs(velocity.x) >= RUN_SPEED_THRESHOLD) { 150cfd74d65d832137e20e193c960802afba73b5d38sm result = true; 151cfd74d65d832137e20e193c960802afba73b5d38sm } 152cfd74d65d832137e20e193c960802afba73b5d38sm } 153cfd74d65d832137e20e193c960802afba73b5d38sm return result; 154cfd74d65d832137e20e193c960802afba73b5d38sm } 155cfd74d65d832137e20e193c960802afba73b5d38sm 156cfd74d65d832137e20e193c960802afba73b5d38sm protected boolean shouldMove(GameObject parentObject) { 157cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = true; 158cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 159cfd74d65d832137e20e193c960802afba73b5d38sm 160cfd74d65d832137e20e193c960802afba73b5d38sm if (mStopAtWalls) { 161cfd74d65d832137e20e193c960802afba73b5d38sm if ((velocity.x < 0.0f && parentObject.touchingLeftWall()) 162cfd74d65d832137e20e193c960802afba73b5d38sm || (velocity.x > 0.0f && parentObject.touchingRightWall())) { 163cfd74d65d832137e20e193c960802afba73b5d38sm result = false; 164cfd74d65d832137e20e193c960802afba73b5d38sm } 165cfd74d65d832137e20e193c960802afba73b5d38sm } 166cfd74d65d832137e20e193c960802afba73b5d38sm return result; 167cfd74d65d832137e20e193c960802afba73b5d38sm } 168cfd74d65d832137e20e193c960802afba73b5d38sm 169cfd74d65d832137e20e193c960802afba73b5d38sm protected boolean shouldTakeHit(GameObject parentObject) { 170cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 171cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.getCurrentAction() == ActionType.HIT_REACT 172cfd74d65d832137e20e193c960802afba73b5d38sm && mSprite.findAnimation(TAKE_HIT) != null) { 173cfd74d65d832137e20e193c960802afba73b5d38sm result = true; 174cfd74d65d832137e20e193c960802afba73b5d38sm } 175cfd74d65d832137e20e193c960802afba73b5d38sm return result; 176cfd74d65d832137e20e193c960802afba73b5d38sm } 177cfd74d65d832137e20e193c960802afba73b5d38sm 178cfd74d65d832137e20e193c960802afba73b5d38sm protected void gotoRunStart() { 179cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.findAnimation(RUN_START) != null) { 180cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = RUN_START; 181cfd74d65d832137e20e193c960802afba73b5d38sm } else { 182cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = RUN; 183cfd74d65d832137e20e193c960802afba73b5d38sm } 184cfd74d65d832137e20e193c960802afba73b5d38sm } 185cfd74d65d832137e20e193c960802afba73b5d38sm 186cfd74d65d832137e20e193c960802afba73b5d38sm protected void gotoRun() { 187cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = RUN; 188cfd74d65d832137e20e193c960802afba73b5d38sm } 189cfd74d65d832137e20e193c960802afba73b5d38sm 190cfd74d65d832137e20e193c960802afba73b5d38sm protected void idle(GameObject parentObject) { 191cfd74d65d832137e20e193c960802afba73b5d38sm final GameObject.ActionType currentAction = parentObject.getCurrentAction(); 192cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.MOVE) { 193cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 194cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldFall(parentObject)) { 195cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_AIR; 196cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldJump(parentObject)) { 197cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_START; 198cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 199cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocity.x) > 0.0f && shouldMove(parentObject)) { 200cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldRun(parentObject)) { 201cfd74d65d832137e20e193c960802afba73b5d38sm gotoRunStart(); 202cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 203cfd74d65d832137e20e193c960802afba73b5d38sm } else { 204cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = WALK; 205cfd74d65d832137e20e193c960802afba73b5d38sm } 206cfd74d65d832137e20e193c960802afba73b5d38sm } 207cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.ATTACK) { 208cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = SHOOT; 209cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldTakeHit(parentObject)) { 210cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = TAKE_HIT; 211cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parentObject.getCurrentAction() == ActionType.DEATH) { 212cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = DEATH; 213cfd74d65d832137e20e193c960802afba73b5d38sm } 214cfd74d65d832137e20e193c960802afba73b5d38sm } 215cfd74d65d832137e20e193c960802afba73b5d38sm 216cfd74d65d832137e20e193c960802afba73b5d38sm protected void walk(GameObject parentObject) { 217cfd74d65d832137e20e193c960802afba73b5d38sm final GameObject.ActionType currentAction = parentObject.getCurrentAction(); 218cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.MOVE) { 219cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 220cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldFall(parentObject)) { 221cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_AIR; 222cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldJump(parentObject)) { 223cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_START; 224cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 225cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocity.x) > 0.0f) { 226cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldRun(parentObject)) { 227cfd74d65d832137e20e193c960802afba73b5d38sm gotoRun(); 228cfd74d65d832137e20e193c960802afba73b5d38sm } 229cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.x > 0.0f) { 230cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1; 231cfd74d65d832137e20e193c960802afba73b5d38sm } else { 232cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1; 233cfd74d65d832137e20e193c960802afba73b5d38sm } 234cfd74d65d832137e20e193c960802afba73b5d38sm } else { 235cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 236cfd74d65d832137e20e193c960802afba73b5d38sm } 237cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.ATTACK) { 238cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = SHOOT; 239cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldTakeHit(parentObject)) { 240cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = TAKE_HIT; 241cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parentObject.getCurrentAction() == ActionType.DEATH) { 242cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = DEATH; 243cfd74d65d832137e20e193c960802afba73b5d38sm } 244cfd74d65d832137e20e193c960802afba73b5d38sm } 245cfd74d65d832137e20e193c960802afba73b5d38sm 246cfd74d65d832137e20e193c960802afba73b5d38sm protected void runStart(GameObject parentObject) { 247cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 248cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.animationFinished()) { 249cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = RUN; 250cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = false; 251cfd74d65d832137e20e193c960802afba73b5d38sm } 252cfd74d65d832137e20e193c960802afba73b5d38sm } 253cfd74d65d832137e20e193c960802afba73b5d38sm protected void run(GameObject parentObject) { 254cfd74d65d832137e20e193c960802afba73b5d38sm final GameObject.ActionType currentAction = parentObject.getCurrentAction(); 255cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.MOVE) { 256cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 257cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldFall(parentObject)) { 258cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_AIR; 259cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldJump(parentObject)) { 260cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 261cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_START; 262cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocity.x) > 0.0f) { 263cfd74d65d832137e20e193c960802afba73b5d38sm if (!shouldRun(parentObject)) { 264cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = WALK; 265cfd74d65d832137e20e193c960802afba73b5d38sm } 266cfd74d65d832137e20e193c960802afba73b5d38sm 267cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.x > 0.0f) { 268cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1; 269cfd74d65d832137e20e193c960802afba73b5d38sm } else { 270cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1; 271cfd74d65d832137e20e193c960802afba73b5d38sm } 272cfd74d65d832137e20e193c960802afba73b5d38sm } else { 273cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 274cfd74d65d832137e20e193c960802afba73b5d38sm } 275cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.ATTACK) { 276cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = SHOOT; 277cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldTakeHit(parentObject)) { 278cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = TAKE_HIT; 279cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parentObject.getCurrentAction() == ActionType.DEATH) { 280cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = DEATH; 281cfd74d65d832137e20e193c960802afba73b5d38sm } 282cfd74d65d832137e20e193c960802afba73b5d38sm } 283cfd74d65d832137e20e193c960802afba73b5d38sm 284cfd74d65d832137e20e193c960802afba73b5d38sm protected void shoot(GameObject parentObject) { 285cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.animationFinished() || parentObject.getCurrentAction() != ActionType.ATTACK) { 286cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 287cfd74d65d832137e20e193c960802afba73b5d38sm } else if (shouldTakeHit(parentObject)) { 288cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = TAKE_HIT; 289cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parentObject.getCurrentAction() == ActionType.DEATH) { 290cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = DEATH; 291cfd74d65d832137e20e193c960802afba73b5d38sm } else { 292cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 293cfd74d65d832137e20e193c960802afba73b5d38sm 294cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.x > 0.0f) { 295cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1; 296cfd74d65d832137e20e193c960802afba73b5d38sm } else if (velocity.x < 0.0f) { 297cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1; 298cfd74d65d832137e20e193c960802afba73b5d38sm } 299cfd74d65d832137e20e193c960802afba73b5d38sm } 300cfd74d65d832137e20e193c960802afba73b5d38sm } 301cfd74d65d832137e20e193c960802afba73b5d38sm 302cfd74d65d832137e20e193c960802afba73b5d38sm protected void jumpStart(GameObject parentObject) { 303cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 304cfd74d65d832137e20e193c960802afba73b5d38sm 305cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.x > 0.0f) { 306cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1; 307cfd74d65d832137e20e193c960802afba73b5d38sm } else if (velocity.x < 0.0f) { 308cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1; 309cfd74d65d832137e20e193c960802afba73b5d38sm } 310cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = true; 311cfd74d65d832137e20e193c960802afba73b5d38sm 312cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.animationFinished()) { 313cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = JUMP_AIR; 314cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.positionLocked = false; 315cfd74d65d832137e20e193c960802afba73b5d38sm } 316cfd74d65d832137e20e193c960802afba73b5d38sm } 317cfd74d65d832137e20e193c960802afba73b5d38sm 318cfd74d65d832137e20e193c960802afba73b5d38sm protected void jumpAir(GameObject parentObject) { 319cfd74d65d832137e20e193c960802afba73b5d38sm final GameObject.ActionType currentAction = parentObject.getCurrentAction(); 320cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.MOVE) { 321cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 velocity = parentObject.getVelocity(); 322cfd74d65d832137e20e193c960802afba73b5d38sm 323cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.touchingGround()) { 324cfd74d65d832137e20e193c960802afba73b5d38sm if (Math.abs(velocity.x) > 0.0f) { 325cfd74d65d832137e20e193c960802afba73b5d38sm if (shouldRun(parentObject)) { 326cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = RUN; 327cfd74d65d832137e20e193c960802afba73b5d38sm } else { 328cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = WALK; 329cfd74d65d832137e20e193c960802afba73b5d38sm } 330cfd74d65d832137e20e193c960802afba73b5d38sm } else { 331cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 332cfd74d65d832137e20e193c960802afba73b5d38sm } 333cfd74d65d832137e20e193c960802afba73b5d38sm } else { 334cfd74d65d832137e20e193c960802afba73b5d38sm 335cfd74d65d832137e20e193c960802afba73b5d38sm if (velocity.x > 0.0f) { 336cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1; 337cfd74d65d832137e20e193c960802afba73b5d38sm } else if (velocity.x < 0.0f) { 338cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1; 339cfd74d65d832137e20e193c960802afba73b5d38sm } 340cfd74d65d832137e20e193c960802afba73b5d38sm 341cfd74d65d832137e20e193c960802afba73b5d38sm } 342cfd74d65d832137e20e193c960802afba73b5d38sm } else { 343cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 344cfd74d65d832137e20e193c960802afba73b5d38sm } 345cfd74d65d832137e20e193c960802afba73b5d38sm } 346cfd74d65d832137e20e193c960802afba73b5d38sm 347cfd74d65d832137e20e193c960802afba73b5d38sm protected void takeHit(GameObject parentObject) { 348cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.animationFinished()) { 349cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.life > 0 && parentObject.getCurrentAction() != ActionType.DEATH) { 350cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.getCurrentAction() != ActionType.HIT_REACT) { 351cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 352cfd74d65d832137e20e193c960802afba73b5d38sm } 353cfd74d65d832137e20e193c960802afba73b5d38sm } else { 354cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = DEATH; 355cfd74d65d832137e20e193c960802afba73b5d38sm } 356cfd74d65d832137e20e193c960802afba73b5d38sm } 357cfd74d65d832137e20e193c960802afba73b5d38sm } 358cfd74d65d832137e20e193c960802afba73b5d38sm 359cfd74d65d832137e20e193c960802afba73b5d38sm protected void surprised(GameObject parentObject) { 360cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite.animationFinished()) { 361cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentAnimation = IDLE; 362cfd74d65d832137e20e193c960802afba73b5d38sm } 363cfd74d65d832137e20e193c960802afba73b5d38sm } 364cfd74d65d832137e20e193c960802afba73b5d38sm 365cfd74d65d832137e20e193c960802afba73b5d38sm protected void death(GameObject parentObject) { 366cfd74d65d832137e20e193c960802afba73b5d38sm } 367cfd74d65d832137e20e193c960802afba73b5d38sm 368cfd74d65d832137e20e193c960802afba73b5d38sm public void setSprite(SpriteComponent sprite) { 369cfd74d65d832137e20e193c960802afba73b5d38sm mSprite = sprite; 370cfd74d65d832137e20e193c960802afba73b5d38sm } 371cfd74d65d832137e20e193c960802afba73b5d38sm 372cfd74d65d832137e20e193c960802afba73b5d38sm public void setChannel(Channel channel) { 373cfd74d65d832137e20e193c960802afba73b5d38sm mChannel = channel; 374cfd74d65d832137e20e193c960802afba73b5d38sm } 375cfd74d65d832137e20e193c960802afba73b5d38sm 376cfd74d65d832137e20e193c960802afba73b5d38sm public void setChannelTrigger(int animation) { 377cfd74d65d832137e20e193c960802afba73b5d38sm mChannelTrigger = animation; 378cfd74d65d832137e20e193c960802afba73b5d38sm } 379cfd74d65d832137e20e193c960802afba73b5d38sm 380cfd74d65d832137e20e193c960802afba73b5d38sm public void setFlying(boolean flying) { 381cfd74d65d832137e20e193c960802afba73b5d38sm mFlying = flying; 382cfd74d65d832137e20e193c960802afba73b5d38sm } 383cfd74d65d832137e20e193c960802afba73b5d38sm 384cfd74d65d832137e20e193c960802afba73b5d38sm public void setStopAtWalls(boolean stop) { 385cfd74d65d832137e20e193c960802afba73b5d38sm mStopAtWalls = stop; 386cfd74d65d832137e20e193c960802afba73b5d38sm } 387cfd74d65d832137e20e193c960802afba73b5d38sm} 388