?? gamecanvas.java
字號:
//再描繪
repaint();
//等待描繪的間隔
Thread.sleep(DRAW_INTERVAL);
}// end while
if(isGameOver) {
//當游戲結束的標志建立時
//刪除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//進行再描繪后等待一下
repaint();
Thread.sleep(1000);
//顯示游戲結束,在等待一定時間后顯示標題
gameState = GAME_END;
repaint();
Thread.sleep(5000);
doTitle();
}
break;
}
}catch(Exception e) {}
}
/** 結束游戲的方法 */
private void doGameStop() {
//停止游戲循環
isStopped = true;
//設定最高分數
setHighScore(score);
}
/** 設定最高分數的方法 */
private void setHighScore(long score) {
if(score > highScore) {
highScore = score;
}
}
/**
* 向下落下來結合的方法
* @return boolean 當可以向下落下結合的時候就會傳回true、
* 若不能結合的話就傳回false。
*/
private boolean doDropDown() {
//顯示是否可以落下的標志
boolean isFallOK = false;
//顯示是否有放置的標志
boolean isDropDown = false;
//儲存可以落下數的變量
int fallOKCount = 0;
int loopCount = (COLUMN_LENGTH -1) * ROW_LENGTH -1;
for(int i=COLUMN_LENGTH * ROW_LENGTH-1; i > loopCount; i--) {//從右端來向左邊
isFallOK = false;
fallOKCount = 0;
for(int j=i; j > -1; j=j-ROW_LENGTH) {//當現在的Index是最上面
if(pieces[j] != null) {
//當現在的Index不是null時
if(isFallOK) {
//當可以落下時
isDropDown = true;
//尋找到成為null為止
int jj = 0;
for(jj=j-ROW_LENGTH; jj > -1; jj=jj-ROW_LENGTH) {
if(pieces[jj] == null) {
break;
}
}
//落下可以落下的部分
for(int f=j; f > jj; f=f-ROW_LENGTH) {
pieces[f +(fallOKCount *ROW_LENGTH)] = pieces[f];
pieces[f] = null;
}
//再度調查相同的縱列
i++;
}
}else {
//沒有方塊時
isFallOK = true;
fallOKCount++;
}
}
}
return isDropDown;
}
/**
* 傳回儲存了放入湊成同色地方的ndex值的Vector對象的Vector的方法
* @return Vector 放入湊成同色地方的Index值的Vector對象的Vector
*/
private Vector doMatchCheck() {
//準備用來檢查用的Vector與Hashtable
Vector matchVec = new Vector();
Hashtable matchHash = new Hashtable();
//用來調查該行是否為null的標志
boolean isNullHorizon = false;
//從Piece數組的右下順序來看
//為了不要浪費功夫只看上與左
for(int i=COLUMN_LENGTH * ROW_LENGTH -1; i > -1; i=i-ROW_LENGTH) {//左邊則向上檢查
if(isNullHorizon) {
//橫向一行為null時因為上面沒有任何東西,因此結束for語法的處理
break;
}
//清除用來調查該行是否為null的標志
isNullHorizon = true;
int endInx = i -ROW_LENGTH;
for(int j=i; j > endInx; j--) {//從右邊開始橫向查看該行
if(pieces[j] != null) {
//現在位置的方塊不是null的場合
//將用來調查該列是否為null的標志設為false
isNullHorizon = false;
//上方的檢查
if(i > ROW_LENGTH -1 && pieces[j -ROW_LENGTH] != null) {
//不是最上方、上方不是null時
if(pieces[j -ROW_LENGTH].currentColor == pieces[j].currentColor) {
//目前的方塊與上面的方塊為同Color時
pieces[j].isMatchUp = true;
pieces[j -ROW_LENGTH].isMatchDown = true;
if(matchHash.get(String.valueOf(j)) == null) {
//為沒有處理的坐標時
//當儲存了湊在一起的Index的Hashtable沒有任何值時
if(matchHash.get(String.valueOf(j -ROW_LENGTH)) == null) {
//當也沒有處理上方的方塊時
//新產生Vector
Vector tmpVect = new Vector();
//在所產生的Vector中新增現在坐標、上方坐標
tmpVect.addElement(new Integer(j));
tmpVect.addElement(new Integer(j -ROW_LENGTH));
matchHash.put(String.valueOf(j), tmpVect);
matchHash.put(String.valueOf(j -ROW_LENGTH), tmpVect);
//將產生的Vector上新增到Hashtable與Vector
matchVec.addElement(tmpVect);
}
}else {
//為已經處理過的坐標時
//上方為未處理時
Vector tmpVect = (Vector)matchHash.get(String.valueOf(j));
tmpVect.addElement(new Integer(j -ROW_LENGTH));
matchHash.put(String.valueOf(j -ROW_LENGTH), tmpVect);
}
}else {
//現在的方塊與上方的方塊為不同Color時
pieces[j].isMatchUp = false;
pieces[j -ROW_LENGTH].isMatchDown = false;
}
}else {
//上方為null時
pieces[j].isMatchUp = false;
}
//左邊的檢查
if(j % ROW_LENGTH != 0 && pieces[j -1] != null) {
//當不是最左邊的時候、或左邊不是null的時候
if(pieces[j -1].currentColor == pieces[j].currentColor) {
//目前的方塊與上面的方塊為同Color時
pieces[j].isMatchLeft = true;
pieces[j -1].isMatchRight = true;
if(matchHash.get(String.valueOf(j)) == null) {
//為沒有處理過的坐標時
if(matchHash.get(String.valueOf(j -1)) == null) {
//左方也為沒有處理過時
//新增Vector
Vector tmpVect = new Vector();
//在所產生的Vector中新增現在坐標、上方坐標
tmpVect.addElement(new Integer(j));
tmpVect.addElement(new Integer(j -1));
matchHash.put(String.valueOf(j), tmpVect);
matchHash.put(String.valueOf(j -1), tmpVect);
matchVec.addElement(tmpVect);
}else {
//左方為處理過時
Vector tmpVect = (Vector)matchHash.get(String.valueOf(j -1));
tmpVect.addElement(new Integer(j));
matchHash.put(String.valueOf(j), tmpVect);
}
}else {
//為已經處理過的坐標時
if(matchHash.get(String.valueOf(j -1)) == null) {
//左方為沒處理過時
Vector tmpVect = (Vector)matchHash.get(String.valueOf(j));
tmpVect.addElement(new Integer(j -1));
matchHash.put(String.valueOf(j -1), tmpVect);
}else {
//當左方為處理過時就結合
Vector curVect = (Vector)matchHash.get(String.valueOf(j));
Vector leftVect = (Vector)matchHash.get(String.valueOf(j -1));
if(! curVect.equals(leftVect)) {
int curVectSize = curVect.size();
for(int k=0; k < curVectSize; k++) {
Integer intge = (Integer)curVect.elementAt(k);
leftVect.addElement(intge);
matchHash.put(intge.toString(), leftVect);
}
matchVec.removeElement(curVect);
}
}
}
}else {
//目前的方塊與左方的方塊為不同Color時
pieces[j].isMatchLeft = false;
pieces[j -1].isMatchRight = false;
}
}else {
//左方為null時
pieces[j].isMatchLeft = false;
}
}else {
//現在的坐標為null時
if(i > ROW_LENGTH -1 && pieces[j -ROW_LENGTH] != null) {
//當不是在最上面時就將上面方塊的下方設為false
pieces[j -ROW_LENGTH].isMatchDown = false;
}
if(j % ROW_LENGTH != 0 && pieces[j -1] != null) {
//當不是在最左邊時就將左邊方塊的右邊設為false
pieces[j -1].isMatchRight = false;
}
}
}
}
return matchVec;
}
/** 進行暫?;蚴侵匦麻_始的方法 */
private void doPauseOrResume() {
if(isPaused) {
//暫停時
//重新開始
isPaused = false;
isStopped = false;
doThreadStart();
}else {
//不是暫停時
//暫停
isPaused = true;
doGameStop();
}
repaint();
}
/**
* 進行描繪的方法,通常不會從本身類直接調用
* @param g Graphics對象
*/
protected void paint(Graphics g) {
//將背景以白色清除
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, screenWidth, screenHeight);
String drawSt;
int drawX, drawY, stWidth;
int stHeight = defFont.getHeight();
g.setFont(defFont);
//根據游戲狀態來改變描繪內容
switch(gameState) {
case TITLE: //顯示標題時
//描繪標題圖像
drawX = (screenWidth - titleImg.getWidth()) /2;
g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);
//顯示最高分數
g.setColor(0x00000000);
drawSt = "High Score";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = titleImg.getHeight();
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);
//顯示著作權
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: //游戲開始時
//描繪游戲開始畫面
g.setColor(0x00000000);
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: //游戲結束時
Piece[] pieces = new Piece[COLUMN_LENGTH * ROW_LENGTH];
System.arraycopy(this.pieces, 0, pieces, 0, pieces.length);
g.setColor(0x00000000);
//將分數描繪在畫面左邊
drawSt = "S:" + String.valueOf(score);
g.drawString(drawSt, 0, 0, Graphics.TOP|Graphics.LEFT);
//顯示邊框榞傪昞帵
int widSize = ROW_LENGTH * Piece.WIDTH;
int heiSize = COLUMN_LENGTH * Piece.HEIGHT;
g.setColor(0x000000FF);
g.fillRect(0, screenHeight -heiSize -3, 3, heiSize +3); //左
g.fillRect(0, screenHeight -3, widSize +4, 3); //下
g.fillRect(widSize+4, screenHeight -heiSize -3, 3, heiSize +3); //右
g.setColor(0x0000FFFF);
g.drawLine(1, screenHeight -heiSize -3+1, 1, screenHeight -2); //左
g.drawLine(1, screenHeight -2, widSize+4, screenHeight -2); //下
g.drawLine(widSize +5, screenHeight -heiSize -3+1, widSize +5, screenHeight -2);//右
//Next piece
g.setColor(0x00000000);
drawSt = "Next";
stWidth = defFont.stringWidth(drawSt);
g.drawString(drawSt, widSize + 12, screenHeight -heiSize -3, Graphics.TOP|Graphics.LEFT);
if(! isPaused) {
//暫停時不描繪方塊
//描繪方塊部分
int loopCount = COLUMN_LENGTH * ROW_LENGTH;
for(int i=loopCount-1; i > -1; i=i-ROW_LENGTH) {
//由右下往上增加列
drawY = (Piece.HEIGHT * (i / ROW_LENGTH)) + screenHeight -heiSize -3;
for(int j=i; j > i -ROW_LENGTH; j--) {
//從右邊橫對該行橫向前進
if(pieces[j] != null) {
//不是null時進行描繪
drawX = (Piece.WIDTH * (j % ROW_LENGTH)) + 3;
pieces[j].doDraw(g, drawX, drawY);
}
}
}
//描繪下一個方塊
nextPieces[0].doDraw(g, widSize + Piece.WIDTH, screenHeight -heiSize -3 + stHeight);
nextPieces[1].doDraw(g, widSize + Piece.WIDTH *2 , screenHeight -heiSize -3 + stHeight);
}
//在暫停等畫面中顯示文字
switch(gameState) {
case GAME_PLAYING://游戲中
if(isPaused) {
//顯示代表游戲暫停的文字
drawSt = "Pause";
}else {
return;
}
break;
case GAME_END://游戲結束時
//顯示代表游戲結束的文字
drawSt = "Game over";
break;
default://在上述以外的狀況時為return
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;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -