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 19cfd74d65d832137e20e193c960802afba73b5d38sm 20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.CollisionParameters.HitType; 21cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType; 22cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.SoundSystem.Sound; 23cfd74d65d832137e20e193c960802afba73b5d38sm 24cfd74d65d832137e20e193c960802afba73b5d38sm/** 25cfd74d65d832137e20e193c960802afba73b5d38sm * Player Animation game object component. Responsible for selecting an animation to describe the 26cfd74d65d832137e20e193c960802afba73b5d38sm * player's current state. Requires the object to contain a SpriteComponent to play animations. 27cfd74d65d832137e20e193c960802afba73b5d38sm */ 28cfd74d65d832137e20e193c960802afba73b5d38smpublic class AnimationComponent extends GameComponent { 29cfd74d65d832137e20e193c960802afba73b5d38sm 30cfd74d65d832137e20e193c960802afba73b5d38sm public enum PlayerAnimations { 31cfd74d65d832137e20e193c960802afba73b5d38sm IDLE, 32cfd74d65d832137e20e193c960802afba73b5d38sm MOVE, 33cfd74d65d832137e20e193c960802afba73b5d38sm MOVE_FAST, 34cfd74d65d832137e20e193c960802afba73b5d38sm BOOST_UP, 35cfd74d65d832137e20e193c960802afba73b5d38sm BOOST_MOVE, 36cfd74d65d832137e20e193c960802afba73b5d38sm BOOST_MOVE_FAST, 37cfd74d65d832137e20e193c960802afba73b5d38sm STOMP, 38cfd74d65d832137e20e193c960802afba73b5d38sm HIT_REACT, 39cfd74d65d832137e20e193c960802afba73b5d38sm DEATH, 40cfd74d65d832137e20e193c960802afba73b5d38sm FROZEN 41cfd74d65d832137e20e193c960802afba73b5d38sm } 42cfd74d65d832137e20e193c960802afba73b5d38sm 43cfd74d65d832137e20e193c960802afba73b5d38sm private static final float MIN_ROCKET_TIME = 0.0f; 44cfd74d65d832137e20e193c960802afba73b5d38sm private static final float FLICKER_INTERVAL = 0.15f; 45cfd74d65d832137e20e193c960802afba73b5d38sm private static final float FLICKER_DURATION = 3.0f; 46cfd74d65d832137e20e193c960802afba73b5d38sm private static final float LAND_THUMP_DELAY = 0.5f; 47cfd74d65d832137e20e193c960802afba73b5d38sm 48cfd74d65d832137e20e193c960802afba73b5d38sm private SpriteComponent mSprite; 49cfd74d65d832137e20e193c960802afba73b5d38sm private SpriteComponent mJetSprite; 50cfd74d65d832137e20e193c960802afba73b5d38sm private SpriteComponent mSparksSprite; 51cfd74d65d832137e20e193c960802afba73b5d38sm 52cfd74d65d832137e20e193c960802afba73b5d38sm private PlayerComponent mPlayer; 53cfd74d65d832137e20e193c960802afba73b5d38sm private float mLastFlickerTime; 54cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mFlickerOn; 55cfd74d65d832137e20e193c960802afba73b5d38sm private float mFlickerTimeRemaining; 56cfd74d65d832137e20e193c960802afba73b5d38sm 57cfd74d65d832137e20e193c960802afba73b5d38sm private GameObject.ActionType mPreviousAction; 58cfd74d65d832137e20e193c960802afba73b5d38sm 59cfd74d65d832137e20e193c960802afba73b5d38sm private float mLastRocketsOnTime; 60cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mExplodingDeath; 61cfd74d65d832137e20e193c960802afba73b5d38sm 62cfd74d65d832137e20e193c960802afba73b5d38sm private ChangeComponentsComponent mDamageSwap; 63cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mLandThump; 64cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mRocketSound; 65cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mExplosionSound; 66cfd74d65d832137e20e193c960802afba73b5d38sm private float mLandThumpDelay; 67cfd74d65d832137e20e193c960802afba73b5d38sm private int mRocketSoundStream; 68cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mRocketSoundPaused; 69cfd74d65d832137e20e193c960802afba73b5d38sm 70cfd74d65d832137e20e193c960802afba73b5d38sm private int mLastRubyCount; 71cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mRubySound1; 72cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mRubySound2; 73cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mRubySound3; 74cfd74d65d832137e20e193c960802afba73b5d38sm private InventoryComponent mInventory; 75cfd74d65d832137e20e193c960802afba73b5d38sm 76cfd74d65d832137e20e193c960802afba73b5d38sm 77cfd74d65d832137e20e193c960802afba73b5d38sm public AnimationComponent() { 78cfd74d65d832137e20e193c960802afba73b5d38sm super(); 79cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 80cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(ComponentPhases.ANIMATION.ordinal()); 81cfd74d65d832137e20e193c960802afba73b5d38sm } 82cfd74d65d832137e20e193c960802afba73b5d38sm 83cfd74d65d832137e20e193c960802afba73b5d38sm @Override 84cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 85cfd74d65d832137e20e193c960802afba73b5d38sm mPreviousAction = ActionType.INVALID; 86cfd74d65d832137e20e193c960802afba73b5d38sm mSprite = null; 87cfd74d65d832137e20e193c960802afba73b5d38sm mJetSprite = null; 88cfd74d65d832137e20e193c960802afba73b5d38sm mSparksSprite = null; 89cfd74d65d832137e20e193c960802afba73b5d38sm mPlayer = null; 90cfd74d65d832137e20e193c960802afba73b5d38sm mLastFlickerTime = 0.0f; 91cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerOn = false; 92cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerTimeRemaining = 0.0f; 93cfd74d65d832137e20e193c960802afba73b5d38sm mLastRocketsOnTime = 0.0f; 94cfd74d65d832137e20e193c960802afba73b5d38sm mExplodingDeath = false; 95cfd74d65d832137e20e193c960802afba73b5d38sm mDamageSwap = null; 96cfd74d65d832137e20e193c960802afba73b5d38sm mLandThump = null; 97cfd74d65d832137e20e193c960802afba73b5d38sm mLandThumpDelay = 0.0f; 98cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSound = null; 99cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSoundStream = -1; 100cfd74d65d832137e20e193c960802afba73b5d38sm mLastRubyCount = 0; 101cfd74d65d832137e20e193c960802afba73b5d38sm mInventory = null; 102cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionSound = null; 103cfd74d65d832137e20e193c960802afba73b5d38sm } 104cfd74d65d832137e20e193c960802afba73b5d38sm 105cfd74d65d832137e20e193c960802afba73b5d38sm @Override 106cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 107cfd74d65d832137e20e193c960802afba73b5d38sm if (mSprite != null) { 108cfd74d65d832137e20e193c960802afba73b5d38sm 109cfd74d65d832137e20e193c960802afba73b5d38sm GameObject parentObject = (GameObject) parent; 110cfd74d65d832137e20e193c960802afba73b5d38sm 111cfd74d65d832137e20e193c960802afba73b5d38sm final float velocityX = parentObject.getVelocity().x; 112cfd74d65d832137e20e193c960802afba73b5d38sm final float velocityY = parentObject.getVelocity().y; 113cfd74d65d832137e20e193c960802afba73b5d38sm 114cfd74d65d832137e20e193c960802afba73b5d38sm 115cfd74d65d832137e20e193c960802afba73b5d38sm GameObject.ActionType currentAction = parentObject.getCurrentAction(); 116cfd74d65d832137e20e193c960802afba73b5d38sm 117cfd74d65d832137e20e193c960802afba73b5d38sm if (mJetSprite != null) { 118cfd74d65d832137e20e193c960802afba73b5d38sm mJetSprite.setVisible(false); 119cfd74d65d832137e20e193c960802afba73b5d38sm } 120cfd74d65d832137e20e193c960802afba73b5d38sm 121cfd74d65d832137e20e193c960802afba73b5d38sm if (mSparksSprite != null) { 122cfd74d65d832137e20e193c960802afba73b5d38sm mSparksSprite.setVisible(false); 123cfd74d65d832137e20e193c960802afba73b5d38sm } 124cfd74d65d832137e20e193c960802afba73b5d38sm 125cfd74d65d832137e20e193c960802afba73b5d38sm 126cfd74d65d832137e20e193c960802afba73b5d38sm final TimeSystem time = sSystemRegistry.timeSystem; 127cfd74d65d832137e20e193c960802afba73b5d38sm final float gameTime = time.getGameTime(); 128cfd74d65d832137e20e193c960802afba73b5d38sm 129cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction != ActionType.HIT_REACT && mPreviousAction == ActionType.HIT_REACT) { 130cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerTimeRemaining = FLICKER_DURATION; 131cfd74d65d832137e20e193c960802afba73b5d38sm } 132cfd74d65d832137e20e193c960802afba73b5d38sm 133cfd74d65d832137e20e193c960802afba73b5d38sm 134cfd74d65d832137e20e193c960802afba73b5d38sm final boolean touchingGround = parentObject.touchingGround(); 135cfd74d65d832137e20e193c960802afba73b5d38sm 136cfd74d65d832137e20e193c960802afba73b5d38sm boolean boosting = mPlayer != null ? mPlayer.getRocketsOn() : false; 137cfd74d65d832137e20e193c960802afba73b5d38sm 138cfd74d65d832137e20e193c960802afba73b5d38sm boolean visible = true; 139cfd74d65d832137e20e193c960802afba73b5d38sm 140cfd74d65d832137e20e193c960802afba73b5d38sm SoundSystem sound = sSystemRegistry.soundSystem; 141cfd74d65d832137e20e193c960802afba73b5d38sm 142cfd74d65d832137e20e193c960802afba73b5d38sm // It's usually not necessary to test to see if sound is enabled or not (when it's disabled, 143cfd74d65d832137e20e193c960802afba73b5d38sm // play() is just a nop), but in this case I have a stream that is maintained for the rocket 144cfd74d65d832137e20e193c960802afba73b5d38sm // sounds. So it's simpler to just avoid that code if sound is off. 145cfd74d65d832137e20e193c960802afba73b5d38sm if (sound.getSoundEnabled()) { 146cfd74d65d832137e20e193c960802afba73b5d38sm if (boosting) { 147cfd74d65d832137e20e193c960802afba73b5d38sm mLastRocketsOnTime = gameTime; 148cfd74d65d832137e20e193c960802afba73b5d38sm } else { 149cfd74d65d832137e20e193c960802afba73b5d38sm if (gameTime - mLastRocketsOnTime < MIN_ROCKET_TIME 150cfd74d65d832137e20e193c960802afba73b5d38sm && velocityY >= 0.0f) { 151cfd74d65d832137e20e193c960802afba73b5d38sm boosting = true; 152cfd74d65d832137e20e193c960802afba73b5d38sm } 153cfd74d65d832137e20e193c960802afba73b5d38sm } 154cfd74d65d832137e20e193c960802afba73b5d38sm 155cfd74d65d832137e20e193c960802afba73b5d38sm if (mRocketSound != null) { 156cfd74d65d832137e20e193c960802afba73b5d38sm if (boosting) { 157cfd74d65d832137e20e193c960802afba73b5d38sm if (mRocketSoundStream == -1) { 158cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSoundStream = sound.play(mRocketSound, true, SoundSystem.PRIORITY_HIGH); 159cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSoundPaused = false; 160cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mRocketSoundPaused) { 161cfd74d65d832137e20e193c960802afba73b5d38sm sound.resume(mRocketSoundStream); 162cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSoundPaused = false; 163cfd74d65d832137e20e193c960802afba73b5d38sm } 164cfd74d65d832137e20e193c960802afba73b5d38sm } else { 165cfd74d65d832137e20e193c960802afba73b5d38sm sound.pause(mRocketSoundStream); 166cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSoundPaused = true; 167cfd74d65d832137e20e193c960802afba73b5d38sm } 168cfd74d65d832137e20e193c960802afba73b5d38sm } 169cfd74d65d832137e20e193c960802afba73b5d38sm } 170cfd74d65d832137e20e193c960802afba73b5d38sm 171cfd74d65d832137e20e193c960802afba73b5d38sm // Normally, for collectables like the coin, we could just tell the object to play 172cfd74d65d832137e20e193c960802afba73b5d38sm // a sound when it is collected. The gems are a special case, though, as we 173cfd74d65d832137e20e193c960802afba73b5d38sm // want to pick a different sound depending on how many have been collected. 174cfd74d65d832137e20e193c960802afba73b5d38sm if (mInventory != null && mRubySound1 != null && mRubySound2 != null && mRubySound3 != null) { 175cfd74d65d832137e20e193c960802afba73b5d38sm InventoryComponent.UpdateRecord inventory = mInventory.getRecord(); 176cfd74d65d832137e20e193c960802afba73b5d38sm final int rubyCount = inventory.rubyCount; 177cfd74d65d832137e20e193c960802afba73b5d38sm if (rubyCount != mLastRubyCount) { 178cfd74d65d832137e20e193c960802afba73b5d38sm mLastRubyCount = rubyCount; 179cfd74d65d832137e20e193c960802afba73b5d38sm switch (rubyCount) { 180cfd74d65d832137e20e193c960802afba73b5d38sm case 1: 181cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mRubySound1, false, SoundSystem.PRIORITY_NORMAL); 182cfd74d65d832137e20e193c960802afba73b5d38sm break; 183cfd74d65d832137e20e193c960802afba73b5d38sm case 2: 184cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mRubySound2, false, SoundSystem.PRIORITY_NORMAL); 185cfd74d65d832137e20e193c960802afba73b5d38sm break; 186cfd74d65d832137e20e193c960802afba73b5d38sm case 3: 187cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mRubySound3, false, SoundSystem.PRIORITY_NORMAL); 188cfd74d65d832137e20e193c960802afba73b5d38sm break; 189cfd74d65d832137e20e193c960802afba73b5d38sm } 190cfd74d65d832137e20e193c960802afba73b5d38sm 191cfd74d65d832137e20e193c960802afba73b5d38sm } 192cfd74d65d832137e20e193c960802afba73b5d38sm } 193cfd74d65d832137e20e193c960802afba73b5d38sm 194cfd74d65d832137e20e193c960802afba73b5d38sm // Turn on visual effects (smoke, etc) when the player's life reaches 1. 195cfd74d65d832137e20e193c960802afba73b5d38sm if (mDamageSwap != null) { 196cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.life == 1 && !mDamageSwap.getCurrentlySwapped()) { 197cfd74d65d832137e20e193c960802afba73b5d38sm mDamageSwap.activate(parentObject); 198cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parentObject.life != 1 && mDamageSwap.getCurrentlySwapped()) { 199cfd74d65d832137e20e193c960802afba73b5d38sm mDamageSwap.activate(parentObject); 200cfd74d65d832137e20e193c960802afba73b5d38sm } 201cfd74d65d832137e20e193c960802afba73b5d38sm } 202cfd74d65d832137e20e193c960802afba73b5d38sm 203cfd74d65d832137e20e193c960802afba73b5d38sm float opacity = 1.0f; 204cfd74d65d832137e20e193c960802afba73b5d38sm 205cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.MOVE) { 2069d4cc2572d37983607df38b0f4216ed76ac51814sm InputGameInterface input = sSystemRegistry.inputGameInterface; 2079d4cc2572d37983607df38b0f4216ed76ac51814sm final InputXY dpad = input.getDirectionalPad(); 2089d4cc2572d37983607df38b0f4216ed76ac51814sm if (dpad.getX() < 0.0f) { 209cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1.0f; 2109d4cc2572d37983607df38b0f4216ed76ac51814sm } else if (dpad.getX() > 0.0f) { 211cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1.0f; 212cfd74d65d832137e20e193c960802afba73b5d38sm } 213cfd74d65d832137e20e193c960802afba73b5d38sm 214cfd74d65d832137e20e193c960802afba73b5d38sm // TODO: get rid of these magic numbers! 215cfd74d65d832137e20e193c960802afba73b5d38sm if (touchingGround) { 216cfd74d65d832137e20e193c960802afba73b5d38sm 217cfd74d65d832137e20e193c960802afba73b5d38sm if (Utils.close(velocityX, 0.0f, 30.0f)) { 218cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.IDLE.ordinal()); 219cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocityX) > 300.0f) { 220cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.MOVE_FAST.ordinal()); 221cfd74d65d832137e20e193c960802afba73b5d38sm } else { 222cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.MOVE.ordinal()); 223cfd74d65d832137e20e193c960802afba73b5d38sm } 224cfd74d65d832137e20e193c960802afba73b5d38sm 2259d4cc2572d37983607df38b0f4216ed76ac51814sm final InputButton attackButton = input.getAttackButton(); 2269d4cc2572d37983607df38b0f4216ed76ac51814sm 2279d4cc2572d37983607df38b0f4216ed76ac51814sm if (attackButton.getPressed()) { 228cfd74d65d832137e20e193c960802afba73b5d38sm // charge 2299d4cc2572d37983607df38b0f4216ed76ac51814sm final float pressedTime = gameTime - attackButton.getLastPressedTime(); 230cfd74d65d832137e20e193c960802afba73b5d38sm final float wave = (float)Math.cos(pressedTime * (float)Math.PI * 2.0f); 231cfd74d65d832137e20e193c960802afba73b5d38sm opacity = (wave * 0.25f) + 0.75f; 232cfd74d65d832137e20e193c960802afba73b5d38sm } 233cfd74d65d832137e20e193c960802afba73b5d38sm 234cfd74d65d832137e20e193c960802afba73b5d38sm } else { 235cfd74d65d832137e20e193c960802afba73b5d38sm if (boosting) { 236cfd74d65d832137e20e193c960802afba73b5d38sm if (mJetSprite != null) { 237cfd74d65d832137e20e193c960802afba73b5d38sm mJetSprite.setVisible(true); 238cfd74d65d832137e20e193c960802afba73b5d38sm } 239cfd74d65d832137e20e193c960802afba73b5d38sm 240cfd74d65d832137e20e193c960802afba73b5d38sm if (Math.abs(velocityX) < 100.0f && velocityY > 10.0f) { 241cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.BOOST_UP.ordinal()); 242cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocityX) > 300.0f) { 243cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.BOOST_MOVE_FAST.ordinal()); 244cfd74d65d832137e20e193c960802afba73b5d38sm } else { 245cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.BOOST_MOVE.ordinal()); 246cfd74d65d832137e20e193c960802afba73b5d38sm } 247cfd74d65d832137e20e193c960802afba73b5d38sm } else { 248cfd74d65d832137e20e193c960802afba73b5d38sm 249cfd74d65d832137e20e193c960802afba73b5d38sm if (Utils.close(velocityX, 0.0f, 1.0f)) { 250cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.IDLE.ordinal()); 251cfd74d65d832137e20e193c960802afba73b5d38sm } else if (Math.abs(velocityX) > 300.0f) { 252cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.MOVE_FAST.ordinal()); 253cfd74d65d832137e20e193c960802afba73b5d38sm } else { 254cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.MOVE.ordinal()); 255cfd74d65d832137e20e193c960802afba73b5d38sm } 256cfd74d65d832137e20e193c960802afba73b5d38sm } 257cfd74d65d832137e20e193c960802afba73b5d38sm 258cfd74d65d832137e20e193c960802afba73b5d38sm } 259cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.ATTACK) { 260cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.STOMP.ordinal()); 261cfd74d65d832137e20e193c960802afba73b5d38sm if (touchingGround && gameTime > mLandThumpDelay) { 262cfd74d65d832137e20e193c960802afba73b5d38sm if (mLandThump != null && sound != null) { 263cfd74d65d832137e20e193c960802afba73b5d38sm // modulate the sound slightly to avoid sounding too similar 264cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mLandThump, false, SoundSystem.PRIORITY_HIGH, 1.0f, 265cfd74d65d832137e20e193c960802afba73b5d38sm (float)(Math.random() * 0.5f) + 0.75f); 266cfd74d65d832137e20e193c960802afba73b5d38sm mLandThumpDelay = gameTime + LAND_THUMP_DELAY; 267cfd74d65d832137e20e193c960802afba73b5d38sm } 268cfd74d65d832137e20e193c960802afba73b5d38sm } 269cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.HIT_REACT) { 270cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.HIT_REACT.ordinal()); 271cfd74d65d832137e20e193c960802afba73b5d38sm 272cfd74d65d832137e20e193c960802afba73b5d38sm if (velocityX > 0.0f) { 273cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = -1.0f; 274cfd74d65d832137e20e193c960802afba73b5d38sm } else if (velocityX < 0.0f) { 275cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.facingDirection.x = 1.0f; 276cfd74d65d832137e20e193c960802afba73b5d38sm } 277cfd74d65d832137e20e193c960802afba73b5d38sm 278cfd74d65d832137e20e193c960802afba73b5d38sm if (mSparksSprite != null) { 279cfd74d65d832137e20e193c960802afba73b5d38sm mSparksSprite.setVisible(true); 280cfd74d65d832137e20e193c960802afba73b5d38sm } 281cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.DEATH) { 282cfd74d65d832137e20e193c960802afba73b5d38sm if (mPreviousAction != currentAction) { 283cfd74d65d832137e20e193c960802afba73b5d38sm if (mExplosionSound != null) { 284cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mExplosionSound, false, SoundSystem.PRIORITY_NORMAL); 285cfd74d65d832137e20e193c960802afba73b5d38sm } 286cfd74d65d832137e20e193c960802afba73b5d38sm // by default, explode when hit with the DEATH hit type. 287cfd74d65d832137e20e193c960802afba73b5d38sm boolean explodingDeath = parentObject.lastReceivedHitType == HitType.DEATH; 288cfd74d65d832137e20e193c960802afba73b5d38sm // or if touching a death tile. 289cfd74d65d832137e20e193c960802afba73b5d38sm HotSpotSystem hotSpot = sSystemRegistry.hotSpotSystem; 290cfd74d65d832137e20e193c960802afba73b5d38sm if (hotSpot != null) { 291cfd74d65d832137e20e193c960802afba73b5d38sm // TODO: HACK! Unify all this code. 292cfd74d65d832137e20e193c960802afba73b5d38sm if (hotSpot.getHotSpot(parentObject.getCenteredPositionX(), 293cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getPosition().y + 10.0f) == HotSpotSystem.HotSpotType.DIE) { 294cfd74d65d832137e20e193c960802afba73b5d38sm explodingDeath = true; 295cfd74d65d832137e20e193c960802afba73b5d38sm } 296cfd74d65d832137e20e193c960802afba73b5d38sm } 297cfd74d65d832137e20e193c960802afba73b5d38sm if (explodingDeath) { 298cfd74d65d832137e20e193c960802afba73b5d38sm mExplodingDeath = true; 299cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectFactory factory = sSystemRegistry.gameObjectFactory; 300cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = sSystemRegistry.gameObjectManager; 301cfd74d65d832137e20e193c960802afba73b5d38sm if (factory != null && manager != null) { 302cfd74d65d832137e20e193c960802afba73b5d38sm GameObject explosion = factory.spawnEffectExplosionGiant(parentObject.getPosition().x, parentObject.getPosition().y); 303cfd74d65d832137e20e193c960802afba73b5d38sm if (explosion != null) { 304cfd74d65d832137e20e193c960802afba73b5d38sm manager.add(explosion); 305cfd74d65d832137e20e193c960802afba73b5d38sm } 306cfd74d65d832137e20e193c960802afba73b5d38sm } 307cfd74d65d832137e20e193c960802afba73b5d38sm } else { 308cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.DEATH.ordinal()); 309cfd74d65d832137e20e193c960802afba73b5d38sm mExplodingDeath = false; 310cfd74d65d832137e20e193c960802afba73b5d38sm } 311cfd74d65d832137e20e193c960802afba73b5d38sm 312cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerTimeRemaining = 0.0f; 313cfd74d65d832137e20e193c960802afba73b5d38sm if (mSparksSprite != null) { 314cfd74d65d832137e20e193c960802afba73b5d38sm if (!mSprite.animationFinished()) { 315cfd74d65d832137e20e193c960802afba73b5d38sm mSparksSprite.setVisible(true); 316cfd74d65d832137e20e193c960802afba73b5d38sm } 317cfd74d65d832137e20e193c960802afba73b5d38sm } 318cfd74d65d832137e20e193c960802afba73b5d38sm } 319cfd74d65d832137e20e193c960802afba73b5d38sm if (mExplodingDeath) { 320cfd74d65d832137e20e193c960802afba73b5d38sm visible = false; 321cfd74d65d832137e20e193c960802afba73b5d38sm } 322cfd74d65d832137e20e193c960802afba73b5d38sm } else if (currentAction == ActionType.FROZEN) { 323cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.playAnimation(PlayerAnimations.FROZEN.ordinal()); 324cfd74d65d832137e20e193c960802afba73b5d38sm } 325cfd74d65d832137e20e193c960802afba73b5d38sm 326cfd74d65d832137e20e193c960802afba73b5d38sm if (mFlickerTimeRemaining > 0.0f) { 327cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerTimeRemaining -= timeDelta; 328cfd74d65d832137e20e193c960802afba73b5d38sm if (gameTime > mLastFlickerTime + FLICKER_INTERVAL) { 329cfd74d65d832137e20e193c960802afba73b5d38sm mLastFlickerTime = gameTime; 330cfd74d65d832137e20e193c960802afba73b5d38sm mFlickerOn = !mFlickerOn; 331cfd74d65d832137e20e193c960802afba73b5d38sm } 332cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.setVisible(mFlickerOn); 333cfd74d65d832137e20e193c960802afba73b5d38sm if (mJetSprite != null && mJetSprite.getVisible()) { 334cfd74d65d832137e20e193c960802afba73b5d38sm mJetSprite.setVisible(mFlickerOn); 335cfd74d65d832137e20e193c960802afba73b5d38sm } 336cfd74d65d832137e20e193c960802afba73b5d38sm } else { 337cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.setVisible(visible); 338cfd74d65d832137e20e193c960802afba73b5d38sm mSprite.setOpacity(opacity); 339cfd74d65d832137e20e193c960802afba73b5d38sm } 340cfd74d65d832137e20e193c960802afba73b5d38sm 341cfd74d65d832137e20e193c960802afba73b5d38sm mPreviousAction = currentAction; 342cfd74d65d832137e20e193c960802afba73b5d38sm } 343cfd74d65d832137e20e193c960802afba73b5d38sm } 344cfd74d65d832137e20e193c960802afba73b5d38sm 345cfd74d65d832137e20e193c960802afba73b5d38sm public void setSprite(SpriteComponent sprite) { 346cfd74d65d832137e20e193c960802afba73b5d38sm mSprite = sprite; 347cfd74d65d832137e20e193c960802afba73b5d38sm } 348cfd74d65d832137e20e193c960802afba73b5d38sm 349cfd74d65d832137e20e193c960802afba73b5d38sm public void setJetSprite(SpriteComponent sprite) { 350cfd74d65d832137e20e193c960802afba73b5d38sm mJetSprite = sprite; 351cfd74d65d832137e20e193c960802afba73b5d38sm } 352cfd74d65d832137e20e193c960802afba73b5d38sm 353cfd74d65d832137e20e193c960802afba73b5d38sm public void setSparksSprite(SpriteComponent sprite) { 354cfd74d65d832137e20e193c960802afba73b5d38sm mSparksSprite = sprite; 355cfd74d65d832137e20e193c960802afba73b5d38sm } 356cfd74d65d832137e20e193c960802afba73b5d38sm 357cfd74d65d832137e20e193c960802afba73b5d38sm public void setPlayer(PlayerComponent player) { 358cfd74d65d832137e20e193c960802afba73b5d38sm mPlayer = player; 359cfd74d65d832137e20e193c960802afba73b5d38sm } 360cfd74d65d832137e20e193c960802afba73b5d38sm 361cfd74d65d832137e20e193c960802afba73b5d38sm public final void setDamageSwap(ChangeComponentsComponent damageSwap) { 362cfd74d65d832137e20e193c960802afba73b5d38sm mDamageSwap = damageSwap; 363cfd74d65d832137e20e193c960802afba73b5d38sm } 364cfd74d65d832137e20e193c960802afba73b5d38sm 365cfd74d65d832137e20e193c960802afba73b5d38sm public void setLandThump(Sound land) { 366cfd74d65d832137e20e193c960802afba73b5d38sm mLandThump = land; 367cfd74d65d832137e20e193c960802afba73b5d38sm } 368cfd74d65d832137e20e193c960802afba73b5d38sm 369cfd74d65d832137e20e193c960802afba73b5d38sm public void setRocketSound(Sound sound) { 370cfd74d65d832137e20e193c960802afba73b5d38sm mRocketSound = sound; 371cfd74d65d832137e20e193c960802afba73b5d38sm } 372cfd74d65d832137e20e193c960802afba73b5d38sm 373cfd74d65d832137e20e193c960802afba73b5d38sm public void setRubySounds(Sound one, Sound two, Sound three) { 374cfd74d65d832137e20e193c960802afba73b5d38sm mRubySound1 = one; 375cfd74d65d832137e20e193c960802afba73b5d38sm mRubySound2 = two; 376cfd74d65d832137e20e193c960802afba73b5d38sm mRubySound3 = three; 377cfd74d65d832137e20e193c960802afba73b5d38sm } 378cfd74d65d832137e20e193c960802afba73b5d38sm 379cfd74d65d832137e20e193c960802afba73b5d38sm public void setInventory(InventoryComponent inventory) { 380cfd74d65d832137e20e193c960802afba73b5d38sm mInventory = inventory; 381cfd74d65d832137e20e193c960802afba73b5d38sm } 382cfd74d65d832137e20e193c960802afba73b5d38sm 383cfd74d65d832137e20e193c960802afba73b5d38sm public void setExplosionSound(Sound sound) { 384cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionSound = sound; 385cfd74d65d832137e20e193c960802afba73b5d38sm } 386cfd74d65d832137e20e193c960802afba73b5d38sm} 387