DEADSOFTWARE

Initial commit.
[LongFlight.git] / src / code / kalter / longflight / screen / Game.java
1 package code.kalter.longflight.screen;
3 import code.kalter.longflight.Arrays;
4 import code.kalter.longflight.ByteArrayOutputStream;
5 import code.kalter.longflight.EventListener;
6 import code.kalter.longflight.Loader;
7 import code.kalter.longflight.LongFlight;
8 import code.kalter.longflight.Sprite;
9 import code.kalter.longflight.game.Bullet;
10 import code.kalter.longflight.game.Enemy;
11 import code.kalter.longflight.game.Gamer;
12 import code.kalter.longflight.game.bullet.Collisionable;
13 import code.kalter.longflight.game.explosion.Explosion;
14 import code.kalter.longflight.rms.RMS;
15 import code.kalter.longflight.rms.RecordNotFoundException;
16 import java.io.IOException;
17 import javax.microedition.lcdui.Graphics;
18 import javax.microedition.lcdui.Image;
19 import javax.microedition.rms.RecordStoreException;
21 /**
22 * Игровой экран. Остаётся активным во время паузы и информации о уничтожении. В
23 * меню паузы происходит отрисовка элементов (см. метод
24 * paintElements), а в меню информации о уничтожении происходит и
25 * отрисовка (см. метод updateElements), и обновление, но без
26 * создания новых врагов
27 *
28 * @author KalterFive
29 */
30 public class Game extends Screen {
32 public static Game link;
34 // keys
35 private boolean up;
36 private boolean down;
37 private boolean left;
38 private boolean right;
39 private boolean fire;
40 private boolean pointerPressed;
42 private final Gamer gamer;
43 private final Bullet bullet;
44 private final Enemy enemy;
45 private final Explosion explosion;
47 private final Sprite rightSoft;
48 private final Sprite lifeStatus;
49 private final Sprite overheatStatus;
50 private final Image downPanel;
51 private final Image upPanel;
53 private boolean isPause; // для проверки на переход в меню паузы
55 public Game() throws IOException {
56 explosion = Explosion.createExplosion("/gfx/boom.png");
57 bullet = new Bullet(screenH);
58 gamer = new Gamer(screenW, screenH, bullet, explosion);
59 enemy = new Enemy(screenW, screenH, bullet, explosion, gamer);
60 bullet.setCollisionable(new Collisionable[]{gamer, enemy});
62 Loader loader = Loader.getInstance();
64 // right soft
65 Image rightSoftImage = loader.getImage("/gfx/game/right_soft.png");
66 int rightSoftX = screenW - rightSoftImage.getWidth();
67 int rightSoftY = screenH - rightSoftImage.getHeight();
68 rightSoft = new Sprite(rightSoftImage, rightSoftX, rightSoftY);
69 rightSoft.addEvent(new EventListener() {
70 // override
71 public boolean is() {
72 return rightSoft.isEntrySet(getXPressed(), getYPressed());
73 }
75 // override
76 public void event() {
77 rightSoftPressed();
78 }
79 });
81 // life status
82 Image lifeStatusImage = loader.getImage("/gfx/game/life.png");
83 int lifeStatusX = 2;
84 int lifeStatusY = screenH - 20;
85 lifeStatus = new Sprite(lifeStatusImage, lifeStatusX, lifeStatusY);
87 // overheat status
88 Image overheatStatusImage = loader.getImage("/gfx/game/overheat.png");
89 int overheatStatusX = screenW - overheatStatusImage.getWidth() - 2;
90 int overheatStatusY = screenH - 20;
91 overheatStatus = new Sprite(overheatStatusImage,
92 overheatStatusX, overheatStatusY);
94 // up & down panel
95 downPanel = loader.getImage("/gfx/game/down_panel.png");
96 upPanel = loader.getImage("/gfx/game/up_panel.png");
98 link = this;
99 }
101 // override
102 public void start() {
103 try {
104 up = down = right = left = fire = pointerPressed = false;
105 enemy.activateCreator();
106 if (isPause) {
107 isPause = false;
108 return;
110 explosion.deactivateAll();
111 gamer.setNull();
112 bullet.setNull();
113 enemy.setNull();
114 setDate(2, screenH - 9);
115 } catch (Exception e) {
116 LongFlight.link.catchException(e);
117 } finally {
118 isPause = false;
119 super.start();
123 // override
124 public void run() {
125 while (getGameLoop()) {
126 fps.process();
127 paint();
128 checkKey();
129 update();
130 LongFlight.link.sleep(20);
131 fps.max();
133 if (isPause) {
134 return;
136 LongFlight.link.$setScreen(LongFlight.CRASH);
139 // override
140 public void keyPressed(int keyCode) {
141 switch (keyCode) {
142 case RIGHT_SOFT:
143 setPauseScreen();
144 break;
146 switch (getGameAction(keyCode)) {
147 case UP:
148 up = true;
149 break;
151 case DOWN:
152 down = true;
153 break;
155 case LEFT:
156 left = true;
157 break;
159 case RIGHT:
160 right = true;
161 break;
163 case FIRE:
164 fire = true;
165 break;
169 // override
170 public void keyReleased(int keyCode) {
171 switch (getGameAction(keyCode)) {
172 case UP:
173 up = false;
174 break;
176 case DOWN:
177 down = false;
178 break;
180 case LEFT:
181 left = false;
182 break;
184 case RIGHT:
185 right = false;
186 break;
188 case FIRE:
189 fire = false;
190 break;
194 // override
195 public void pointerReleased(int x, int y) {
196 pointerPressed = false;
199 // override
200 public void pointerPressed(int x, int y) {
201 super.pointerPressed(x, y);
202 rightSoft.exciteEvent();
203 pointerPressed = true;
206 // override
207 public void stop() {
208 enemy.deactivateCreator();
209 super.stop();
212 public Explosion getExplosion() {
213 return explosion;
216 public void setNullPause() {
217 isPause = false;
220 public void save() {
221 final int score = enemy.getScore();
222 try {
223 final RMS rms = new RMS("longflight", true);
224 try {
225 final int[] record = rms.get(2).toIntArray(5);
226 for (int i = 0; i < 5; i++) {
227 if (score > record[i]) {
228 Arrays.insertShiftRight(record, score, i);
229 break;
232 saveRecord(rms, record);
233 } catch (RecordNotFoundException e) {
234 saveRecord(rms, new int[]{score, 0, 0, 0, 0});
236 rms.close();
237 } catch (RecordStoreException e) {
238 LongFlight.link.catchException(e);
242 private void rightSoftPressed() {
243 setPauseScreen();
246 private void checkKey() {
247 if (pointerPressed) {
248 if (isPointerUp()) {
249 gamer.moveUp();
251 if (isPointerDown()) {
252 gamer.moveDown();
254 if (isPointerLeft()) {
255 gamer.moveLeft();
257 if (isPointerRight()) {
258 gamer.moveRight();
260 if (isPointerFire()) {
261 gamer.fire();
264 if (up) {
265 gamer.moveUp();
267 if (down) {
268 gamer.moveDown();
270 if (left) {
271 gamer.moveLeft();
273 if (right) {
274 gamer.moveRight();
276 if (fire) {
277 gamer.fire();
281 private void update() {
282 updateElements();
283 space.update();
286 private void paint() {
287 space.paint(graphics);
288 paintElements(graphics);
289 paintGui();
290 flushGraphics();
293 public void updateElements() {
294 gamer.update();
295 bullet.update();
296 enemy.update();
297 explosion.update();
300 public void paintElements(Graphics graphics) {
301 enemy.paint(graphics);
302 gamer.paint(graphics);
303 bullet.paint(graphics);
304 explosion.paint(graphics);
307 private void paintGui() {
308 // up & down panel
309 for (int i = 0; i < screenW; i += 128) {
310 graphics.drawImage(upPanel, i, 0, 0);
311 graphics.drawImage(downPanel, i, screenH - 27, 0);
313 overheatStatus.paint(graphics);
314 lifeStatus.paint(graphics);
315 rightSoft.paint(graphics);
316 paintDate();
318 // score
319 font.paint(graphics, "Score: " + enemy.getScore(), 2, 2);
321 // life
322 graphics.setColor(0xBF0B10);
323 graphics.fillRect(4, screenH - 19, gamer.getLife(), 2);
324 graphics.setColor(0x001A27);
325 graphics.fillRect(4 + gamer.getLife(), screenH - 19, 1, 2);
327 // overheat
328 graphics.setColor(0xBFCA10);
329 graphics.fillRect(screenW - 52, screenH - 19, gamer.getOverheat(), 2);
330 graphics.setColor(0x001A27);
331 graphics.fillRect(screenW - 52 + gamer.getOverheat(), screenH - 19,
332 1, 2);
335 private void setPauseScreen() {
336 isPause = true;
337 LongFlight.link.setScreen(LongFlight.PAUSE);
340 private void saveRecord(RMS rms, int[] record) throws RecordStoreException {
341 final ByteArrayOutputStream byteWriter = new ByteArrayOutputStream(20);
342 byteWriter.writeIntArray(record, 5);
343 rms.put(2, byteWriter);