• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.GameObject.ActionType;
20 
21 /**
22  * A component that implements the "pop-out" AI behavior.  Pop-out characters alternate between
23  * hiding and appearing based on their distance from the player.  They do not move or normally
24  * attack.
25  */
26 public class SleeperComponent extends GameComponent {
27     private final static int STATE_SLEEPING = 0;
28     private final static int STATE_WAKING = 1;
29     private final static int STATE_ATTACKING = 2;
30     private final static int STATE_SLAM = 3;
31     private final static float DEFAULT_WAKE_UP_DURATION = 3.0f;
32     private float mWakeUpDuration;
33     private float mStateTime;
34     private int mState;
35     private float mSlamDuration;
36     private float mSlamMagnitude;
37     private float mAttackImpulseX;
38     private float mAttackImpulseY;
39 
SleeperComponent()40     public SleeperComponent() {
41         super();
42         setPhase(GameComponent.ComponentPhases.THINK.ordinal());
43         reset();
44     }
45 
46     @Override
reset()47     public void reset() {
48         mWakeUpDuration = DEFAULT_WAKE_UP_DURATION;
49         mState = STATE_SLEEPING;
50         mStateTime = 0.0f;
51         mSlamDuration = 0.0f;
52         mSlamMagnitude = 0.0f;
53         mAttackImpulseX = 0.0f;
54         mAttackImpulseY = 0.0f;
55     }
56 
57     @Override
update(float timeDelta, BaseObject parent)58     public void update(float timeDelta, BaseObject parent) {
59         GameObject parentObject = (GameObject) parent;
60 
61         if (parentObject.getCurrentAction() == ActionType.INVALID) {
62             parentObject.setCurrentAction(GameObject.ActionType.IDLE);
63             mState = STATE_SLEEPING;
64         }
65 
66         CameraSystem camera = sSystemRegistry.cameraSystem;
67         switch(mState) {
68             case STATE_SLEEPING:
69                 if (camera.shaking() && camera.pointVisible(parentObject.getPosition(), parentObject.width / 2.0f)) {
70                     mState = STATE_WAKING;
71                     mStateTime = mWakeUpDuration;
72                     parentObject.setCurrentAction(GameObject.ActionType.MOVE);
73                 }
74                 break;
75             case STATE_WAKING:
76                 mStateTime -= timeDelta;
77                 if (mStateTime <= 0.0f) {
78                     mState = STATE_ATTACKING;
79                     parentObject.setCurrentAction(GameObject.ActionType.ATTACK);
80                     parentObject.getImpulse().x += mAttackImpulseX * parentObject.facingDirection.x;
81                     parentObject.getImpulse().y += mAttackImpulseY;
82                 }
83                 break;
84             case STATE_ATTACKING:
85                 if (parentObject.touchingGround() && parentObject.getVelocity().y < 0.0f) {
86                     mState = STATE_SLAM;
87                     camera.shake(mSlamDuration, mSlamMagnitude);
88                     parentObject.getVelocity().zero();
89                 }
90                 break;
91             case STATE_SLAM:
92                 if (!camera.shaking()) {
93                     mState = STATE_SLEEPING;
94                     parentObject.setCurrentAction(GameObject.ActionType.IDLE);
95                 }
96                 break;
97 
98         }
99     }
100 
101 
setWakeUpDuration(float duration)102     public void setWakeUpDuration(float duration) {
103         mWakeUpDuration = duration;
104     }
105 
setSlam(float duration, float magnitude)106     public void setSlam(float duration, float magnitude) {
107         mSlamDuration = duration;
108         mSlamMagnitude = magnitude;
109     }
110 
setAttackImpulse(float x, float y)111     public void setAttackImpulse(float x, float y) {
112         mAttackImpulseX = x;
113         mAttackImpulseY = y;
114     }
115 }
116 
117 
118