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