📄 engine.java~63~
字号:
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 nScore; //得分 private int nHighScore; //最高分 private int nLevel; //游戏级别 private int nLives; //生命数 private int nState; //游戏状态 private int nKey; //按键 private int nTimeIntervel; //时间间隔 private boolean bPaused; //是否暂停 private long nLastKeyPressed; //最后一次按键的时间 private boolean bStarted; //是否开始游戏 private boolean bDone; //游戏是否结束 private static final int KEY_DELTA = 10000; //无按键消息的时间间隔 private static final int ST = Brick.STANDARD; private static final int FX = Brick.FIXED; private static final int SL = Brick.SLIDE; private static final int ZM = Brick.ZOMBIE; private int[] patTitle = { ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, FX, FX, FX, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, FX, FX, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, }; private int[][] patList = { { ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, }, { ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, ZM, SL, ZM, }, { ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, FX, SL, FX, FX, FX, FX, FX, SL, FX, ZM, ZM, FX, ZM, ZM, ZM, ZM, ZM, ZM, ZM, FX, ZM, ZM, FX, ZM, ST, ST, ST, ST, ST, ZM, FX, ZM, ZM, FX, ZM, ZM, ZM, ZM, ZM, ZM, ZM, FX, ZM, ZM, FX, FX, FX, FX, FX, FX, FX, FX, FX, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ZM, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, }, { ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, FX, FX, FX, FX, FX, FX, FX, FX, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, ST, ST, ST, ST, ST, FX, ST, ST, FX, FX, FX, FX, FX, FX, FX, FX, FX, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST } }; 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)); nLevel = 0; nState = TITLE; bDone = false; bricks = new BrickList(patTitle, PATTERN_WIDTH, -1); nLastKeyPressed = System.currentTimeMillis(); then = System.currentTimeMillis(); n = 0; for (i = 0; i < 30000; i++) { n++; } if (n > 0) { nTimeIntervel = (int) (System.currentTimeMillis() - then); } Thread runner = new Thread(this); runner.start(); } /** * 重新开始游戏 */ private void reset() { nLevel = 0; nLives = 2; nScore = 0; startLevel(); } /** * 开始新的游戏级别 */ private void restartLevel() { if (nState == PLAY) { bPaused = true; } synchronized (this) { bStarted = 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(patList[nLevel], PATTERN_WIDTH, nLevel); restartLevel(); } /** * 过关 */ private void nextLevel() { nLevel++; if (nLevel == patList.length) nLevel = 0; startLevel(); } /** * 响应按键消息 */ public void keyPressed(int key_code, int game_action) { nKey = game_action; nLastKeyPressed = System.currentTimeMillis(); if (key_code == Canvas.KEY_NUM0 || game_action == Canvas.GAME_A) { nextLevel(); return; } if (nState == TITLE || nState == OVER || nState == DEMO) { nState = PLAY; reset(); } else if (nState == PLAY && (nKey == Canvas.LEFT || nKey == Canvas.RIGHT || nKey == Canvas.FIRE)) { bPaused = false; } } public void keyReleased(int key_code, int game_action) { nKey = 0; } /** * 获取状态信息 */ public void getState(EngineState engineState) { engineState.bricks = bricks; engineState.ball = ball; engineState.board = board; engineState.state = nState; engineState.score = nScore; engineState.highscore = nHighScore; engineState.lives = nLives; } public synchronized boolean levelStarted() { boolean x = bStarted; bStarted = false; return x; } public void stop() { bDone = true; } public void run() { boolean bCollision; long then; int px, pw, delta; int board_speed = 0; bCollision = false; then = System.currentTimeMillis(); while (!bDone) { if ((nState == TITLE || nState == OVER) && System.currentTimeMillis() - nLastKeyPressed > KEY_DELTA) { nState = DEMO; reset(); } px = board.x; pw = board.width; if (nState == 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) { nKey = 0; } else if (ball_center < board_center) { nKey = Canvas.LEFT; } else { nKey = Canvas.RIGHT; } } if ((nState == PLAY || nState == DEMO) &&!bPaused) { if (nKey == Canvas.LEFT) { board_speed = Math.min(-1, -Brick.STEP / (nState == DEMO ? 3 : 1)); } else if (nKey == Canvas.RIGHT) { board_speed = Math.max(1, Brick.STEP / (nState == 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 (!bCollision) { ball.bounce(board); } bCollision = true; } else { bCollision = false; } nScore += bricks.checkForCollision(ball); if (nState == PLAY && nScore >= nHighScore) { nHighScore = nScore; } if (bricks.isClean()) { //判断砖块是否全部被清除完毕 nextLevel(); } if (ball.y >= board.y + board.height) { //判断小球是否落地 if (nState == PLAY) { nLives--; } if (nLives < 0) { //判断游戏是否结束 nState = OVER; nLevel = 0; } restartLevel(); } } screen.repaint(); //重新绘制屏幕 delta = (int) (System.currentTimeMillis() - then); //计算时间间隔 if (delta < 30 && nTimeIntervel < 100) { try { Thread.sleep(30 - delta); } catch (InterruptedException e) {} } then = System.currentTimeMillis(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -