⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 engine.java~63~

📁 j2me源代码
💻 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 + -