?? gamecanvas.java
字號(hào):
/*
* GameCanvas.java
*
* Copyright 2001 SkyArts. All Rights Reserved.
*/
import javax.microedition.lcdui.*;
import java.util.Timer;
/**
* NumberSliderPuzzle的游戲內(nèi)容描繪與操作所用的類
*
* @author Hideki Yonekawa
* @version 1.0
*/
class GameCanvas extends Canvas implements Runnable, CommandListener {
/** 存放寬度的變量 */
private int screenWidth;
/** 存放高度的變量 */
private int screenHeight;
/** 存放NumberSliderPuzzle對(duì)象的變量 */
private NumberSliderPuzzle sliderPuzzle;
/** 暫停狀態(tài)所用的標(biāo)志 */
private boolean isPaused;
/** 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ǔ)存默認(rèn)字體的變量 */
private Font defFont = Font.getDefaultFont();
/** 儲(chǔ)存解謎所需時(shí)間的變量 */
private long timeLong;
/** 操作所需時(shí)間的計(jì)時(shí)器時(shí)所使用的Timer變量 */
private Timer timer = null;
/** 儲(chǔ)存各關(guān)卡謎題資訊的變量 */
private static final short[][] QUESTION_PIECES = new short[][] {
{ //關(guān)卡1的謎題
1, 5, 9, 13,
2, 6, 10, 14,
3, 7, 11, 15,
4, 8, 12, -1
},
{ //關(guān)卡2的謎題
4, 3, 2, 1,
8, 7, 6, 5,
12, 11, 10, 9,
15, 13, 14, -1
},
{ //關(guān)卡3的謎題
12, 8, 4, 1,
15, 9, 5, 2,
13, 10, 6, 3,
14, 11, 7, -1
},
{ //關(guān)卡4的謎題
14, 15, 12, 13,
8, 9, 10, 11,
4, 5, 6, 7,
1, 2, 3, -1
},
{ //關(guān)卡5的謎題
14, 12, 15, 13,
11, 10, 9, 8,
7, 6, 5, 4,
3, 2, 1, -1
}
};
/** 儲(chǔ)存現(xiàn)在關(guān)卡的變量 */
private int stage;
/** 儲(chǔ)存最高關(guān)卡數(shù)的常量 */
private static final int MAX_STAGE = QUESTION_PIECES.length;
/** 代表拼圖板的列(縱向)數(shù)的常量 */
private static final int COLUMN_LENGTH = 4;
/** 代表拼圖板的行(橫向)數(shù)的常量 */
private static final int ROW_LENGTH = 4;
/** 代表拼圖片的橫寬的常量 */
private static final int PIECE_WIDTH = 25;
/** 代表拼圖片的高度的常量 */
private static final int PIECE_HEIGHT = 25;
/** 儲(chǔ)存顯示于畫(huà)面的拼圖板資訊的變量 */
private short[] pieces = new short[COLUMN_LENGTH * ROW_LENGTH];
/** 儲(chǔ)存現(xiàn)在空白空間的Index的變量 */
private short spaceIndex;
/** 代表標(biāo)題顯示狀態(tài)的常量 */
private static final short TITLE = 0;
/** 代表關(guān)卡開(kāi)始顯示狀態(tài)的常量 */
private static final short STAGE_START = 1;
/** 代表關(guān)卡顯示狀態(tài)的常量 */
private static final short STAGE_PLAYING = 2;
/** 代表關(guān)卡結(jié)束顯示狀態(tài)的常數(shù) */
private static final short STAGE_END = 5;
/** 代表過(guò)關(guān)顯示狀態(tài)的常量 */
private static final short STAGE_CLEAR = 7;
/** 代表全關(guān)卡過(guò)關(guān)顯示狀態(tài)的常量 */
private static final short ALL_STAGE_CLEAR = 9;
/** 儲(chǔ)存現(xiàn)在之顯示狀態(tài)的變量 */
private short gameState;
/** 儲(chǔ)存標(biāo)題所使用圖像的變量 */
private Image titleImg;
/**
* 構(gòu)造函數(shù)
* @param sliderPuzzle NumberSliderPuzzle
*/
GameCanvas(NumberSliderPuzzle sliderPuzzle) {
this.sliderPuzzle = sliderPuzzle;
//畫(huà)面的描繪范圍的取得
screenWidth = getWidth();
screenHeight = getHeight();
//登錄注冊(cè)Command listener
setCommandListener(this);
//取得標(biāo)題圖像
try {
titleImg = Image.createImage("/title.png");
}catch(Exception e) {}
//游戲的狀態(tài)指定為顯示標(biāo)題
gameState = TITLE;
}
/** 將使用在各關(guān)卡的變量加以初始化的方法 */
private void doGameInit() {
stage = 1;
isPaused = false;
doStageInit();
timeLong = 0;
}
/** 將使用在各關(guān)卡的變量加以初始化的方法 */
private void doStageInit() {
//設(shè)定各關(guān)卡的謎題
System.arraycopy(QUESTION_PIECES[stage -1], 0, pieces, 0, pieces.length);
//將空白空間放到右下
spaceIndex = (short)(pieces.length -1);
}
/** MIDlet的startApp()被調(diào)用出來(lái)時(shí)所調(diào)用的方法 */
void doStartApp() {
//根據(jù)現(xiàn)在的狀態(tài)來(lái)選擇運(yùn)作
switch(gameState) {
case TITLE: //顯示標(biāo)題時(shí)
doTitle();
break;
case STAGE_START: //關(guān)卡開(kāi)始時(shí)
case STAGE_PLAYING: //關(guān)卡中
//暫停
isPaused = true;
//以防萬(wàn)一先刪除關(guān)卡中的指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
//新增Resume指令
addCommand(resumeCmd);
break;
default: //上述以外的時(shí)候
//解除暫停
isPaused = false;
break;
}
}
/** MIDlet的pauseApp()被調(diào)用出來(lái)時(shí)所調(diào)用的方法 */
void doPauseApp() {
switch(gameState) {
case TITLE: //標(biāo)題顯示時(shí)
break;
default: //上述以外的時(shí)候
//暫停
doTimerStop();
isPaused = true;
break;
}
}
/** 進(jìn)行標(biāo)題顯示的方法 */
private void doTitle() {
//將游戲的狀態(tài)顯示在標(biāo)題上
gameState = TITLE;
//以防萬(wàn)一先刪除關(guān)卡中的指1令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//顯示標(biāo)題畫(huà)面
repaint();
//新增指令
addCommand(exitCmd);
addCommand(startCmd);
}
/** 調(diào)用到計(jì)時(shí)器的方法 */
void addSec() {
//增加計(jì)時(shí)器的計(jì)數(shù)讓其再描繪
timeLong++;
repaint();
}
/** 啟動(dòng)描繪線程的方法 */
private void doThreadStart() {
new Thread(this).start();
}
/** 啟動(dòng)計(jì)時(shí)器的方法 */
private void doTimerStart() {
//計(jì)時(shí)器不是null的時(shí)候就啟動(dòng)計(jì)時(shí)器
if(timer == null) {
GameTimer gameTimer = new GameTimer(this);
timer = new Timer();
timer.schedule(gameTimer, 1000, 1000);
}
}
/** 停止計(jì)時(shí)器的方法 */
private void doTimerStop() {
//計(jì)時(shí)器不是null的時(shí)候就停止計(jì)時(shí)器
if(timer != null) {
timer.cancel();
timer = null;
}
}
/** 進(jìn)行暫停或重新開(kāi)始的方法 */
private void doPauseOrResume() {
if(isPaused) {
//暫停時(shí)
//重新開(kāi)始
isPaused = false;
doTimerStart();
}else {
//不是暫停時(shí)
//進(jìn)行暫停
isPaused = true;
doTimerStop();
}
repaint();
}
/** 進(jìn)行描繪的方法 */
protected void paint(Graphics g) {
//將背景以白色清除
g.setColor(0x00FFFFFF);
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);
//著作權(quán)的顯示
g.setColor(0x00000000);
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 STAGE_START://關(guān)卡開(kāi)始時(shí)
//描繪舞臺(tái)開(kāi)始畫(huà)面
g.setColor(0x00000000);
drawSt = "Stage " + String.valueOf(stage);
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth - stWidth) / 2;
drawY = (screenHeight - (stHeight * 2)) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "Start!!";
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth - stWidth) / 2;
g.drawString(drawSt, drawX, drawY + stHeight, Graphics.TOP|Graphics.LEFT);
return;
default:
//關(guān)卡中、關(guān)卡結(jié)束時(shí)、過(guò)關(guān)時(shí)、全部過(guò)關(guān)時(shí)
//描繪外框
int widSize = ROW_LENGTH * (PIECE_WIDTH +2);
int heiSize = COLUMN_LENGTH * (PIECE_HEIGHT +2);
g.setColor(0x0000FFFF);
g.drawRect(1, screenHeight -heiSize -2, widSize, heiSize);
g.setColor(0x000000FF);
g.drawRect(0, screenHeight -heiSize -3, widSize +2, heiSize +2);
g.setColor(0x00000000);
//描繪計(jì)時(shí)器
int hour = (int)(timeLong / 3600);
int minute = (int)((timeLong - (hour * 3600)) / 60);
String minuteSt = String.valueOf(minute);
minuteSt = (minuteSt.length() < 2 ? "0"+minuteSt : minuteSt);//加上0變成兩位數(shù)
int sec = (int)(timeLong - (hour * 3600) - (minute * 60));
String secSt = String.valueOf(sec);
secSt = (secSt.length() < 2 ? "0"+secSt : secSt);//加上0變成兩位數(shù)傞
drawSt = String.valueOf(hour) + ":" + minuteSt + ":" + secSt;
stWidth = defFont.stringWidth(drawSt);
g.drawString(drawSt, (screenWidth-stWidth) / 2, 0, Graphics.TOP|Graphics.LEFT);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -