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

📄 boxgame.java

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

/**
 * 该类描述了游戏,提供了对方向键的处理功能。
 */
public class BoxGame extends GameCanvas implements Runnable {
    private LayerManager manager;   //游戏界面管理器
    private Plat plat;              //游戏地图
    private Storage storage;        //仓库
    private Worker worker;          //搬运工
    
    private int level;              //游戏关
    private Graphics g;             //绘图对象
    private int screenWidth;        //屏幕宽度  
    private int screenHeight;       //屏幕高度
    private int viewX;      //仓库可视区域的位置
    private int viewY;
    
    private boolean stop = true;    //
    private Thread workerThread;    //搬运工移动线程 
    private boolean workerMove = false;
    private int stepNumber = 0;     //搬运工每次移动的步数
    
    //构造方法,创建游戏对象
    public BoxGame() {
        super(false);
        g = getGraphics();
        screenWidth = getWidth();
        screenHeight = getHeight();
        manager = new LayerManager();
        plat = new Plat();
        try {   //加载图片,创建搬运工
            Image workerImage = Image.createImage("/img/worker16.png");
            worker = new Worker(workerImage, Storage.CELL_WIDTH, Storage.CELL_HEIGHT, 
                            new int[][]{{3, 4, 5},{6, 7, 8},{9, 10, 11},{0, 1, 2}});
        }
        catch(IOException ioe) {
            System.out.println("error: " + ioe.toString());
        }
        manager.append(worker);
        
        //创建仓库
        storage = new Storage(screenWidth/Storage.CELL_WIDTH, screenHeight/Storage.CELL_HEIGHT-2, manager);
        worker.comeInto(storage);
        level = 0;
        stepNumber = Storage.CELL_WIDTH/Worker.DISTANCE;
    }
    
    //进入游戏下一关,如果i>0,进入后面的i关游戏;如果i<0,进入前面的i关游戏
    public void nextLevel(int i) {
        level += i;
        level = plat.readLevel(level);      //读取level关的数据
        storage.update(plat);       //使用plat更新仓库
        
        //设置搬运工的初始状态
        worker.setPosition(storage.getWorkerInitX(), storage.getWorkerInitY());
        worker.updateBoxes();
        
        //设置仓库居中显示
        viewX = (screenWidth - storage.getViewWidth())/2;
        viewY = (screenHeight - storage.getViewHeight())/2;
        
        //清除以前屏幕显示内容
        g.setColor(0x0000FFFF);
        g.fillRect(0, 0, screenWidth, screenHeight);
        
        //更新屏幕
        updateGUI();
    }
    
    //游戏显示前,系统将调用该方法:初始化游戏
    protected void showNotify() {
        nextLevel(0);
        stop = false;
        workerThread = new Thread(this);
        workerThread.start();
    }
    
    //游戏被从屏幕上移走后,系统马上调用该方法。
    protected void hideNotify() {
        stop = true;
    }
    
    //重新开始当前的游戏
    public void restart() {
        //设置箱子为初始状态
        storage.setBoxesInit();     
        
        //设置搬运工到初始位置
        worker.setPosition(storage.getWorkerInitX(), storage.getWorkerInitY());
        updateGUI();
    }
    
    //键盘事件处理方法
    protected void keyReleased(int keyCode) {
        synchronized(worker) {
            workerMove = true;
            worker.notifyAll(); //通知搬运工移动
        }
    }
    
    //更新游戏界面
    public void updateGUI() {
        manager.paint(g, viewX, viewY);
        flushGraphics();
    }
    
    //搬运工移动线程的执行体
    public void run() {
        int direction = -2000;
        int keyState = 0;
        while(!stop) {
            synchronized(worker) {
                if(!workerMove) {   //如果搬运工不能移动,线程等待
                    try {
                        worker.wait();  
                    }
                    catch(InterruptedException ie) {
                        System.out.println("等待错误!");
                    }
                }
                
                direction = -2000;
                keyState = getKeyStates();  //获取按键状态
                if ((keyState & LEFT_PRESSED) != 0) {
                    direction = Worker.WEST;
                }
                else if ((keyState & RIGHT_PRESSED) != 0) {
                    direction = Worker.EAST;
                }
                else if ((keyState & UP_PRESSED) != 0) {
                    direction = Worker.NORTH;
                }
                else if ((keyState & DOWN_PRESSED) != 0) {
                    direction = Worker.SOUTH;
                }
                
                if(direction != -2000) {
                    for(int i=0; i<stepNumber; i++) {   //搬运工移动
                        worker.move(direction);
                        updateGUI();
                        try {
                            Thread.sleep(60);
                        }
                        catch(InterruptedException ie) {
                            System.out.println("intrruptedException " + ie.toString());
                        }
                    }
                }
                workerMove = false;
            }
        }
    }
}

⌨️ 快捷键说明

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