?? gamecanvas.java
字號:
}
break;
case GAME_END://游戲結束時
//顯示游戲結束字符串
drawSt = "Game over";
break;
default:
return;
}
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth-stWidth) / 2;
drawY = (screenHeight - (stHeight)) / 2;
//描繪文本框
g.setColor(0x00BBBBBB);
g.fillRoundRect(drawX-2, drawY+2, stWidth+9, stHeight+2, 5, 5);
g.setColor(0x00000000);
g.fillRoundRect(drawX-6, drawY-2, stWidth+11, stHeight+4, 5, 5);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX-4, drawY, stWidth+7, stHeight, 5, 5);
//輸出消息
g.setColor(0x00000000);
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
break;
}
}
/** 指定的事件發生時被調用出來的方法 */
public void commandAction(Command c, Displayable s) {
if(c == startCmd) {//Start指令
//初始化游戲以開始游戲
doGameInit();
gameState = GAME_START;
doThreadStart();
}else if(c == exitCmd) {//EXIT指令
//調用出SpaceShooter類別的doExit方法以結束MIDlet本身
spaceShooter.doExit();
}else if(c == pauseCmd) {//Pause指令
//交換Pause指令與Resume指令,調用出Pause、Resume處理方法
removeCommand(pauseCmd);
addCommand(resumeCmd);
doPauseOrResume();
}else if(c == resumeCmd) {//Resume指令
//交換Resume指令與Pause指令,調用出Pause、Resume處理方法
removeCommand(resumeCmd);
addCommand(pauseCmd);
doPauseOrResume();
}else if(c == quitCmd) {//Quit指令
//調用出游戲結束方法
doGameStop();
//刪除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//顯示標題
doTitle();
}
}
/** 按鍵按下事件發生時被調用出來的方法 */
protected synchronized void keyPressed(int keyCode) {
if( gameState != GAME_PLAYING ||
(gameState == GAME_PLAYING && isPaused)) {
//非游戲中,或在游戲中暫停時為return
return;
}
//為清除按鍵時不處理
if(keyCode == 0) return; //for KDDI
int gameCode = getGameAction(keyCode);
switch(gameCode) {
case LEFT: //按下向左按鍵時
doLeft();
break;
case RIGHT: //按下向右按鍵時
doRight();
break;
case FIRE: //按下Fire按鍵時
case UP: //按下向上按鍵時
doFire();
break;
}
}
/** 壓下按鍵狀態時被重復調用的方法 */
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
}
/** 線程的運作部分 */
public void run() {
try {
switch(gameState) {
case GAME_START: //游戲開始時
//先將標題的指令刪除
removeCommand(startCmd);
removeCommand(exitCmd);
//顯示游戲開始畫面
repaint();
Thread.sleep(1500);
//新增指令
addCommand(quitCmd);
if(! isPaused) {
addCommand(pauseCmd);
}
//將狀態設為游戲中,然后就此轉移到游戲中的處理
gameState = GAME_PLAYING;
case GAME_PLAYING: //游戲中
repaint();
//游戲結束標志
boolean isGameOver = false;
//開始游戲循環
while(! isStopped) {//在Stop前持續循環
//再描繪
repaint();
//移動自機(利用在爆炸顯示時)
myShip.doMove();
//UFO處理
for(int i=0; i < ufos.length; i++) {
if(ufos[i].isAlive()) {
//只處理在Alive狀態的UFO
//移動UFO
ufos[i].doMove();
if(! ufos[i].isAlive() ||
ufos[i].getX()+ufos[i].getWidth() < 0 ||
ufos[i].getX() > screenWidth) {
//移動UFO之后不是Alive狀態時
//或是UFO跑到畫面外時
//設定UFO不是Alive狀態,減少UFO數目
ufos[i].setAlive(false);
ufoCount--;
//若UFO為命中狀態的話,在分數中新增DEFAULT_SCORE
if(ufos[i].isHit()) score = score + DEFAULT_SCORE;
}else if(ufoMissileCount < ufoMissiles.length &&
ufos[i].isDropBomb()) {
//UFO在Alive狀態下發射飛彈時
//進行炸彈處理
//在飛彈數組中尋找不是Alive狀態的飛彈
for(int j=0; j < ufoMissiles.length; j++) {
if(! ufoMissiles[j].isAlive()) {
//不是Alive狀態的飛彈時
//符合飛彈的座標來攻擊
ufoMissiles[j].setX((
ufos[i].getWidth() - ufoMissiles[j].getWidth()) /2 +
ufos[i].getX());
ufoMissiles[j].setY(ufos[i].getY() + ufos[i].getHeight());
ufoMissiles[j].setAlive(true);
ufoMissileCount++;
break;
}
}
}
}
}// end for
//UFO飛彈處理
for(int i=0; i < ufoMissiles.length; i++) {
if(ufoMissiles[i].isAlive()) {
//只處理Alive狀態的UFO飛彈
//移動UFO飛彈
ufoMissiles[i].doMove();
//命中判定
if(myShip.isOverlaps(ufoMissiles[i])) {
//UFO飛彈與自機重疊時
myShip.setHit(true);
//刪除飛彈
ufoMissiles[i].setAlive(false);
ufoMissileCount--;
//減少生命點數
lives--;
if(lives < 1) {
//當生命點數用完時
//刪除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//建立游戲結束標志
isGameOver = true;
//抽出for語法
break;
}
}else if(ufoMissiles[i].getY() > getHeight()) {
//UFO飛彈跑到畫面外時
//將UFO飛彈設為無效
ufoMissiles[i].setAlive(false);
ufoMissileCount--;
}
}
}
//自機飛彈處理
for(int i=0; i < myMissiles.length; i++) {
if(myMissiles[i].isAlive()) {
//只處理Alive狀態的自機飛彈
//移動自機飛彈
myMissiles[i].doMove();
//命中判定
for(int j=0; j < ufos.length; j++) {
if(ufos[j].isAlive() && ! ufos[j].isHit()) {
//當UFO為在Alive狀態,而不是被擊中狀態時
if(ufos[j].isOverlaps(myMissiles[i])) {
//自機飛彈與UFO重疊時
//將UFO設為擊中狀態
ufos[j].setHit(true);
//刪除飛彈
myMissiles[i].setAlive(false);
myMissileCount--;
break;
}
}
}
}
if( myMissiles[i].isAlive() &&
myMissiles[i].getY() + myMissiles[i].getHeight() < SCORE_AREA)
{
//從畫面消失時
//刪除自機飛彈
myMissiles[i].setAlive(false);
myMissileCount--;
}
}// end for
if(isGameOver) {
//當游戲結束標志建立時
//刪除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//結束這個循環
doGameStop();
//顯示游戲結束,再等待一段時間后顯示標題
gameState = GAME_END;
repaint();
Thread.sleep(5000);
doTitle();
break;
}else {
//游戲未結束時
//讓UFO出現
doEmerge4UFO();
//在描繪間隔中待命
Thread.sleep(DRAW_INTERVAL);
}
}// end while
break;
}
}catch(Exception e) {}
}
/** 左按鍵被壓下時所調用的方法 */
private void doLeft() {
//向左移動自機大小的一半
int tmpX = myShip.getX() - (myShip.getWidth() /2);
if(tmpX < 0) {
tmpX = 0;
}
myShip.setX(tmpX);
}
/** 右按鍵被壓下時所調用的方法 */
private void doRight() {
//向右移動自機大小的一半
int tmpX = myShip.getX() + (myShip.getWidth() /2);
if(tmpX > screenWidth -myShip.getWidth()) {
tmpX = screenWidth -myShip.getWidth();
}
myShip.setX(tmpX);
}
/** 按下決定按鍵、下按鍵時被調用的方法 */
private void doFire() {
if(myMissileCount < myMissiles.length) {
//比飛彈數的上限還少時
for(int i=0; i < myMissiles.length; i++) {
if(! myMissiles[i].isAlive()) {
//自機飛彈不是Alive狀態時
//發射飛彈
myMissiles[i].setX((myShip.getWidth() - myMissiles[i].getWidth()) /2 +
myShip.getX());
myMissiles[i].setY(myShip.getY() - myMissiles[i].getHeight());
myMissiles[i].setAlive(true);
myMissileCount++;
break;
}
}
}
}
/** 要讓UFO出現時所調用的方法 */
private void doEmerge4UFO() {
//在Tick計數中增加1
tickCount4UFO++;
if(ufoCount < 1 || tickCount4UFO > 4) {
//UFO為0時,或是是Tick計數比4還大時
tickCount4UFO = 0;
if(ufoCount < ufos.length) {
//UFO的數目比上限還少時
//取得亂數的int值
int tmpInt = random.nextInt() % 2;
//讓其出現時
tmpInt = random.nextInt() % 2;
//尋找不是Alive狀態的UFO
UFO ufo;
for(int i=0; i < ufos.length; i++) {
if(! ufos[i].isAlive()) {
if(tmpInt == 0) {
//從右邊出現時
tmpInt = random.nextInt() % 2;//改變高度
if(tmpInt < 0) tmpInt = tmpInt* (-1);
ufos[i].setDirection(UFO.DIRECTION_RIGHT);
ufos[i].setX(0 +2);
ufos[i].setY(SCORE_AREA + (((ufos[i].getHeight() +2) *2) * tmpInt));
}else {
//從左邊出現時
tmpInt = random.nextInt() % 2;//改變高度
if(tmpInt < 0) tmpInt = tmpInt* (-1);
ufos[i].setDirection(UFO.DIRECTION_LEFT);
ufos[i].setX((screenWidth - ufos[i].getWidth() / 2) -2);
ufos[i].setY(SCORE_AREA +
(((ufos[i].getHeight() +2) *2) * tmpInt) +
(ufos[i].getHeight() +2));
}
ufos[i].setAlive(true);
ufoCount++;
break;
}
}
}
}
}
}
/** 設定最高分數的方法 */
private void setHighScore(long score) {
if(score > highScore) {
highScore = score;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -