📄 collisioncanvas.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 + -