View Javadoc

1   package de.jos.game.actions;
2   
3   import java.awt.AlphaComposite;
4   import java.awt.Composite;
5   import java.awt.Graphics2D;
6   
7   import org.apache.commons.lang.StringUtils;
8   
9   import com.golden.gamedev.GameObject;
10  import com.golden.gamedev.object.Sprite;
11  import com.golden.gamedev.object.Timer;
12  import com.golden.gamedev.object.sprite.AdvanceSprite;
13  
14  import de.jos.game.Constants;
15  
16  public class ActionScrollInOut extends AbstractAction implements SpecialActionEvent, Constants {
17  
18    private static final double TIMER_INCREMENT = 8.0d;
19  
20    // update the countdown every second
21    private Timer timer = null;
22    private Timer waitTimer = null;
23  
24    private String text1 = null;
25    private String text2 = null;
26  
27    private Sprite top = null;
28    private Sprite bottom = null;
29  
30    private enum State {
31      NONE, MOVE_IN, MOVE_OUT, WAITING, FINISHED
32    };
33  
34    private State state = State.NONE;
35  
36    private int waitCounter = 0;
37  
38    private AdvanceSprite bullet = null;
39  
40    private Integer nextLevelNewColor = null;
41  
42    public ActionScrollInOut() {}
43  
44    public void init() {
45      super.init();
46      timer = new Timer(10);
47  
48      top = getResourceContainer().getLevelAdvanceTop();
49      top.setBackground(getResourceContainer().getGameBackgroundImage());
50      bottom = getResourceContainer().getLevelAdvanceBottom();
51      bottom.setBackground(getResourceContainer().getGameBackgroundImage());
52  
53      top.setX(LEVEL_ADVANCEMENT_X_OFFSET);
54      top.setY(LEVEL_ADVANCEMENT_Y_TARGET - ((9 * SPRITE_HEIGHT) / 2) - 250);
55  
56      bottom.setX(LEVEL_ADVANCEMENT_X_OFFSET);
57      bottom.setY(LEVEL_ADVANCEMENT_Y_TARGET + 250);
58  
59      if (getNextLevelNewColor() != null && getNextLevelNewColor().intValue() >= 0) {
60        bullet = new AdvanceSprite(getResourceContainer().getBulletSpriteRotate(getNextLevelNewColor()));
61        bullet.setX(220);
62        bullet.setY(300);
63        bullet.setAnimate(true);
64        bullet.setLoopAnim(true);
65        bullet.setAnimationTimer(new Timer(50));
66      }
67  
68      waitCounter = 0;
69      setState(State.MOVE_IN);
70    }
71  
72    public void update(long elapsedTime, GameObject gameObject) {
73  
74      if (getState() == State.MOVE_IN) {
75        if (timer.action(elapsedTime)) {
76          if (bottom.getY() > LEVEL_ADVANCEMENT_Y_TARGET) {
77            top.moveY(TIMER_INCREMENT);
78            bottom.moveY(-TIMER_INCREMENT);
79  
80            if (bottom.getY() < LEVEL_ADVANCEMENT_Y_TARGET) {
81              bottom.setY(LEVEL_ADVANCEMENT_Y_TARGET);
82              top.setY(LEVEL_ADVANCEMENT_Y_TARGET - ((9 * SPRITE_HEIGHT) / 2));
83            }
84          } else {
85            setState(State.WAITING);
86            waitTimer = new Timer(3000);
87          }
88        }
89      } else if (getState() == State.MOVE_OUT) {
90        if (timer.action(elapsedTime)) {
91          top.moveY(-TIMER_INCREMENT);
92          bottom.moveY(TIMER_INCREMENT);
93  
94          if (bottom.getY() > (LEVEL_ADVANCEMENT_Y_TARGET + 250)) {
95            setState(State.FINISHED);
96          }
97        }
98      } else if (getState() == State.WAITING) {
99        if (waitTimer.action(elapsedTime) == true) {
100         waitTimer.setActive(false);
101         waitCounter++;
102       } else if (waitCounter >= 1) {
103         setState(State.MOVE_OUT);
104       }
105     }
106 
107     if (bullet != null) {
108       bullet.update(elapsedTime);
109     }
110   }
111 
112   public void render(Graphics2D graphics, GameObject gameObject) {
113     Composite old = graphics.getComposite();
114     Composite scoreComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);
115     graphics.setComposite(scoreComposite);
116 
117     // Clipping Rect setzen auf das innere Feld
118     graphics.setClip(73, 74, 397 - 73, 397 - 74);
119 
120     top.render(graphics);
121     bottom.render(graphics);
122 
123     // urspruengliches Clipping Rect wieder setzen
124     graphics.setClip(0, 0, Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT);
125 
126     if (getState() == State.WAITING) {
127       getGameFont().drawString(graphics, getText1(), 140, 210);
128       getGameFont().drawString(graphics, getText2(), 140, 250);
129 
130       if (bullet != null) {
131         bullet.render(graphics);
132       }
133     }
134 
135     graphics.setComposite(old);
136   }
137 
138   public Integer getLayer() {
139     return LayerConstants.LAYER_3;
140   }
141 
142   public boolean isFinished() {
143     return (state == State.FINISHED);
144   }
145 
146   public State getState() {
147     return state;
148   }
149 
150   public void setState(State state) {
151     this.state = state;
152   }
153 
154   public String getText1() {
155     return text1;
156   }
157 
158   public void setText1(String text1) {
159     this.text1 = StringUtils.upperCase(text1);
160   }
161 
162   public String getText2() {
163     return text2;
164   }
165 
166   public void setText2(String text2) {
167     this.text2 = StringUtils.upperCase(text2);
168   }
169 
170   public Integer getNextLevelNewColor() {
171     return nextLevelNewColor;
172   }
173 
174   public void setNextLevelNewColor(Integer nextLevelNewColor) {
175     this.nextLevelNewColor = nextLevelNewColor;
176   }
177 
178   public String getName() {
179     return this.getClass().getName();
180   }
181 }