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

📄 gamecanvasdemo.java

📁 人民邮电出版社的《J2ME手机开发入门》全部源代码
💻 JAVA
字号:
/*
 * GameCanvasDemo.java
 *
 * Created on 2005年5月2日, 下午12:14
 */

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

/**
 *
 * @author  Liu Bin
 * @version
 */
public class GameCanvasDemo extends MIDlet  implements CommandListener {
    Display display = null;
    private Command cmdExit = new Command("Exit", Command.STOP, 1);
    
    private GameFrameCanvas can = null;
    
    public GameCanvasDemo() {
        display = Display.getDisplay(this);
        can = new GameFrameCanvas(false);
        can.addCommand(cmdExit);
        can.setCommandListener(this);
    }
    
    public void startApp() throws MIDletStateChangeException {
        display.setCurrent(can);
        can.startgame();
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        can.gameover();
    }
    
    /**
     * 命令按钮事件
     */
    public void commandAction(Command c, Displayable d) {
        if (c == cmdExit) {
            notifyDestroyed();
        }
    }
}

class GameFrameCanvas extends GameCanvas implements Runnable{
    //游戏结束标志
    private boolean gameover = false;
    
    //游戏背景图像
    private Image imgMissile, imgBG;
    //后台缓冲屏幕宽和高
    private int canW, canH;
    //导弹图像的宽,高,宽度的一半和高度的一半
    private int imgW, imgH, imgHalfW, imgHalfH;
    
    //导弹的移动方向,缺省为向右
    private int direction = RIGHT;
    //导弹的移动速度,缺省值为1
    private int speed = 1;
    //导弹的当前位置
    private int curX,curY;
    
    public GameFrameCanvas(boolean suppressKeyEvents) {
        super(suppressKeyEvents);
        
        //装载游戏图像
        try {
            imgMissile = Image.createImage("/Res/Missile.png");
            out("装载导弹图像...成功");
            imgBG = Image.createImage("/Res/BG.png");
            out("装载背景图像...成功");
        } catch (Exception e) {
            out("装载游戏图像异常:" + e.toString());
        }
        
        //计算游戏中使用的一些值
        canW =  getWidth();
        canH = getHeight();
        out("画布的宽度:" + canW);
        out("画布的高度:" + canH);
        imgW = imgMissile.getWidth();
        imgH = imgMissile.getHeight();
        imgHalfW = imgW / 2;
        imgHalfH = imgH / 2;
        curX = canW/2;
        curY = canH/2;
    }
    
    //清除屏幕
    private void clearScreen(Graphics g) {
        g.setColor(0xFFFFFF);
        g.fillRect(0, 0, canW, canH);
        g.setColor(0x000000);
        //绘制背景图像
        if (imgBG != null) {
            g.drawImage(imgBG, 0, 0, Graphics.TOP | Graphics.LEFT);
        }
    }
    
    //当用户按下0-9键时调整火箭的运行速度
    protected void keyReleased(int keyCode) {
        //有些手机实现中数字键2,4,6,8可能会被映射为up, left, right and down键,
        //因此这里通过键值调整运行速度
        if (keyCode >= KEY_NUM1 && keyCode <= KEY_NUM9) {
            speed = (keyCode - KEY_NUM0)*5;
            out("游戏速度调整为:" + speed);
        }
    }
    
    //输出调试信息
    private void out(String msg) {
        System.out.println(msg);
    }
    
    public void run() {
        //获得后台缓冲屏幕
        Graphics g = getGraphics();
        
        while (!gameover) {
            clearScreen(g);
            
            //根据按钮移动导弹
            int keyState = getKeyStates();
            if ((keyState & LEFT_PRESSED) != 0) {
                direction = LEFT;
                move(-speed, 0);
            } else if ((keyState & RIGHT_PRESSED) != 0) {
                direction = RIGHT;
                move(speed, 0);
            } else if ((keyState & UP_PRESSED) != 0) {
                direction = UP;
                move(0, -speed);
            } else if ((keyState & DOWN_PRESSED) != 0) {
                direction = DOWN;
                move(0, speed);
            }
            
            //绘制游戏屏幕
            gameRender(g);
            
            //如果有精灵,这里绘制精灵
            //sprite.paint(g);
            
            //绘制后台缓冲屏幕
            flushGraphics();
            
            try {
                Thread.sleep(100); //暂停一段时间
            } catch(InterruptedException ex){
            }
        }
    }
    
    //移动导弹
    private void move(int dx, int dy) {
        curX += dx;
        curY += dy;
    }
    
    private void gameRender(Graphics g) {
        int x=0,y =0;
        int transform = Sprite.TRANS_NONE;
        
        //绘制不同方向的导弹
        if (imgMissile != null) {
            switch (direction) {
                case LEFT: {
                    x = curX - imgHalfW;
                    y = curY - imgHalfH;
                    transform = Sprite.TRANS_ROT180;
                    break;
                }
                case RIGHT: {
                    transform = Sprite.TRANS_NONE;
                    x = curX - imgHalfW;
                    y = curY - imgHalfH;
                    break;
                }
                case UP: {
                    transform = Sprite.TRANS_ROT270;
                    x = curX - imgHalfH;
                    y = curY - imgHalfW;
                    break;
                }
                case DOWN: {
                    transform = Sprite.TRANS_ROT90;
                    x = curX - imgHalfH;
                    y = curY - imgHalfW;
                    break;
                }
            }
            g.drawRegion(imgMissile, 0, 0, imgW, imgH, transform,
                    x, y, Graphics.TOP | Graphics.LEFT);
        }
    }
    
    //结束游戏
    public void gameover() {
        gameover = true;
    }
    
    //开始游戏
    public void startgame() {
        //初始化...
        gameover = false;
        //开始游戏线程
        new Thread(this).start();
    }
}

⌨️ 快捷键说明

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