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 
GhostComponent()35     public GhostComponent() {
36         super();
37         setPhase(GameComponent.ComponentPhases.THINK.ordinal());
38         reset();
39     }
40 
41     @Override
reset()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
update(float timeDelta, BaseObject parent)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 
releaseControl(GameObject parentObject)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 
setMovementSpeed(float movementSpeed)199     public final void setMovementSpeed(float movementSpeed) {
200         mMovementSpeed = movementSpeed;
201     }
202 
setJumpImpulse(float jumpImpulse)203     public final void setJumpImpulse(float jumpImpulse) {
204         mJumpImpulse = jumpImpulse;
205     }
206 
setAcceleration(float accceleration)207     public final void setAcceleration(float accceleration) {
208         mAcceleration = accceleration;
209     }
210 
setUseOrientationSensor(boolean useSensor)211     public final void setUseOrientationSensor(boolean useSensor) {
212         mUseOrientationSensor = useSensor;
213     }
214 
setDelayOnRelease(float delayOnRelease)215     public final void setDelayOnRelease(float delayOnRelease) {
216         mDelayOnRelease = delayOnRelease;
217     }
218 
setKillOnRelease(boolean killOnRelease)219     public final void setKillOnRelease(boolean killOnRelease) {
220         mKillOnRelease = killOnRelease;
221     }
222 
setTargetAction(GameObject.ActionType action)223     public final void setTargetAction(GameObject.ActionType action) {
224         mTargetAction = action;
225     }
226 
setLifeTime(float lifeTime)227     public final void setLifeTime(float lifeTime) {
228         mLifeTime = lifeTime;
229     }
230 
changeActionOnButton(GameObject.ActionType pressedAction)231     public final void changeActionOnButton(GameObject.ActionType pressedAction) {
232         mButtonPressedAction = pressedAction;
233         mChangeActionOnButton = true;
234     }
235 
setAmbientSound(Sound sound)236     public final void setAmbientSound(Sound sound) {
237     	mAmbientSound = sound;
238     }
239 }
240