| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.replica.replicaisland; |
| |
| import com.replica.replicaisland.SoundSystem.Sound; |
| |
| public class GhostComponent extends GameComponent { |
| private float mMovementSpeed; |
| private float mJumpImpulse; |
| private float mAcceleration; |
| private boolean mUseOrientationSensor; |
| private float mDelayOnRelease; |
| private boolean mKillOnRelease; |
| private GameObject.ActionType mTargetAction; |
| private float mLifeTime; |
| private boolean mChangeActionOnButton; |
| private GameObject.ActionType mButtonPressedAction; |
| private Sound mAmbientSound; |
| private int mAmbientSoundStream; |
| |
| public GhostComponent() { |
| super(); |
| setPhase(GameComponent.ComponentPhases.THINK.ordinal()); |
| reset(); |
| } |
| |
| @Override |
| public void reset() { |
| mMovementSpeed = 0.0f; |
| mJumpImpulse = 0.0f; |
| mAcceleration = 0.0f; |
| mUseOrientationSensor = false; |
| mDelayOnRelease = 0.0f; |
| mKillOnRelease = false; |
| mTargetAction = GameObject.ActionType.MOVE; |
| mLifeTime = 0.0f; |
| mChangeActionOnButton = false; |
| mButtonPressedAction = GameObject.ActionType.INVALID; |
| mAmbientSound = null; |
| mAmbientSoundStream = -1; |
| } |
| |
| @Override |
| public void update(float timeDelta, BaseObject parent) { |
| GameObject parentObject = (GameObject) parent; |
| boolean timeToRelease = false; |
| final InputGameInterface input = sSystemRegistry.inputGameInterface; |
| final CameraSystem camera = sSystemRegistry.cameraSystem; |
| |
| if (parentObject.life > 0) { |
| |
| if (mLifeTime > 0.0f) { |
| mLifeTime -= timeDelta; |
| if (mLifeTime <= 0.0f) { |
| timeToRelease = true; |
| } else if (mLifeTime < 1.0f) { |
| // Do we have a sprite we can fade out? |
| SpriteComponent sprite = parentObject.findByClass(SpriteComponent.class); |
| if (sprite != null) { |
| sprite.setOpacity(mLifeTime); |
| } |
| } |
| } |
| |
| if (parentObject.getPosition().y < -parentObject.height) { |
| // we fell off the bottom of the screen, die. |
| parentObject.life = 0; |
| timeToRelease = true; |
| } |
| |
| parentObject.setCurrentAction(mTargetAction); |
| if (camera != null) { |
| camera.setTarget(parentObject); |
| } |
| |
| if (input != null) { |
| |
| if (mUseOrientationSensor) { |
| final InputXY tilt = input.getTilt(); |
| parentObject.getTargetVelocity().x = |
| tilt.getX() * mMovementSpeed; |
| |
| parentObject.getTargetVelocity().y = |
| tilt.getY() * mMovementSpeed; |
| |
| parentObject.getAcceleration().x = mAcceleration; |
| parentObject.getAcceleration().y = mAcceleration; |
| } else { |
| final InputXY dpad = input.getDirectionalPad(); |
| parentObject.getTargetVelocity().x = |
| dpad.getX() * mMovementSpeed; |
| |
| parentObject.getAcceleration().x = mAcceleration; |
| } |
| |
| final InputButton jumpButton = input.getJumpButton(); |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float gameTime = time.getGameTime(); |
| |
| if (jumpButton.getTriggered(gameTime) |
| && parentObject.touchingGround() |
| && parentObject.getVelocity().y <= 0.0f |
| && !mChangeActionOnButton) { |
| parentObject.getImpulse().y += mJumpImpulse; |
| } else if (mChangeActionOnButton && jumpButton.getPressed()) { |
| parentObject.setCurrentAction(mButtonPressedAction); |
| } |
| |
| final InputButton attackButton = input.getAttackButton(); |
| |
| if (attackButton.getTriggered(gameTime)) { |
| timeToRelease = true; |
| } |
| } |
| |
| if (!timeToRelease && mAmbientSound != null && mAmbientSoundStream == -1) { |
| SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; |
| if (sound != null) { |
| mAmbientSoundStream = sound.play(mAmbientSound, true, SoundSystem.PRIORITY_NORMAL); |
| } |
| } |
| } |
| |
| if (parentObject.life == 0) { |
| if (mAmbientSoundStream > -1) { |
| SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; |
| if (sound != null) { |
| sound.stop(mAmbientSoundStream); |
| mAmbientSoundStream = -1; |
| } |
| } |
| } |
| |
| if (timeToRelease) { |
| releaseControl(parentObject); |
| } |
| |
| } |
| |
| public final void releaseControl(GameObject parentObject) { |
| GameObjectManager manager = sSystemRegistry.gameObjectManager; |
| GameObject player = null; |
| if (manager != null) { |
| player = manager.getPlayer(); |
| } |
| |
| final CameraSystem camera = sSystemRegistry.cameraSystem; |
| if (camera != null) { |
| camera.setTarget(null); |
| } |
| |
| if (player != null) { |
| |
| if (mKillOnRelease) { |
| parentObject.life = 0; |
| } else { |
| // See if there's a component swap we can run. |
| ChangeComponentsComponent swap = parentObject.findByClass(ChangeComponentsComponent.class); |
| if (swap != null) { |
| swap.activate(parentObject); |
| } |
| } |
| |
| PlayerComponent control = player.findByClass(PlayerComponent.class); |
| if (camera.pointVisible(player.getPosition(), player.width)) { |
| control.deactivateGhost(0.0f); |
| } else { |
| control.deactivateGhost(mDelayOnRelease); |
| } |
| /* final InputSystem input = sSystemRegistry.inputSystem; |
| if (input != null) { |
| input.clearClickTriggered(); |
| }*/ |
| } |
| |
| if (mAmbientSoundStream > -1) { |
| SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; |
| if (sound != null) { |
| sound.stop(mAmbientSoundStream); |
| mAmbientSoundStream = -1; |
| } |
| } |
| } |
| |
| public final void setMovementSpeed(float movementSpeed) { |
| mMovementSpeed = movementSpeed; |
| } |
| |
| public final void setJumpImpulse(float jumpImpulse) { |
| mJumpImpulse = jumpImpulse; |
| } |
| |
| public final void setAcceleration(float accceleration) { |
| mAcceleration = accceleration; |
| } |
| |
| public final void setUseOrientationSensor(boolean useSensor) { |
| mUseOrientationSensor = useSensor; |
| } |
| |
| public final void setDelayOnRelease(float delayOnRelease) { |
| mDelayOnRelease = delayOnRelease; |
| } |
| |
| public final void setKillOnRelease(boolean killOnRelease) { |
| mKillOnRelease = killOnRelease; |
| } |
| |
| public final void setTargetAction(GameObject.ActionType action) { |
| mTargetAction = action; |
| } |
| |
| public final void setLifeTime(float lifeTime) { |
| mLifeTime = lifeTime; |
| } |
| |
| public final void changeActionOnButton(GameObject.ActionType pressedAction) { |
| mButtonPressedAction = pressedAction; |
| mChangeActionOnButton = true; |
| } |
| |
| public final void setAmbientSound(Sound sound) { |
| mAmbientSound = sound; |
| } |
| } |