?? gamecanvas.java
字號(hào):
/*
* GameCanvas.java
*
* Copyright 2001 SkyArts. All Rights Reserved.
*/
import javax.microedition.lcdui.*;
import java.util.*;
/**
* 游戲的描繪與操作所用的類
*
* @author Hideki Yonekawa
* @version 1.0
*/
class GameCanvas extends Canvas implements Runnable, CommandListener {
/** 儲(chǔ)存橫向長(zhǎng)度的變量 */
private int screenWidth;
/** 儲(chǔ)存縱向長(zhǎng)度的變量 */
private int screenHeight;
/** 儲(chǔ)存SpaceShooter對(duì)象的變量 */
private SpaceShooter spaceShooter;
/** 儲(chǔ)存使用在標(biāo)題之圖像的變量 */
private Image titleImg;
/** 儲(chǔ)存自機(jī)類別之對(duì)象的變量 */
private MyShip myShip = new MyShip();
/** 儲(chǔ)存自機(jī)飛彈類別之對(duì)象的數(shù)組變量 */
private MyMissile[] myMissiles = new MyMissile[] {
new MyMissile(),
new MyMissile(),
new MyMissile(),
new MyMissile(),
new MyMissile()
};
/** 儲(chǔ)存自機(jī)之飛彈發(fā)射數(shù)的變量 */
private int myMissileCount;
/** 儲(chǔ)存了UFO類別之對(duì)象的數(shù)組變量 */
private UFO[] ufos = new UFO[] {
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip),
new UFO(myShip)
};
/** 儲(chǔ)存了UFO之使用數(shù)的變量 */
private int ufoCount;
/** 儲(chǔ)存了UFO之飛彈類別對(duì)象的數(shù)組變量 */
private UFOMissile[] ufoMissiles = new UFOMissile[] {
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile(),
new UFOMissile()
};
/** 儲(chǔ)存了UFO之飛彈發(fā)射數(shù)的變量 */
private int ufoMissileCount;
/** 用來儲(chǔ)存描繪的間隔(INTERVAL)的常量 */
private static final long DRAW_INTERVAL = 100;
/** 顯示暫停狀態(tài)的標(biāo)志 */
private boolean isPaused;
/** 代表游戲循環(huán)停止的變量 */
private boolean isStopped;
/** 儲(chǔ)存了操作UFO的動(dòng)態(tài)時(shí)所使用之計(jì)數(shù)的變量 */
private int tickCount4UFO;
/** 用來改變UFO的出現(xiàn)之Random變量 */
private Random random = new Random();
/** Start指令變量 */
private Command startCmd = new Command("Start", Command.SCREEN, 5);
/** Exit指令變量 */
private Command exitCmd = new Command("Exit", Command.SCREEN, 1);
/** Pause指令變量 */
private Command pauseCmd = new Command("Pause", Command.SCREEN, 5);
/** Resume指令變量 */
private Command resumeCmd = new Command("Resume", Command.SCREEN, 5);
/** Quit指令變量 */
private Command quitCmd = new Command("Quit", Command.SCREEN, 1);
/** 儲(chǔ)存分?jǐn)?shù)的變量 */
private long score;
/** 儲(chǔ)存最高分?jǐn)?shù)的變量 */
private long highScore = 0;
/** 用來儲(chǔ)存默認(rèn)分?jǐn)?shù)的常量 */
private static final long DEFAULT_SCORE = 100;
/** 儲(chǔ)存生命點(diǎn)數(shù)的變量 */
private int lives;
/** 用來儲(chǔ)存默認(rèn)之生命點(diǎn)數(shù)的常量 */
private static final int DEFAULT_LIVES = 3;
/** 儲(chǔ)存默認(rèn)字體的變量 */
private Font defFont = Font.getDefaultFont();
/** 儲(chǔ)存分?jǐn)?shù)顯示部分之高度的常量(設(shè)定到默認(rèn)字體高度) */
private static final int SCORE_AREA = Font.getDefaultFont().getHeight();
/** 代表標(biāo)題顯示狀態(tài)的常量 */
private static final short TITLE = 0;
/** 代表游戲開始顯示狀態(tài)的常量 */
private static final short GAME_START = 1;
/** 代表游戲中顯示狀態(tài)的常量 */
private static final short GAME_PLAYING = 2;
/** 代表游戲結(jié)束顯示狀態(tài)的常量 */
private static final short GAME_END = 5;
/** 儲(chǔ)存現(xiàn)在顯示狀態(tài)的變量 */
private short gameState;
/** 構(gòu)造函數(shù) */
GameCanvas(SpaceShooter spaceShooter) {
this.spaceShooter = spaceShooter;
//取得畫面的可描繪范圍
screenWidth = getWidth();
screenHeight = getHeight();
//取得標(biāo)題圖像
try {
titleImg = Image.createImage("/title.png");
}catch(Exception e) {}
//登錄指令監(jiān)聽
setCommandListener(this);
//將游戲的狀態(tài)變成顯示標(biāo)題
gameState = TITLE;
}
/** 進(jìn)行游戲之初始化的方法 */
private void doGameInit() {
//清除分?jǐn)?shù)
score = 0;
//將自機(jī)的位置設(shè)定于中央
myShip.setX((screenWidth - myShip.getWidth()) /2);
myShip.setY(screenHeight - myShip.getHeight());
myShip.setHit(false);//清除Hit狀態(tài)
//將生命點(diǎn)數(shù)設(shè)為默認(rèn)值
lives = DEFAULT_LIVES;
//清除自機(jī)飛彈
for(int i=0; i < myMissiles.length; i++) {
myMissiles[i].setAlive(false);
}
//清除自機(jī)飛彈數(shù)
myMissileCount = 0;
//清除UFO
for(int i=0; i < ufos.length; i++) {
ufos[i].setAlive(false);
}
//清除UFO數(shù)
ufoCount = 0;
//清除UFO飛彈
for(int i=0; i < ufoMissiles.length; i++) {
ufoMissiles[i].setAlive(false);
}
//清除UFO飛彈數(shù)
ufoMissileCount = 0;
//清除要讓UFO出現(xiàn)時(shí)所使用的Tick計(jì)數(shù)
tickCount4UFO = 0;
//清除游戲循環(huán)停止標(biāo)志
isStopped = false;
//清除暫停標(biāo)志
isPaused = false;
}
/** MIDlet的startApp()被調(diào)用出來時(shí)所調(diào)用的方法 */
void doStartApp() {
//根據(jù)現(xiàn)在的狀態(tài)來操作運(yùn)作
switch(gameState) {
case TITLE: //顯示標(biāo)題時(shí)
doTitle();
break;
case GAME_START: //游戲開始時(shí)
case GAME_PLAYING: //游戲中
//進(jìn)行暫停
isPaused = true;
//停止游戲循環(huán)
isStopped = true;
//以防萬一刪除關(guān)卡中的指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
//新增Resume指令
addCommand(resumeCmd);
break;
default: //上述情形以外時(shí)
//解除暫停
isPaused = false;
break;
}
}
/** MIDlet的pauseApp()方法被調(diào)用出來時(shí)所調(diào)用的方法 */
void doPauseApp() {
switch(gameState) {
case TITLE: //顯示標(biāo)題時(shí)
break;
default: //上述情形以外時(shí)
//暫停
isPaused = true;
//停止游戲循環(huán)
isStopped = true;
break;
}
}
/** 進(jìn)行標(biāo)題顯示的方法 */
private void doTitle() {
//將游戲的狀態(tài)設(shè)為顯示標(biāo)題
gameState = TITLE;
//以防萬一先將關(guān)卡中的指令刪除
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//顯示標(biāo)題畫面
repaint();
//新增指令
addCommand(exitCmd);
addCommand(startCmd);
}
/** 啟動(dòng)描繪線程的方法 */
private void doThreadStart() {
new Thread(this).start();
}
/** 結(jié)束游戲的方法 */
private void doGameStop() {
//停止游戲循環(huán)
isStopped = true;
//設(shè)定最高分?jǐn)?shù)
setHighScore(score);
}
/** 進(jìn)行暫停或是重新開始的方法 */
private void doPauseOrResume() {
if(isPaused) {
//暫停時(shí)
//重新開始
isPaused = false;
isStopped = false;
doThreadStart();
}else {
//不是暫停時(shí)
//暫停
isPaused = true;
doGameStop();
}// end if
repaint();
}
/**
* 進(jìn)行描繪的方法,通常不會(huì)從自類別來調(diào)用
* @param g Graphics對(duì)象
*/
protected void paint(Graphics g) {
//以黑色清除背景
g.setColor(0x00000000);
g.fillRect(0, 0, screenWidth, screenHeight);
g.setFont(defFont);
String drawSt;
int drawX, drawY, stWidth;
int stHeight = defFont.getHeight();
//根據(jù)游戲狀態(tài)來改變描繪內(nèi)容
switch(gameState) {
case TITLE://顯示標(biāo)題時(shí)
//描繪標(biāo)題圖像
drawX = (screenWidth - titleImg.getWidth()) /2;
g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);
//顯示最高分?jǐn)?shù)
g.setColor(0x00FFFFFF);
g.setFont(defFont);
drawSt = "High Score";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = titleImg.getHeight() -5;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawX = drawX + defFont.stringWidth(drawSt) - defFont.stringWidth(String.valueOf(highScore));
drawY = drawY + stHeight;
g.drawString(String.valueOf(highScore), drawX, drawY, Graphics.TOP|Graphics.LEFT);
//顯示著作權(quán)
drawSt = "Copyright 2001";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = getHeight() - stHeight *2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "SkyArts.com";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = drawY + stHeight;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
case GAME_START://游戲開始時(shí)
//描繪游戲開始畫面
g.setColor(0x00FFFFFF);
drawSt = "Ready go !";
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth - stWidth) / 2;
drawY = (screenHeight - stHeight) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
case GAME_PLAYING:
case GAME_END:
//游戲中或是游戲結(jié)束時(shí)
g.setColor(0x00FFFFFF);
//將分?jǐn)?shù)描繪到左邊
drawSt = "S:" + String.valueOf(score);
g.drawString(drawSt, 0, 0, Graphics.TOP|Graphics.LEFT);
//將生命點(diǎn)數(shù)描繪到右邊
drawSt = "L:" + String.valueOf(lives);
g.drawString(drawSt, screenWidth- defFont.stringWidth(drawSt), 0, Graphics.TOP|Graphics.LEFT);
//描繪自機(jī)
myShip.doDraw(g);
//描繪UFO
for(int i=0; i < ufos.length; i++) {
ufos[i].doDraw(g);
}
//描繪自機(jī)飛彈
for(int i=0; i < myMissiles.length; i++) {
myMissiles[i].doDraw(g);
}
//描繪UFO飛彈
for(int i=0; i < ufoMissiles.length; i++) {
ufoMissiles[i].doDraw(g);
}
//在暫停時(shí)等畫面中顯示文本
switch(gameState) {
case GAME_PLAYING://游戲中
if(isPaused) {
//顯示代表暫停的字符串
drawSt = "Pause";
}else {
//不是暫停時(shí)就return
return;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -