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

📄 russiacanvas.java

📁 J2ME程序设计实例教程的源码
💻 JAVA
字号:
import javax.microedition.lcdui.*;

public class RussiaCanvas extends KeyCanvas implements MicroKeyListener, Runnable {
    //
    private RussiaMIDlet midlet;
    private Board board;
    private int boardX;
    private int boardY;
    private int width;
    private int height;
    private int cell = 12;
    
    private int blackGroundColor = 0x00000000;  //背景颜色
    private int boardRimColor = 0x00ffffff;     //边框颜色
    private int blockColor = 0x0000ffff;        //方块颜色
    
    private Thread gameThread = null;
    private boolean pause = false;
    private boolean dead = true;
    private int delay = 300;
    
    public RussiaCanvas(RussiaMIDlet midlet) {
        this.midlet = midlet;
        int bw = getWidth()/cell - 4;
        int bh = getHeight()/cell - 2;
        board = new Board(bw, bh);  //创建游戏区域
        
        //计算游戏区域的大小和位置,以像素为单位
        width = bw*cell+2;
        height = bh*cell+2;
        boardX = (getWidth()-width)/2;
        boardY = (getHeight()-height)/2;
        
        setMicroKeyListener(this);
    }
    
    //绘制游戏界面
    protected void paint(Graphics g) {
        //绘制背景
        g.setColor(blackGroundColor);
        g.fillRect(0, 0, getWidth(), getHeight());
        
        //绘制边框
        g.setColor(boardRimColor);
        g.drawRect(boardX, boardY, width, height);
        
        //绘制背景方块
        g.setColor(blockColor);
        int w = width/cell;
        int h = height/cell;
        g.translate(boardX+2, boardY+2);
        for(int i=0; i<w; i++) {
            for(int j=0; j<h; j++) {
                if(board.getValue(i, j) != 0) {
                    g.fillRect(i*cell, j*cell, cell-1, cell-1);
                }
            }
        }
        
        if(!dead) {
            //绘制当前操作的方块图形
            int[] block = board.getCurrentBlock();
            int x = 0;
            int y = 0;
            for(int i=0; i<block.length; i++) {
                x = board.getX(block[i]);
                y = board.getY(block[i]);
                g.fillRect(x*cell, y*cell, cell-1, cell-1);
            }
            
            if(pause) {
                showInfo(g, "游戏暂停!!");
            }
        }
        else {
            midlet.setStartMenu();
            showInfo(g, "开始新游戏!");
        }
        
    }
    
    private void showInfo(Graphics g, String info) {
        g.setColor(128, 255, 255);
        int ww = width-4*cell;
        int hh = ww/2;
        int xx = (width-ww)/2;
        int yy = (height-hh)/2;
        g.fillRect(xx, yy, ww, hh);
        g.setColor(0x00FF0000);
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE));
        g.drawString(info, width/2, height/2, Graphics.HCENTER|Graphics.BASELINE);
    }
    
    //键盘事件处理方法,如果持续按键,该方法将重复被调用
    public void microKeyRepeated(int keyCode) {
        microKeyPressed(keyCode);
    }
    
    ////键盘事件处理方法,如果按下键,该方法将被调用
    public void microKeyPressed(int keyCode) {
        int gameAction = getGameAction(keyCode);
        synchronized(board)
        {
            if(gameAction == Canvas.DOWN) {
                board.down();
            }
            else if(gameAction == Canvas.LEFT) {
                board.left();
            }
            else if(gameAction == Canvas.RIGHT) {
                board.right();
            }
            else if(gameAction == Canvas.FIRE || gameAction == Canvas.UP) {
                board.circumrotate();
            }
            repaint();
        }
        
    }
    
    public void microKeyReleased(int keyCode) {
        //
    }
    
    //开始游戏
    public void start() {
        if(board.gameOver()) {
            dead = false;
            board.init();
        }
        if(gameThread == null || !gameThread.isAlive()) {
            gameThread = new Thread(this);
            gameThread.start();
        }
        synchronized(this) {
            pause = false;
            notifyAll();
        }
    }
    
    //暂停游戏
    public void pause() {
        synchronized(this) {
            pause = true;
        }
        repaint();
    }
    
    //游戏线程执行体
    public void run() {
        while(!dead) {
            try {
                synchronized(this) {
                    while(pause) {
                        wait();
                    }
                }
                
                while(!dead && !pause) {
                    synchronized(board) {
                        board.down();
                        board.clear();
                        if(board.gameOver()) {
                            dead = true;
                        }
                        repaint();
                    }
                    Thread.sleep(delay);
                }
            }
            catch(InterruptedException ie) {
                //
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -