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.GameObject.ActionType; 20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.SoundSystem.Sound; 21cfd74d65d832137e20e193c960802afba73b5d38sm 22cfd74d65d832137e20e193c960802afba73b5d38smpublic class LauncherComponent extends GameComponent { 23cfd74d65d832137e20e193c960802afba73b5d38sm private final static float DEFAULT_LAUNCH_DELAY = 2.0f; 24cfd74d65d832137e20e193c960802afba73b5d38sm private final static float DEFAULT_LAUNCH_MAGNITUDE = 2000.0f; 25cfd74d65d832137e20e193c960802afba73b5d38sm private final static float DEFAULT_POST_LAUNCH_DELAY = 1.0f; 26cfd74d65d832137e20e193c960802afba73b5d38sm private GameObject mShot; 27cfd74d65d832137e20e193c960802afba73b5d38sm private float mLaunchTime; 28cfd74d65d832137e20e193c960802afba73b5d38sm private float mAngle; 29cfd74d65d832137e20e193c960802afba73b5d38sm private float mLaunchDelay; 30cfd74d65d832137e20e193c960802afba73b5d38sm private Vector2 mLaunchDirection; 31cfd74d65d832137e20e193c960802afba73b5d38sm private float mLaunchMagnitude; 32cfd74d65d832137e20e193c960802afba73b5d38sm private float mPostLaunchDelay; 33cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mDriveActions; 34cfd74d65d832137e20e193c960802afba73b5d38sm private GameObjectFactory.GameObjectType mLaunchEffect; 35cfd74d65d832137e20e193c960802afba73b5d38sm private float mLaunchEffectOffsetX; 36cfd74d65d832137e20e193c960802afba73b5d38sm private float mLaunchEffectOffsetY; 37cfd74d65d832137e20e193c960802afba73b5d38sm private Sound mLaunchSound; 38cfd74d65d832137e20e193c960802afba73b5d38sm 39cfd74d65d832137e20e193c960802afba73b5d38sm public LauncherComponent() { 40cfd74d65d832137e20e193c960802afba73b5d38sm super(); 41cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDirection = new Vector2(); 42cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 43cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(ComponentPhases.THINK.ordinal()); 44cfd74d65d832137e20e193c960802afba73b5d38sm } 45cfd74d65d832137e20e193c960802afba73b5d38sm 46cfd74d65d832137e20e193c960802afba73b5d38sm @Override 47cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 48cfd74d65d832137e20e193c960802afba73b5d38sm mShot = null; 49cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchTime = 0.0f; 50cfd74d65d832137e20e193c960802afba73b5d38sm mAngle = 0.0f; 51cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDelay = DEFAULT_LAUNCH_DELAY; 52cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchMagnitude = DEFAULT_LAUNCH_MAGNITUDE; 53cfd74d65d832137e20e193c960802afba73b5d38sm mPostLaunchDelay = DEFAULT_POST_LAUNCH_DELAY; 54cfd74d65d832137e20e193c960802afba73b5d38sm mDriveActions = true; 55cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffect = GameObjectFactory.GameObjectType.INVALID; 56cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffectOffsetX = 0.0f; 57cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffectOffsetY = 0.0f; 58cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchSound = null; 59cfd74d65d832137e20e193c960802afba73b5d38sm } 60cfd74d65d832137e20e193c960802afba73b5d38sm 61cfd74d65d832137e20e193c960802afba73b5d38sm @Override 62cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 63cfd74d65d832137e20e193c960802afba73b5d38sm final TimeSystem time = sSystemRegistry.timeSystem; 64cfd74d65d832137e20e193c960802afba73b5d38sm final float gameTime = time.getGameTime(); 65cfd74d65d832137e20e193c960802afba73b5d38sm GameObject parentObject = (GameObject)parent; 66cfd74d65d832137e20e193c960802afba73b5d38sm 67cfd74d65d832137e20e193c960802afba73b5d38sm if (mShot != null) { 68cfd74d65d832137e20e193c960802afba73b5d38sm if (mShot.life <= 0) { 69cfd74d65d832137e20e193c960802afba73b5d38sm // Looks like the shot is dead. Let's forget about it. 70cfd74d65d832137e20e193c960802afba73b5d38sm // TODO: this is unreliable. We should have a "notify on death" event or something. 71cfd74d65d832137e20e193c960802afba73b5d38sm mShot = null; 72cfd74d65d832137e20e193c960802afba73b5d38sm } else { 73cfd74d65d832137e20e193c960802afba73b5d38sm if (gameTime > mLaunchTime) { 74cfd74d65d832137e20e193c960802afba73b5d38sm fire(mShot, parentObject, mAngle); 75cfd74d65d832137e20e193c960802afba73b5d38sm mShot = null; 76cfd74d65d832137e20e193c960802afba73b5d38sm if (mDriveActions) { 77cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(ActionType.ATTACK); 78cfd74d65d832137e20e193c960802afba73b5d38sm } 79cfd74d65d832137e20e193c960802afba73b5d38sm } else { 80cfd74d65d832137e20e193c960802afba73b5d38sm mShot.setPosition(parentObject.getPosition()); 81cfd74d65d832137e20e193c960802afba73b5d38sm } 82cfd74d65d832137e20e193c960802afba73b5d38sm } 83cfd74d65d832137e20e193c960802afba73b5d38sm } else if (gameTime > mLaunchTime + mPostLaunchDelay) { 84cfd74d65d832137e20e193c960802afba73b5d38sm if (mDriveActions) { 85cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(ActionType.IDLE); 86cfd74d65d832137e20e193c960802afba73b5d38sm } 87cfd74d65d832137e20e193c960802afba73b5d38sm } 88cfd74d65d832137e20e193c960802afba73b5d38sm } 89cfd74d65d832137e20e193c960802afba73b5d38sm 90cfd74d65d832137e20e193c960802afba73b5d38sm public void prepareToLaunch(GameObject object, GameObject parentObject) { 91cfd74d65d832137e20e193c960802afba73b5d38sm if (mShot != object) { 92cfd74d65d832137e20e193c960802afba73b5d38sm if (mShot != null) { 93cfd74d65d832137e20e193c960802afba73b5d38sm // We already have a shot loaded and we are asked to shoot something else. 94cfd74d65d832137e20e193c960802afba73b5d38sm // Shoot the current shot off and then load the new one. 95cfd74d65d832137e20e193c960802afba73b5d38sm fire(mShot, parentObject, mAngle); 96cfd74d65d832137e20e193c960802afba73b5d38sm } 97cfd74d65d832137e20e193c960802afba73b5d38sm final TimeSystem time = sSystemRegistry.timeSystem; 98cfd74d65d832137e20e193c960802afba73b5d38sm final float gameTime = time.getGameTime(); 99cfd74d65d832137e20e193c960802afba73b5d38sm mShot = object; 100cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchTime = gameTime + mLaunchDelay; 101cfd74d65d832137e20e193c960802afba73b5d38sm } 102cfd74d65d832137e20e193c960802afba73b5d38sm } 103cfd74d65d832137e20e193c960802afba73b5d38sm 104cfd74d65d832137e20e193c960802afba73b5d38sm private void fire(GameObject object, GameObject parentObject, float mAngle) { 105cfd74d65d832137e20e193c960802afba73b5d38sm if (mDriveActions) { 106cfd74d65d832137e20e193c960802afba73b5d38sm object.setCurrentAction(ActionType.MOVE); 107cfd74d65d832137e20e193c960802afba73b5d38sm } 108cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDirection.set((float)Math.sin(mAngle), (float)Math.cos(mAngle)); 109cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDirection.multiply(parentObject.facingDirection); 110cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDirection.multiply(mLaunchMagnitude); 111cfd74d65d832137e20e193c960802afba73b5d38sm object.setVelocity(mLaunchDirection); 112cfd74d65d832137e20e193c960802afba73b5d38sm 113cfd74d65d832137e20e193c960802afba73b5d38sm if (mLaunchSound != null) { 114cfd74d65d832137e20e193c960802afba73b5d38sm SoundSystem sound = sSystemRegistry.soundSystem; 115cfd74d65d832137e20e193c960802afba73b5d38sm if (sound != null) { 116cfd74d65d832137e20e193c960802afba73b5d38sm sound.play(mLaunchSound, false, SoundSystem.PRIORITY_NORMAL); 117cfd74d65d832137e20e193c960802afba73b5d38sm } 118cfd74d65d832137e20e193c960802afba73b5d38sm } 119cfd74d65d832137e20e193c960802afba73b5d38sm 120cfd74d65d832137e20e193c960802afba73b5d38sm if (mLaunchEffect != GameObjectFactory.GameObjectType.INVALID) { 121cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectFactory factory = sSystemRegistry.gameObjectFactory; 122cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = sSystemRegistry.gameObjectManager; 123cfd74d65d832137e20e193c960802afba73b5d38sm if (factory != null && manager != null) { 124cfd74d65d832137e20e193c960802afba73b5d38sm final Vector2 position = parentObject.getPosition(); 125cfd74d65d832137e20e193c960802afba73b5d38sm 126cfd74d65d832137e20e193c960802afba73b5d38sm GameObject effect = factory.spawn(mLaunchEffect, 127cfd74d65d832137e20e193c960802afba73b5d38sm position.x + (mLaunchEffectOffsetX * parentObject.facingDirection.x), 128cfd74d65d832137e20e193c960802afba73b5d38sm position.y + (mLaunchEffectOffsetY * parentObject.facingDirection.y), 129cfd74d65d832137e20e193c960802afba73b5d38sm false); 1309d4cc2572d37983607df38b0f4216ed76ac51814sm if (effect != null) { 1319d4cc2572d37983607df38b0f4216ed76ac51814sm manager.add(effect); 1329d4cc2572d37983607df38b0f4216ed76ac51814sm } 133cfd74d65d832137e20e193c960802afba73b5d38sm } 134cfd74d65d832137e20e193c960802afba73b5d38sm } 135cfd74d65d832137e20e193c960802afba73b5d38sm } 136cfd74d65d832137e20e193c960802afba73b5d38sm 137cfd74d65d832137e20e193c960802afba73b5d38sm public void setup(float angle, float magnitude, float launchDelay, float postLaunchDelay, boolean driveActions) { 138cfd74d65d832137e20e193c960802afba73b5d38sm mAngle = angle; 139cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchMagnitude = magnitude; 140cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchDelay = launchDelay; 141cfd74d65d832137e20e193c960802afba73b5d38sm mPostLaunchDelay = postLaunchDelay; 142cfd74d65d832137e20e193c960802afba73b5d38sm mDriveActions = driveActions; 143cfd74d65d832137e20e193c960802afba73b5d38sm } 144cfd74d65d832137e20e193c960802afba73b5d38sm 145cfd74d65d832137e20e193c960802afba73b5d38sm public void setLaunchEffect(GameObjectFactory.GameObjectType effectType, float offsetX, float offsetY) { 146cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffect = effectType; 147cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffectOffsetX = offsetX; 148cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchEffectOffsetY = offsetY; 149cfd74d65d832137e20e193c960802afba73b5d38sm } 150cfd74d65d832137e20e193c960802afba73b5d38sm 151cfd74d65d832137e20e193c960802afba73b5d38sm public void setLaunchSound(Sound sound) { 152cfd74d65d832137e20e193c960802afba73b5d38sm mLaunchSound = sound; 153cfd74d65d832137e20e193c960802afba73b5d38sm } 154cfd74d65d832137e20e193c960802afba73b5d38sm 155cfd74d65d832137e20e193c960802afba73b5d38sm} 156