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