package code.kalter.longflight.screen; import code.kalter.longflight.Arrays; import code.kalter.longflight.ByteArrayOutputStream; import code.kalter.longflight.EventListener; import code.kalter.longflight.Loader; import code.kalter.longflight.LongFlight; import code.kalter.longflight.Sprite; import code.kalter.longflight.game.Bullet; import code.kalter.longflight.game.Enemy; import code.kalter.longflight.game.Gamer; import code.kalter.longflight.game.bullet.Collisionable; import code.kalter.longflight.game.explosion.Explosion; import code.kalter.longflight.rms.RMS; import code.kalter.longflight.rms.RecordNotFoundException; import java.io.IOException; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.rms.RecordStoreException; /** * Игровой экран. Остаётся активным во время паузы и информации о уничтожении. В * меню паузы происходит отрисовка элементов (см. метод * paintElements), а в меню информации о уничтожении происходит и * отрисовка (см. метод updateElements), и обновление, но без * создания новых врагов * * @author KalterFive */ public class Game extends Screen { public static Game link; // keys private boolean up; private boolean down; private boolean left; private boolean right; private boolean fire; private boolean pointerPressed; private final Gamer gamer; private final Bullet bullet; private final Enemy enemy; private final Explosion explosion; private final Sprite rightSoft; private final Sprite lifeStatus; private final Sprite overheatStatus; private final Image downPanel; private final Image upPanel; private boolean isPause; // для проверки на переход в меню паузы public Game() throws IOException { explosion = Explosion.createExplosion("/gfx/boom.png"); bullet = new Bullet(screenH); gamer = new Gamer(screenW, screenH, bullet, explosion); enemy = new Enemy(screenW, screenH, bullet, explosion, gamer); bullet.setCollisionable(new Collisionable[]{gamer, enemy}); Loader loader = Loader.getInstance(); // right soft Image rightSoftImage = loader.getImage("/gfx/game/right_soft.png"); int rightSoftX = screenW - rightSoftImage.getWidth(); int rightSoftY = screenH - rightSoftImage.getHeight(); rightSoft = new Sprite(rightSoftImage, rightSoftX, rightSoftY); rightSoft.addEvent(new EventListener() { // override public boolean is() { return rightSoft.isEntrySet(getXPressed(), getYPressed()); } // override public void event() { rightSoftPressed(); } }); // life status Image lifeStatusImage = loader.getImage("/gfx/game/life.png"); int lifeStatusX = 2; int lifeStatusY = screenH - 20; lifeStatus = new Sprite(lifeStatusImage, lifeStatusX, lifeStatusY); // overheat status Image overheatStatusImage = loader.getImage("/gfx/game/overheat.png"); int overheatStatusX = screenW - overheatStatusImage.getWidth() - 2; int overheatStatusY = screenH - 20; overheatStatus = new Sprite(overheatStatusImage, overheatStatusX, overheatStatusY); // up & down panel downPanel = loader.getImage("/gfx/game/down_panel.png"); upPanel = loader.getImage("/gfx/game/up_panel.png"); link = this; } // override public void start() { try { up = down = right = left = fire = pointerPressed = false; enemy.activateCreator(); if (isPause) { isPause = false; return; } explosion.deactivateAll(); gamer.setNull(); bullet.setNull(); enemy.setNull(); setDate(2, screenH - 9); } catch (Exception e) { LongFlight.link.catchException(e); } finally { isPause = false; super.start(); } } // override public void run() { while (getGameLoop()) { fps.process(); paint(); checkKey(); update(); LongFlight.link.sleep(20); fps.max(); } if (isPause) { return; } LongFlight.link.$setScreen(LongFlight.CRASH); } // override public void keyPressed(int keyCode) { switch (keyCode) { case RIGHT_SOFT: setPauseScreen(); break; } switch (getGameAction(keyCode)) { case UP: up = true; break; case DOWN: down = true; break; case LEFT: left = true; break; case RIGHT: right = true; break; case FIRE: fire = true; break; } } // override public void keyReleased(int keyCode) { switch (getGameAction(keyCode)) { case UP: up = false; break; case DOWN: down = false; break; case LEFT: left = false; break; case RIGHT: right = false; break; case FIRE: fire = false; break; } } // override public void pointerReleased(int x, int y) { pointerPressed = false; } // override public void pointerPressed(int x, int y) { super.pointerPressed(x, y); rightSoft.exciteEvent(); pointerPressed = true; } // override public void stop() { enemy.deactivateCreator(); super.stop(); } public Explosion getExplosion() { return explosion; } public void setNullPause() { isPause = false; } public void save() { final int score = enemy.getScore(); try { final RMS rms = new RMS("longflight", true); try { final int[] record = rms.get(2).toIntArray(5); for (int i = 0; i < 5; i++) { if (score > record[i]) { Arrays.insertShiftRight(record, score, i); break; } } saveRecord(rms, record); } catch (RecordNotFoundException e) { saveRecord(rms, new int[]{score, 0, 0, 0, 0}); } rms.close(); } catch (RecordStoreException e) { LongFlight.link.catchException(e); } } private void rightSoftPressed() { setPauseScreen(); } private void checkKey() { if (pointerPressed) { if (isPointerUp()) { gamer.moveUp(); } if (isPointerDown()) { gamer.moveDown(); } if (isPointerLeft()) { gamer.moveLeft(); } if (isPointerRight()) { gamer.moveRight(); } if (isPointerFire()) { gamer.fire(); } } if (up) { gamer.moveUp(); } if (down) { gamer.moveDown(); } if (left) { gamer.moveLeft(); } if (right) { gamer.moveRight(); } if (fire) { gamer.fire(); } } private void update() { updateElements(); space.update(); } private void paint() { space.paint(graphics); paintElements(graphics); paintGui(); flushGraphics(); } public void updateElements() { gamer.update(); bullet.update(); enemy.update(); explosion.update(); } public void paintElements(Graphics graphics) { enemy.paint(graphics); gamer.paint(graphics); bullet.paint(graphics); explosion.paint(graphics); } private void paintGui() { // up & down panel for (int i = 0; i < screenW; i += 128) { graphics.drawImage(upPanel, i, 0, 0); graphics.drawImage(downPanel, i, screenH - 27, 0); } overheatStatus.paint(graphics); lifeStatus.paint(graphics); rightSoft.paint(graphics); paintDate(); // score font.paint(graphics, "Score: " + enemy.getScore(), 2, 2); // life graphics.setColor(0xBF0B10); graphics.fillRect(4, screenH - 19, gamer.getLife(), 2); graphics.setColor(0x001A27); graphics.fillRect(4 + gamer.getLife(), screenH - 19, 1, 2); // overheat graphics.setColor(0xBFCA10); graphics.fillRect(screenW - 52, screenH - 19, gamer.getOverheat(), 2); graphics.setColor(0x001A27); graphics.fillRect(screenW - 52 + gamer.getOverheat(), screenH - 19, 1, 2); } private void setPauseScreen() { isPause = true; LongFlight.link.setScreen(LongFlight.PAUSE); } private void saveRecord(RMS rms, int[] record) throws RecordStoreException { final ByteArrayOutputStream byteWriter = new ByteArrayOutputStream(20); byteWriter.writeIntArray(record, 5); rms.put(2, byteWriter); } }