?? gamecanvas.java
字號(hào):
/*
* GameCanvas.java
*
* Copyright 2001 SkyArts. All Rights Reserved.
*/
import javax.microedition.lcdui.*;
import java.util.*;
/**
* PocketBoxing的游戲內(nèi)容描繪與操作所用的類
*
* @author Hideki Yonekawa
* @version 1.0
*/
class GameCanvas extends Canvas implements Runnable, CommandListener {
/** 用來儲(chǔ)存橫向長度的變量 */
private int screenWidth;
/** 用來儲(chǔ)存縱向長度的變量 */
private int screenHeight;
/** 儲(chǔ)存PocketBoxing對(duì)象的變量 */
private PocketBoxing boxing;
/** 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();
/** 代表標(biāo)題顯示狀態(tài)的常量 */
private static final short TITLE = 0;
/** 代表回合開始顯示狀態(tài)的常量 */
private static final short ROUND_START = 1;
/** 代表比賽顯示狀態(tài)的常量 */
private static final short FIGHTING = 2;
/** 代表回合結(jié)束顯示狀態(tài)的常量 */
private static final short ROUND_END = 9;
/** 代表全部回合過關(guān)狀態(tài)的常量 */
private static final short ALL_ROUND_CLEAR = 10;
/** 儲(chǔ)存現(xiàn)在顯示狀態(tài)的變量 */
private short gameState;
/** 代表玩家勝利狀態(tài)的常量 */
private static final int WIN = 0;
/** 代表玩家失敗狀態(tài)的常量 */
private static final int LOSE = 2;
/** 儲(chǔ)存玩家勝敗結(jié)果的變量 */
private int result;
/** 儲(chǔ)存默認(rèn)生命點(diǎn)數(shù)的定數(shù) */
private static final long DRAW_INTERVAL = 100;
/** 決定對(duì)手動(dòng)作時(shí)所使用的Random變量 */
private Random random = new Random();
/** 代表玩家的變量 */
private Boxer player;
/** 代表對(duì)手的變量 */
private Enemy enemy;
/** 停止描繪線程的標(biāo)志變量 */
private boolean isStopped;
/** 代表暫停狀態(tài)的標(biāo)志 */
private boolean isPaused;
/** 代表對(duì)手是否為揮出拳擊的標(biāo)志變量 */
private boolean isEnemyPanch;
/** 儲(chǔ)存使用在標(biāo)題畫面上的變量 */
private Image titleImg;
/** 儲(chǔ)存在每一回合中對(duì)手之拳擊力的數(shù)組常量 */
private static final int[] DAMAGES = new int[] {
5, 8, 10, 12, 15
};
/** 儲(chǔ)存現(xiàn)在回合的變量 */
private int round;
/** 儲(chǔ)存回合數(shù)的常量 */
private static final int MAX_ROUND = DAMAGES.length;
/**
* 構(gòu)造函數(shù)
* @param boxing PocketBoxing對(duì)象
*/
GameCanvas(PocketBoxing boxing) {
this.boxing = boxing;
//取得畫面的描繪范圍
screenWidth = getWidth();
screenHeight = getHeight();
try {
//初始化玩家
player = new Boxer();
player.setDrawX((screenWidth - 120) /2);
player.setDrawY(screenHeight - player.getHeight());
//初始化對(duì)手
enemy = new Enemy();
enemy.setDrawX(screenWidth - ((screenWidth - 120) /2));
enemy.setDrawY(screenHeight - enemy.getHeight());
//取得標(biāo)題圖像
titleImg = Image.createImage("/title.png");
}catch(Exception e) {}
//登錄指令監(jiān)聽
setCommandListener(this);
//將游戲狀態(tài)顯示到標(biāo)題
gameState = TITLE;
}
/** 對(duì)游戲中所使用之值進(jìn)行初始化的常量 */
private void doGameInit() {
round = 1;
doRoundInit();
isPaused = false;
}
/** 對(duì)使用在各回合之值進(jìn)行初始化的常量 */
private void doRoundInit() {
gameState = ROUND_START;
result = WIN;
player.doInitialize();
enemy.doInitialize();
isEnemyPanch = false;
//清除描繪線程停止標(biāo)志
isStopped = 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 ROUND_START: //回合開始時(shí)
case FIGHTING: //回合進(jìn)行中
//進(jìn)行暫停
isPaused = true;
//停止游戲循環(huán)
isStopped = true;
//以防萬一先刪除關(guān)卡中的指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
//新增Resume指令
addCommand(resumeCmd);
break;
default: //上述情形以外時(shí)
//解除暫停
isPaused = false;
break;
}
}
/** 進(jìn)行標(biāo)題顯示的方法 */
private void doTitle() {
//將游戲狀態(tài)顯示到標(biāo)題
gameState = TITLE;
//以防萬一先刪除關(guān)卡中的指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//顯示標(biāo)題畫面
repaint();
//新增指令
addCommand(exitCmd);
addCommand(startCmd);
}
/** 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;
}
}
/** 啟動(dòng)描繪線程的方法 */
private void doThreadStart() {
new Thread(this).start();
}
/** 結(jié)束游戲的方法 */
void doGameStop() {
isStopped= true;
}
/** 用來進(jìn)行暫停或是重新開始的方法 */
void doPauseOrResume() {
if(isPaused) {
//暫停時(shí)
//重新開始
isPaused = false;
isStopped = false;
doThreadStart();
}else {
//不是暫停的時(shí)候
//進(jìn)行暫停
isPaused = true;
doGameStop();
}
repaint();
}
/**
* 進(jìn)行描繪的方法,一般不會(huì)直接從類本身來調(diào)用
* @param g Graphics對(duì)象
*/
protected void paint(Graphics g) {
//以白色來清除背景
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, screenWidth, screenHeight);
//設(shè)定字體
g.setFont(defFont);
String drawSt;
String drawSt2 = null;
int drawX, drawY, stWidth, drawHeight;
int stHeight = defFont.getHeight();
//依照游戲狀態(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 ROUND_START: //回合開始時(shí)
g.setColor(0x00000000);
drawSt = "Round " + String.valueOf(round);
drawX = (screenWidth - defFont.stringWidth(drawSt)) /2;
drawY = (screenHeight - stHeight * 2) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "Ready fight!";
drawX = (screenWidth - defFont.stringWidth(drawSt)) /2;
drawY = drawY + stHeight;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
}
//描繪玩家與對(duì)手的生命點(diǎn)數(shù)
g.setColor(0x00000000);
drawSt = "You:" + String.valueOf(player.getLifePoint());
g.drawString(drawSt, 0, 0, Graphics.TOP|Graphics.LEFT);
drawSt = "Com:" + String.valueOf(enemy.getLifePoint());
g.drawString(drawSt, screenWidth - defFont.stringWidth(drawSt), 0, Graphics.TOP|Graphics.LEFT);
//描繪對(duì)手與玩家
enemy.doDraw(g);
player.doDraw(g);
//在暫停時(shí)等在畫面顯示字符串
switch(gameState) {
case FIGHTING: //回合中
if(isPaused) {
//顯示代表暫停的字符串
drawSt = "Pause";
}else {
//不是暫停時(shí)為return
return;
}
break;
case ROUND_END: //回合結(jié)束時(shí)
drawSt = "Round " + String.valueOf(round);
switch(result) {
case WIN: //勝利
drawSt2 = "You win!";
break;
case LOSE: //失敗
drawSt2 = "You lose!";
break;
}
break;
case ALL_ROUND_CLEAR://全回合過關(guān)時(shí)
drawSt = "You are Champion!";
break;
}
//描繪文本框
stWidth = defFont.stringWidth(drawSt);
if(drawSt2 == null) {
drawHeight = stHeight;
}else {
int tmpStWidth = defFont.stringWidth(drawSt2);
stWidth = (stWidth > tmpStWidth ? stWidth : tmpStWidth);
drawHeight = stHeight * 2;
}
drawX = (screenWidth-stWidth) / 2;
drawY = (screenHeight - (drawHeight)) / 2;
//輸出第一行的消息
g.setColor(0x00BBBBBB);
g.fillRoundRect(drawX-2, drawY+2, stWidth+9, drawHeight+2, 5, 5);
g.setColor(0x00000000);
g.fillRoundRect(drawX-6, drawY-2, stWidth+11, drawHeight+4, 5, 5);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX-4, drawY, stWidth+7, drawHeight, 5, 5);
//輸出第一行的消息
g.setColor(0x00000000);
drawX = (screenWidth -defFont.stringWidth(drawSt)) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
//輸出第二行的消息
if(drawSt2 != null) {
drawX = (screenWidth -defFont.stringWidth(drawSt2)) / 2;
drawY = drawY + stHeight;
g.drawString(drawSt2, drawX, drawY, Graphics.TOP|Graphics.LEFT);
}
}
/** 指令的事件發(fā)生時(shí)所調(diào)用的方法 */
public void commandAction(Command c, Displayable s) {
if(c == startCmd) {//Start指令
//初始化游戲以開始游戲
doGameInit();
gameState = ROUND_START;
//先將標(biāo)題指令刪除
removeCommand(startCmd);
removeCommand(exitCmd);
doThreadStart();
}else if(c == exitCmd) {//Exit指令
//調(diào)用出PocketBoxing類的doExit方法,將MIDlet本身結(jié)束
boxing.doExit();
}else if(c == pauseCmd) {//Pause指令
//交換Pause指令與Resume指令,調(diào)用出Pause、Resume處理方法
removeCommand(pauseCmd);
addCommand(resumeCmd);
doPauseOrResume();
}else if(c == resumeCmd) {//Resume指令
//交換Resume指令與Pause指令,調(diào)用出Pause、Resume處理方法
removeCommand(resumeCmd);
addCommand(pauseCmd);
doPauseOrResume();
}else if(c == quitCmd) {//Quit指令
//調(diào)用出游戲結(jié)束方法
doGameStop();
//刪除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//顯示標(biāo)題
doTitle();
}
}
/** 按鍵按下事件發(fā)生時(shí)所調(diào)用的方法 */
protected synchronized void keyPressed(int keyCode) {
if( gameState != FIGHTING ||
(gameState == FIGHTING && isPaused)) {
//回合中以外,或是在回合中暫停時(shí)為return
return;
}
//為清除按鍵的時(shí)候就不處理
if(keyCode == 0) return; //for KDDI
//玩家為拳擊中時(shí)就是return
switch(player.getCurrentState()) {
case Boxer.PANCH_UP:
case Boxer.PANCH_DOWN:
return;
}
switch(keyCode) {
case KEY_NUM1: //按鍵1
case KEY_NUM4: //按鍵4
//進(jìn)行防御時(shí)
switch(player.getCurrentState()) {
case Boxer.GUARD_UP:
case Boxer.GUARD_DOWN:
//讓玩家拳擊手后退
player.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case KEY_NUM2: //按鍵2
switch(player.getCurrentState()) {
case Boxer.BACK_STEP:
case Boxer.GUARD_DOWN:
//后退或是進(jìn)行下段防御時(shí)
//讓玩家的拳擊手進(jìn)行上段防御
player.setCurrentState(Boxer.GUARD_UP);
break;
}
break;
case KEY_NUM5: //按鍵5
switch(player.getCurrentState()) {
case Boxer.BACK_STEP:
case Boxer.GUARD_UP:
//進(jìn)行后退或是上段防御時(shí)
//讓玩家拳擊手進(jìn)行下段防御
player.setCurrentState(Boxer.GUARD_DOWN);
break;
}
break;
case KEY_NUM3: //按鍵3
switch(player.getCurrentState()) {
case Boxer.BACK_STEP:
case Boxer.GUARD_UP:
case Boxer.GUARD_DOWN:
//后退或是進(jìn)行防御時(shí)
//讓玩家的拳擊手進(jìn)行上段拳擊
player.setCurrentState(Boxer.PANCH_UP);
//根據(jù)對(duì)手的狀態(tài)來減少生命點(diǎn)數(shù)
doLifepointCheck4Enemy();
break;
}
break;
case KEY_NUM6: //按鍵6
switch(player.getCurrentState()) {
case Boxer.BACK_STEP:
case Boxer.GUARD_UP:
case Boxer.GUARD_DOWN:
//后退或是進(jìn)行防御時(shí)
//讓玩家拳擊手進(jìn)行下段拳擊
player.setCurrentState(Boxer.PANCH_DOWN);
//根據(jù)對(duì)手的狀態(tài)來減少生命點(diǎn)數(shù)
doLifepointCheck4Enemy();
break;
}
break;
}
}
/** 按鍵按下狀態(tài)時(shí)被重復(fù)調(diào)用的方法 */
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -