?? spritedemo.java
字號:
/*
* SpriteDemo.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 SpriteDemo extends MIDlet implements CommandListener {
Display display = null;
private Command cmdExit = new Command("Exit", Command.STOP, 1);
private SpriteDemoCanvas can = null;
public SpriteDemo() {
display = Display.getDisplay(this);
can = new SpriteDemoCanvas(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 SpriteDemoCanvas extends GameCanvas implements Runnable{
//游戲結(jié)束標(biāo)志
private boolean gameover = false;
//龍的死亡標(biāo)志
private boolean dead = false;
//定義動畫的dragon和非動畫的missile精靈
private Sprite dragon, missile;
//游戲背景圖像
private Image imgMissile, imgBG;
//后臺緩沖屏幕寬和高
private int canW, canH;
//導(dǎo)彈的移動方向,缺省為向右
private int direction = RIGHT;
//導(dǎo)彈的移動速度,缺省值為10
private int speed = 10;
//幀的寬度和高度
private static final int DRAGON_FRAME_WIDTH = 48;
private static final int DRAGON_FRAME_HEIGHT = 48;
//動畫順序
int[] dragonAnimationSequence = {2,3,4,5,3,4,5,4};
public SpriteDemoCanvas(boolean suppressKeyEvents) {
super(suppressKeyEvents);
//計算游戲中使用的一些值
canW = getWidth();
canH = getHeight();
out("畫布的寬度:" + canW);
out("畫布的高度:" + canH);
//裝載游戲圖像
try {
missile = new Sprite(
Image.createImage("/Res/Missile.png"));
missile.setPosition(canW/2, canH/2);
out("裝載導(dǎo)彈圖像...成功");
dragon = new Sprite(
Image.createImage("/Res/dragon.png"),
DRAGON_FRAME_WIDTH,
DRAGON_FRAME_HEIGHT);
dragon.setFrameSequence(dragonAnimationSequence);
out("裝載背景圖像...成功");
imgBG = Image.createImage("/Res/BG.png");
out("裝載背景圖像...成功");
} catch (Exception e) {
out("裝載游戲圖像異常:" + e.toString());
}
}
//清除屏幕
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);
}
}
//當(dāng)用戶按下0-9鍵時調(diào)整火箭的運行速度
protected void keyReleased(int keyCode) {
//有些手機實現(xiàn)中數(shù)字鍵2,4,6,8可能會被映射為up, left, right and down鍵,
//因此這里通過鍵值調(diào)整運行速度
if (keyCode >= KEY_NUM1 && keyCode <= KEY_NUM9) {
speed = (keyCode - KEY_NUM0)*5;
out("游戲速度調(diào)整為:" + speed);
}
}
//輸出調(diào)試信息
private void out(String msg) {
System.out.println(msg);
}
public void run() {
//獲得后臺緩沖屏幕
Graphics g = getGraphics();
while (!gameover) {
clearScreen(g);
if (!dead) {
//根據(jù)按鈕移動導(dǎo)彈
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
move(-speed, 0);
} else if ((keyState & RIGHT_PRESSED) != 0) {
move(speed, 0);
} else if ((keyState & UP_PRESSED) != 0) {
move(0, -speed);
} else if ((keyState & DOWN_PRESSED) != 0) {
move(0, speed);
}
//繪制游戲屏幕
gameRender(g);
} else {
gameoverAnimation(g);
}
//繪制后臺緩沖屏幕
flushGraphics();
try {
Thread.sleep(100); //暫停一段時間
} catch(InterruptedException ex){
}
}
}
private void gameoverAnimation(Graphics g) {
int[] ds = {0};
dragon.setFrameSequence(ds);
if (dragon.getY() < canH) {
dragon.setPosition(dragon.getX(),
dragon.getY() + speed);
dragon.paint(g);
} else {
String str = "游戲結(jié)束";
g.setColor(255,0,0);
Font f = Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_BOLD,
Font.SIZE_LARGE);
g.drawString(str, (canW - f.stringWidth(str))/2,
canH/2,
Graphics.TOP | Graphics.LEFT);
gameover = true;
}
}
//移動導(dǎo)彈
private void move(int dx, int dy) {
dragon.move(dx,dy);
//碰撞檢測
dead = dragon.collidesWith(missile, true);
}
private void gameRender(Graphics g) {
missile.paint(g);
dragon.nextFrame();
dragon.paint(g);
}
//結(jié)束游戲
public void gameover() {
gameover = true;
}
//開始游戲
public void startgame() {
//初始化...
gameover = false;
//開始游戲線程
new Thread(this).start();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -