Home | History | Annotate | Download | only in replicaisland
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.replica.replicaisland;
     18 
     19 import com.replica.replicaisland.SoundSystem.Sound;
     20 
     21 public class GhostComponent extends GameComponent {
     22     private float mMovementSpeed;
     23     private float mJumpImpulse;
     24     private float mAcceleration;
     25     private boolean mUseOrientationSensor;
     26     private float mDelayOnRelease;
     27     private boolean mKillOnRelease;
     28     private GameObject.ActionType mTargetAction;
     29     private float mLifeTime;
     30     private boolean mChangeActionOnButton;
     31     private GameObject.ActionType mButtonPressedAction;
     32     private Sound mAmbientSound;
     33     private int mAmbientSoundStream;
     34 
     35     public GhostComponent() {
     36         super();
     37         setPhase(GameComponent.ComponentPhases.THINK.ordinal());
     38         reset();
     39     }
     40 
     41     @Override
     42     public void reset() {
     43         mMovementSpeed = 0.0f;
     44         mJumpImpulse = 0.0f;
     45         mAcceleration = 0.0f;
     46         mUseOrientationSensor = false;
     47         mDelayOnRelease = 0.0f;
     48         mKillOnRelease = false;
     49         mTargetAction = GameObject.ActionType.MOVE;
     50         mLifeTime = 0.0f;
     51         mChangeActionOnButton = false;
     52         mButtonPressedAction = GameObject.ActionType.INVALID;
     53         mAmbientSound = null;
     54         mAmbientSoundStream = -1;
     55     }
     56 
     57     @Override
     58     public void update(float timeDelta, BaseObject parent) {
     59         GameObject parentObject = (GameObject) parent;
     60         boolean timeToRelease = false;
     61         final InputGameInterface input = sSystemRegistry.inputGameInterface;
     62         final CameraSystem camera = sSystemRegistry.cameraSystem;
     63 
     64         if (parentObject.life > 0) {
     65 
     66             if (mLifeTime > 0.0f) {
     67                 mLifeTime -= timeDelta;
     68                 if (mLifeTime <= 0.0f) {
     69                     timeToRelease = true;
     70                 } else if (mLifeTime < 1.0f) {
     71                     // Do we have a sprite we can fade out?
     72                     SpriteComponent sprite = parentObject.findByClass(SpriteComponent.class);
     73                     if (sprite != null) {
     74                         sprite.setOpacity(mLifeTime);
     75                     }
     76                 }
     77             }
     78 
     79             if (parentObject.getPosition().y < -parentObject.height) {
     80                 // we fell off the bottom of the screen, die.
     81                 parentObject.life = 0;
     82                 timeToRelease = true;
     83             }
     84 
     85             parentObject.setCurrentAction(mTargetAction);
     86             if (camera != null) {
     87                 camera.setTarget(parentObject);
     88             }
     89 
     90             if (input != null) {
     91 
     92                 if (mUseOrientationSensor) {
     93                 	final InputXY tilt = input.getTilt();
     94                     parentObject.getTargetVelocity().x =
     95                     	tilt.getX() * mMovementSpeed;
     96 
     97                     parentObject.getTargetVelocity().y =
     98                     	tilt.getY() * mMovementSpeed;
     99 
    100                     parentObject.getAcceleration().x = mAcceleration;
    101                     parentObject.getAcceleration().y = mAcceleration;
    102                 } else {
    103                 	final InputXY dpad = input.getDirectionalPad();
    104                     parentObject.getTargetVelocity().x =
    105                     	dpad.getX() * mMovementSpeed;
    106 
    107                     parentObject.getAcceleration().x = mAcceleration;
    108                 }
    109 
    110                 final InputButton jumpButton = input.getJumpButton();
    111                 final TimeSystem time = sSystemRegistry.timeSystem;
    112                 final float gameTime = time.getGameTime();
    113 
    114                 if (jumpButton.getTriggered(gameTime)
    115                         && parentObject.touchingGround()
    116                         && parentObject.getVelocity().y <= 0.0f
    117                         && !mChangeActionOnButton) {
    118                     parentObject.getImpulse().y += mJumpImpulse;
    119                 } else if (mChangeActionOnButton && jumpButton.getPressed()) {
    120                 	parentObject.setCurrentAction(mButtonPressedAction);
    121                 }
    122 
    123                 final InputButton attackButton = input.getAttackButton();
    124 
    125                 if (attackButton.getTriggered(gameTime)) {
    126                     timeToRelease = true;
    127                 }
    128             }
    129 
    130             if (!timeToRelease && mAmbientSound != null && mAmbientSoundStream == -1) {
    131             	SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
    132             	if (sound != null) {
    133             		mAmbientSoundStream = sound.play(mAmbientSound, true, SoundSystem.PRIORITY_NORMAL);
    134             	}
    135             }
    136         }
    137 
    138         if (parentObject.life == 0) {
    139         	if (mAmbientSoundStream > -1) {
    140             	SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
    141             	if (sound != null) {
    142             		sound.stop(mAmbientSoundStream);
    143             		mAmbientSoundStream = -1;
    144             	}
    145             }
    146         }
    147 
    148         if (timeToRelease) {
    149             releaseControl(parentObject);
    150         }
    151 
    152     }
    153 
    154     public final void releaseControl(GameObject parentObject) {
    155         GameObjectManager manager = sSystemRegistry.gameObjectManager;
    156         GameObject player = null;
    157         if (manager != null) {
    158             player = manager.getPlayer();
    159         }
    160 
    161         final CameraSystem camera = sSystemRegistry.cameraSystem;
    162         if (camera != null) {
    163             camera.setTarget(null);
    164         }
    165 
    166         if (player != null) {
    167 
    168             if (mKillOnRelease) {
    169                 parentObject.life = 0;
    170             } else {
    171                 // See if there's a component swap we can run.
    172                 ChangeComponentsComponent swap = parentObject.findByClass(ChangeComponentsComponent.class);
    173                 if (swap != null) {
    174                     swap.activate(parentObject);
    175                 }
    176             }
    177 
    178             PlayerComponent control = player.findByClass(PlayerComponent.class);
    179             if (camera.pointVisible(player.getPosition(), player.width)) {
    180                 control.deactivateGhost(0.0f);
    181             } else {
    182                 control.deactivateGhost(mDelayOnRelease);
    183             }
    184            /* final InputSystem input = sSystemRegistry.inputSystem;
    185             if (input != null) {
    186                 input.clearClickTriggered();
    187             }*/
    188         }
    189 
    190         if (mAmbientSoundStream > -1) {
    191         	SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
    192         	if (sound != null) {
    193         		sound.stop(mAmbientSoundStream);
    194         		mAmbientSoundStream = -1;
    195         	}
    196         }
    197     }
    198 
    199     public final void setMovementSpeed(float movementSpeed) {
    200         mMovementSpeed = movementSpeed;
    201     }
    202 
    203     public final void setJumpImpulse(float jumpImpulse) {
    204         mJumpImpulse = jumpImpulse;
    205     }
    206 
    207     public final void setAcceleration(float accceleration) {
    208         mAcceleration = accceleration;
    209     }
    210 
    211     public final void setUseOrientationSensor(boolean useSensor) {
    212         mUseOrientationSensor = useSensor;
    213     }
    214 
    215     public final void setDelayOnRelease(float delayOnRelease) {
    216         mDelayOnRelease = delayOnRelease;
    217     }
    218 
    219     public final void setKillOnRelease(boolean killOnRelease) {
    220         mKillOnRelease = killOnRelease;
    221     }
    222 
    223     public final void setTargetAction(GameObject.ActionType action) {
    224         mTargetAction = action;
    225     }
    226 
    227     public final void setLifeTime(float lifeTime) {
    228         mLifeTime = lifeTime;
    229     }
    230 
    231     public final void changeActionOnButton(GameObject.ActionType pressedAction) {
    232         mButtonPressedAction = pressedAction;
    233         mChangeActionOnButton = true;
    234     }
    235 
    236     public final void setAmbientSound(Sound sound) {
    237     	mAmbientSound = sound;
    238     }
    239 }
    240