Доброго времени суток! Не так давно написал мидлет «Змейка» (по мотивам моей любимой игры детства  ). Получилось довольно забавно – с учетом некоторых модификаций, может, попозже выложу. Однако, перед выкладыванием хочу кое-что доработать. В частности, змейка по экрану ползает у меня в отдельном потоке. При нажатии на кнопку “pause” этот поток завершается, а после возобновления игры запускается уже новый поток. А мне бы хотелось, чтобы запускался только один поток движения змейки, который бы корректно приостанавливался и возобновлялся. Я пытался так сделать, но максимум, чего я добился, это IllegalMonitorStateException’a. Был бы очень благодарен за помощь в этом вопросе! Спасибо! P. S. Код игры (только основное) выкладываю и прилагаю в архиве. Мидлет: | Код | import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class SnakeMidlet extends MIDlet {
private Display display = Display.getDisplay(this); private Game game;
public void startApp() { game = new Game(this); display.setCurrent(game); } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } }
|
Холст | Код | import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*;
public class Game extends Canvas implements CommandListener { public final int width = getWidth(), height = getHeight(); private static Command exit = new Command("Exit", Command.EXIT, 0); private static Command pause = new Command("Pause", Command.SCREEN, 1); private MIDlet p; private int direction; private boolean end, paused; private Snake snake; private Stack body; public Game(MIDlet p) { this.p = p; addCommand(exit); addCommand(pause); snake = new Snake(height); body = snake.getBody(); new Thread(snakeDrawer).start(); setCommandListener(this); }
public void paint(Graphics g) { g.setColor(255, 255, 0); g.fillRect(0, 0, width, height); for (int i = 0; i < body.size(); i++) { Snake.Part part = (Snake.Part)body.elementAt(i); g.drawImage(part.getPartImage(), part.getX(), part.getY(), Graphics.VCENTER | Graphics.HCENTER); } }
public void commandAction(Command cmd, Displayable d) { if (cmd == pause) { paused = true; } else if (cmd == exit) { end = true; p.notifyDestroyed(); } }
protected void keyPressed(int keyCode) { if (!end) { direction = getGameAction(keyCode); if (paused) { new Thread(snakeDrawer).start(); } paused = false; } } private Runnable snakeDrawer = new Runnable() { public void run() { while (!end && !paused) { snake.move(direction, width, height); repaint(); try { Thread.sleep(360); } catch (InterruptedException zxz) {} } } }; }
|
Змейка с внутренним классом - частью змейки | Код | import javax.microedition.lcdui.*; import java.io.*; import java.util.*;
public class Snake { private Image partImage; private int partSize; private Stack body = new Stack();
public Snake(int height) { try { partImage = Image.createImage("/Body.png"); } catch (IOException e) {} partSize = partImage.getWidth() - 1; body.addElement(new Part(partSize * 2, height - partSize * 3)); body.addElement(new Part(partSize * 3, height - partSize * 3)); body.addElement(new Part(partSize * 4, height - partSize * 3)); }
public Stack getBody() { return body; } public class Part { private int x, y; Part(int x, int y) { this.x = x; this.y = y; }
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; } public int getX() { return x; }
public int getY() { return y; } public Image getPartImage() { return partImage; } } public Part move(int direction, int width, int height) { Part last = (Part)body.lastElement(); Part pp = last; switch (direction) { case Game.UP: if (last.y <= partSize / 2) { pp = new Part(last.x, height - partSize / 2); } else { pp = new Part(last.x, last.y - partSize); }
body.removeElementAt(0); body.addElement(pp); break; case Game.RIGHT: if (last.x >= width - partSize / 2) { pp = new Part(partSize / 2, last.y); } else { pp = new Part(last.x + partSize, last.y); }
body.removeElementAt(0); body.addElement(pp); break; case Game.DOWN: if (last.y >= height - partSize / 2) { pp = new Part(last.x, partSize / 2); } else { pp = new Part(last.x, last.y + partSize); }
body.removeElementAt(0); body.addElement(pp); break; case Game.LEFT: if (last.x <= partSize / 2) { pp = new Part(width - partSize / 2, last.y); } else { pp = new Part(last.x - partSize, last.y); }
body.removeElementAt(0); body.addElement(pp); break; } return pp; } }
|
Добавлено через 44 секундыПардон, не приложился код!
Присоединённый файл ( Кол-во скачиваний: 16 )
src.zip 2,54 Kb
--------------------
В действительности всё совсем не так, как на самом деле
|