📄 engine.java~44~
字号:
package pinball;import javax.microedition.lcdui.*;public class Engine implements Runnable { public static final int PATTERN_WIDTH = 11; public final static int TITLE = 0; public final static int PLAY = 1; public final static int OVER = 2; public final static int DEMO = 3; private Ball ball; //弹球 private Brick board; //可移动的板子 private BrickList bricks; //砖块列表 private Screen screen; //屏幕 private int score; //得分 private int highscore; //最高分 private int level; //游戏级别 private int lives; //生命数 private int state; //游戏状态 private int key; //按键 private int timeintervel; //时间间隔 private boolean paused; //是否暂停 private long last_key_press; //最后一次按键的时间 private boolean level_started; //是否开始游戏 private boolean done; //游戏是否结束 private static final int LAST_KEY_DELTA = 7000; private static final int STD = Brick.STANDARD; private static final int FIX = Brick.FIXED; private static final int SLI = Brick.SLIDE; private static final int ZOM = Brick.ZOMBIE; private int[] title_pattern = { STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, FIX, FIX, FIX, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, FIX, FIX, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, }; private int[][] pattern_list = { { STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, }, { STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, ZOM, SLI, ZOM, }, { ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, FIX, SLI, FIX, FIX, FIX, FIX, FIX, SLI, FIX, ZOM, ZOM, FIX, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, FIX, ZOM, ZOM, FIX, ZOM, STD, STD, STD, STD, STD, ZOM, FIX, ZOM, ZOM, FIX, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, FIX, ZOM, ZOM, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, ZOM, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, }, { STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, STD, STD, STD, STD, STD, FIX, STD, STD, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, FIX, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD, STD } }; public Engine(Screen screen) { int i, n; long then; this.screen = screen; //绑定屏幕显示 screen.setEngine(this); //创建滑板 board = new Brick(null, Screen.width / 2 - Brick.WIDTH / 2, Screen.VDIVIDER - Brick.HEIGHT - 4, -1, 2); board.setColor(ThreeDColor.lightGray); board.width = Screen.width / 8; board.height = Brick.HEIGHT / 2; ball = new Ball(Screen.width / 2 - Brick.WIDTH / 4, board.y - 2 * Ball.RADIUS, 2 * Math.max(1, Screen.width / 80), 2 * -Math.max(1, Screen.width / 80)); level = 0; state = TITLE; done = false; bricks = new BrickList(title_pattern, PATTERN_WIDTH, -1); last_key_press = System.currentTimeMillis(); then = System.currentTimeMillis(); n = 0; for (i = 0; i < 30000; i++) { n++; } if (n > 0) { timeintervel = (int) (System.currentTimeMillis() - then); } Thread runner = new Thread(this); runner.start(); } /** * 重新开始游戏 */ private void reset() { level = 0; lives = 2; score = 0; startLevel(); } /** * 开始新的游戏级别 */ private void restartLevel() { if (state == PLAY) { paused = true; } synchronized (this) { level_started = true; } board.moveTo(Screen.width / 2 - Brick.WIDTH / 2, Screen.VDIVIDER - Brick.HEIGHT - 4); ball.moveTo(Screen.width / 2 - Brick.WIDTH / 4, board.y - 2 * Ball.RADIUS); ball.setSteps(Math.max(1, Screen.width / 80), -Math.max(1, Screen.width / 80)); screen.repaint(); screen.serviceRepaints(); } /** * 开始新一关游戏 */ private void startLevel() { bricks = new BrickList(pattern_list[level], PATTERN_WIDTH, level); restartLevel(); } /** * 过关 */ private void nextLevel() { level++; if (level == pattern_list.length) { level = 0; } startLevel(); } public void keyPressed(int key_code, int game_action) { key = game_action; last_key_press = System.currentTimeMillis(); if (key_code == Canvas.KEY_NUM0 || game_action == Canvas.GAME_A) { nextLevel(); return; } if (state == TITLE || state == OVER || state == DEMO) { state = PLAY; reset(); } else if (state == PLAY && (key == Canvas.LEFT || key == Canvas.RIGHT || key == Canvas.FIRE)) { paused = false; } } public void keyReleased(int key_code, int game_action) { key = 0; } public void getState(EngineState engineState) { engineState.bricks = bricks; engineState.ball = ball; engineState.board = board; engineState.state = state; engineState.score = score; engineState.highscore = highscore; engineState.lives = lives; } public synchronized boolean levelStarted() { boolean x = level_started; level_started = false; return x; } public void stop() { done = true; } public void run() { boolean recent_collision; long then; int px, pw, delta; int board_speed = 0; recent_collision = false; then = System.currentTimeMillis(); while (!done) { if ((state == TITLE || state == OVER) && System.currentTimeMillis() - last_key_press > LAST_KEY_DELTA) { state = DEMO; reset(); } px = board.x; pw = board.width; if (state == DEMO) { //演示状态 int ball_center = ball.x + Ball.RADIUS; int board_center = px + Brick.WIDTH / 2; int epsilon = pw / 4; if (ball_center >= px + epsilon && ball_center <= px + pw - epsilon) { key = 0; } else if (ball_center < board_center) { key = Canvas.LEFT; } else { key = Canvas.RIGHT; } } if ((state == PLAY || state == DEMO) &&!paused) { if (key == Canvas.LEFT) { board_speed = Math.min(-1, -Brick.STEP / (state == DEMO ? 3 : 1)); } else if (key == Canvas.RIGHT) { board_speed = Math.max(1, Brick.STEP / (state == DEMO ? 3 : 1)); } else { board_speed = 0; } if (board_speed < 0 && px > 0 || board_speed > 0 && px + pw < Screen.width) { board.moveBy(board_speed, 0); } ball.move(); if (ball.x <= 0 || ball.x >= Screen.width - ball.width - 1) { ball.bounceHorizontal(); } if (ball.y <= 0) { ball.bounceVertical(); } if (ball.intersects(board)) { if (!recent_collision) { ball.bounce(board); } recent_collision = true; } else { recent_collision = false; } score += bricks.checkForCollision(ball); if (state == PLAY && score >= highscore) { highscore = score; } if (bricks.isClean()) { nextLevel(); } if (ball.y >= board.y + board.height) { if (state == PLAY) { lives--; } if (lives < 0) { state = OVER; level = 0; } restartLevel(); } } screen.repaint(); delta = (int) (System.currentTimeMillis() - then); if (delta < 30 && timeintervel < 100) { try { Thread.sleep(30 - delta); } catch (InterruptedException e) {} } then = System.currentTimeMillis(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -