?? ketriscanvas.java.bak
字號:
import javax.microedition.lcdui.*;
/**
* <p>Title: </p>
* <p>Description: 該類為游戲畫布</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: www.jagie.com</p>
* @author: an unknown Japanese,Jagie
* @version 1.0
*/
public class KetrisCanvas
extends Canvas
implements CommandListener, Runnable {
//Midlet
protected KetrisGame ketris;
protected Command exitCmd;
protected Command startCmd;
protected int game; /* 游戲運行狀態 */
protected KetrisBlock block; /* 當前下墜物*/
protected KetrisMap map; /*游戲地圖*/
protected Thread thread; /* 重畫線程,該線程實現游戲畫布重畫機制 */
/*counter,maxCount這2個變量是用來控制游戲速度 */
protected int counter;
protected int maxCount;
protected final int GAME_INIT = 0; /* 游戲初始狀態 */
protected final int GAME_RUN = 1; /* 游戲運行狀態 */
protected final int GAME_OVER = 4; /* 游戲結束狀態 */
protected final int GAME_START_DEMO = 9; /* demo狀態,顯示demo的畫面 */
protected final int GAME_SUSPEND = 9; /* 掛起狀態,值與demo狀態同 */
protected boolean startDemoFlag; /*是否已經顯示過開始畫面*/
private static int mainWidth; /*屏幕寬度,在sun gray emulator上=180*/
private static int mainHeight; /*屏幕高度,在sun gray emulator上=177*/
public static int GAMEAREA_X; //游戲區域左上角x坐標,游戲區域為左邊的游戲容器區域和右邊的下一個下墜物顯示區域組成
public static int GAMEAREA_Y; //游戲區域左上角y坐標
public static int BRICK_WIDTH; //小磚塊的邊長
public static final int BACKGROUD = 0x000000; //背景顏色
public KetrisCanvas(KetrisGame ketris) {
this.ketris = ketris;
init();
map = new KetrisMap();
block = new KetrisBlock(map);
startCmd = new Command("開始", Command.OK, 0);
exitCmd = new Command("退出", Command.EXIT, 0);
addCommand(startCmd);
addCommand(exitCmd);
setCommandListener(this);
thread = new Thread(this);
thread.start();
}
/* 初始化,顯示demo畫面所需的設置 */
protected void init() {
this.mainHeight = getHeight();
this.mainWidth = getWidth();
//計算小磚塊寬度
int min = mainWidth;
if (mainHeight < min) {
min = mainHeight;
}
//游戲區域應該能被16整除
for (; min >= 0; min--) {
if (min % 16 == 0) {
break;
}
}
//游戲區域為min的方形,且min為16的倍數
BRICK_WIDTH = min / 16; //磚塊厚度
GAMEAREA_X = (mainWidth - min) / 2;
GAMEAREA_Y = (mainHeight - min) / 2;
startDemoFlag = false; //還沒有顯示開始畫面
game = GAME_START_DEMO; //游戲處于demo畫面狀態
}
public void run() {
while (true) {
try {
thread.sleep(50);
}
catch (InterruptedException e) {
break;
}
repaint();
}
}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) {
ketris.destroyApp(false);
ketris.notifyDestroyed();
}
else if (c == startCmd) {
//還沒有開始游戲或者游戲已結束
if (startDemoFlag == false||game == GAME_OVER) {
startDemoFlag = true;
game = GAME_INIT;
}
else {
//處于游戲中
if (game == GAME_SUSPEND) {
//如果處于掛起狀態,則進入運行狀態
game = GAME_RUN;
}
else if (game == GAME_RUN) {
//如果處于運行狀態,則進入掛起狀態
game = GAME_SUSPEND;
}
}
}
}
protected synchronized void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (action == Canvas.LEFT && game == GAME_RUN) { /* 左移 */
if (block.checkMove(1)) {
block.move(1);
}
}
else if (action == Canvas.RIGHT && game == GAME_RUN) { /* 右移 */
if (block.checkMove(2)) {
block.move(2);
}
}
else if (action == Canvas.UP && game == GAME_RUN) { /* 下墜塊變化 */
if (block.checkRot()) {
block.rotBlock();
}
}
else if (action == Canvas.DOWN && game == GAME_RUN) { /* 下移 */
if (block.checkDown(false)) {
block.down();
}
}
else if (action == Canvas.FIRE && game == GAME_RUN) { /* 下墜塊變化 */
if (block.checkRot()) {
block.rotBlock();
}
}
}
public void paint(Graphics g) {
if (game == GAME_START_DEMO) { /* 游戲處于demo畫面狀態 */
if (!startDemoFlag) {
//游戲還沒開始,顯示demo畫面
g.setColor(BACKGROUD);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 255, 0);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.drawString("歡迎進入俄羅斯方塊世界", mainWidth / 2, this.mainHeight / 4,
g.BASELINE | g.HCENTER);
Font f2 = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM);
g.setFont(f2);
g.drawString("Author 1:an unknown Japanese", mainWidth / 2,
mainHeight / 2,
g.BASELINE | g.HCENTER);
g.drawString("Author 2:Jagie(chen_cwf@163.com)", mainWidth / 2,
mainHeight / 2 + f2.getHeight(),
g.BASELINE | g.HCENTER);
g.drawString("Version:1.0", mainWidth / 2,
mainHeight / 2 + f2.getHeight() * 2,
g.BASELINE | g.HCENTER);
g.drawString("2003-04-17", mainWidth / 2,
mainHeight / 2 + f2.getHeight() * 3,
g.BASELINE | g.HCENTER);
}
/* 游戲第一次啟動 */
}
else if (game == GAME_INIT) {
//畫出游戲地圖(容器部分)
map.init();
map.paint(g);
block.init();
block.drawBlock(g);
block.drawNextBlock(g);
counter = 0;
maxCount = 8;
game = GAME_RUN;
}
else if (game == GAME_RUN) {
counter++;
if (counter >= maxCount) {
if (block.checkDown(true)) {
block.down();
block.paint(g);
}
else {
int y = block.getY();
block.paint(g);
block.fixBlock();
if (map.check(g, y)) {
map.repaintMap(g);
}
block.init();
y = block.getY();
if (y < 0) {
game = GAME_OVER;
}
block.drawBlock(g);
block.drawNextBlock(g);
}
counter = 0;
}
else {
block.paint(g);
}
}
else if (game == GAME_OVER) {
g.setColor(BACKGROUD);
g.fillRect(KetrisCanvas.GAMEAREA_X, KetrisCanvas.GAMEAREA_Y,
16 * KetrisCanvas.BRICK_WIDTH, 16 * KetrisCanvas.BRICK_WIDTH);
g.setColor(255, 0, 0);
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.drawString("Game Over",
KetrisCanvas.GAMEAREA_X + 8 * KetrisCanvas.BRICK_WIDTH,
KetrisCanvas.GAMEAREA_Y + 4 * KetrisCanvas.BRICK_WIDTH,
g.BASELINE | g.HCENTER);
}
}
public static void clear(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, mainWidth, mainHeight);
g.setColor(BACKGROUD);
g.fillRect(KetrisCanvas.GAMEAREA_X, KetrisCanvas.GAMEAREA_Y,
16 * KetrisCanvas.BRICK_WIDTH, 16 * KetrisCanvas.BRICK_WIDTH);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -