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

📄 collisioncanvas.java

📁 J2ME学习的好例子
💻 JAVA
字号:
/*--------------------------------------------------
 * CollisionCanvas.java
 *-------------------------------------------------*/
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;

public class CollisionCanvas extends GameCanvas implements Runnable {
    private AnimatedSprite spSpiral; // 动画精灵

    private static final int FRAME_WIDTH = 64; // 一帧画面的宽度

    private static final int FRAME_HEIGHT = 64; // 一帧画面的高度

    private int canvas_width, canvas_height; // 保存画布信息

    private ManSprite spMan; // 小人 (可移动)

    private AppleSprite spApple; // 苹果 (不可移动)

    private CubeSprite spCube; // 立方体 (不可移动)

    private StarSprite spStar; // 星星 (不可移动)

    private LayerManager lmgr; // 图层管理器

    private boolean running = false; // 线程是否运行?

    private Collisions midlet; // 主MIDlet

    public CollisionCanvas(Collisions midlet) {
        // 构造函数
        super(true);
        this.midlet = midlet;
        try {
            // 非动画精灵
            spMan = new ManSprite(Image.createImage("/man.png"));
            spApple = new AppleSprite(Image.createImage("/apple.png"));
            spCube = new CubeSprite(Image.createImage("/cube.png"));
            spStar = new StarSprite(Image.createImage("/star.png"));
            // 动画精灵
            spSpiral = new AnimatedSprite(Image.createImage("/png-0016.png"),
                    FRAME_WIDTH, FRAME_HEIGHT);
            // 将参考像素改到精灵的中心
            spSpiral.defineReferencePixel(FRAME_WIDTH/2, FRAME_HEIGHT/2);
            // 将精灵放置在画布中心
            // (精灵中心和画布中心重合)
            spSpiral.setRefPixelPosition(getWidth()/2, getHeight()/2);
            // 创建并添加到图层管理器
            lmgr = new LayerManager();
            lmgr.append(spSpiral);
            lmgr.append(spMan);
            lmgr.append(spApple);
            lmgr.append(spCube);
            lmgr.append(spStar);
        } catch (Exception e) {
            System.out.println("Unable to read PNG image");
        }
        // 保存画布的宽度和高度
        canvas_width = getWidth();
        canvas_height = getHeight();
    } 
    
    /**//*--------------------------------------------------
     * 启动线程
     *-------------------------------------------------*/
    public void start() {
        running = true;
        Thread t = new Thread(this);
        t.start();
    }

    /**//*--------------------------------------------------
     * Main game loop
     *-------------------------------------------------*/
    public void run() {
        Graphics g = getGraphics();
        while (running) {
            // 探测有没有键被按下
            checkForKeys();
            if (checkForCollision() == false) {
                drawDisplay(g);
            } else {
                // 背光灯闪烁,设备震动
                midlet.display.flashBacklight(500);
                midlet.display.vibrate(500);
            }
            try {
                Thread.sleep(125);
            } catch (InterruptedException ie) {
                System.out.println("Thread exception");
            }
        }
    }

    /**//*--------------------------------------------------
     * 检测有没有发生碰撞.
     *-------------------------------------------------*/
    private boolean checkForCollision() {
        if (spMan.collidesWith(spSpiral, true)
                || spMan.collidesWith(spApple, true)
                || spMan.collidesWith(spCube, true)
                || spMan.collidesWith(spStar, true)) {
            // 发生碰撞,恢复到上一个位置
            spMan.restoreXY();
            return true;
        } else
            return false;
    }

    /**//*--------------------------------------------------
     * 有键按下,移动精灵
     *-------------------------------------------------*/
    private void checkForKeys() {
        int keyState = getKeyStates();
        if ((keyState & LEFT_PRESSED) != 0) {
            spMan.moveLeft();
        } else if ((keyState & RIGHT_PRESSED) != 0) {
            spMan.moveRight(canvas_width);
        } else if ((keyState & UP_PRESSED) != 0) {
            spMan.moveUp();
        } else if ((keyState & DOWN_PRESSED) != 0) {
            spMan.moveDown(canvas_height);
        }
    }

    /**//*--------------------------------------------------
     * 刷新屏幕
     *-------------------------------------------------*/
    private void drawDisplay(Graphics g) {
        // 创建背景
        g.setColor(0xffffff);
        g.fillRect(0, 0, getWidth(), getHeight());
        // 动画精灵,按次序显示下一帧
        spSpiral.nextFrame();
        // 绘制所有图层
        lmgr.paint(g, 0, 0);
        // 将屏幕缓冲刷新到屏幕
        flushGraphics();
    }

    /**//*--------------------------------------------------
     * 停止线程
     *-------------------------------------------------*/
    public void stop() {
        running = false;
    }
}

⌨️ 快捷键说明

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