站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题TilePuzzle剖析(3)

TilePuzzle剖析(3)

摘要: TilePuzzle剖析(3)
TilePuzzle剖析(3)

作者:


前面我们看到了在Board类构造函数中的最有一条语句:
setState(INITIALIZED);
该语句调用setState()函数,其中参数表示游戏的运行状态,定义在Board类的全局变量处:
// state variables
static final int INITIALIZED = 0; //表示初始化
static final int PLAYING = 1; //表示正在运行
static final int WON = 2; //表示取得胜利
int gameState; //记录游戏状态

下面我们还是看一看setState函数吧!

void setState(int ns) {
gameState = ns; //纪录游戏状态
switch (gameState) {//根据游戏状态进行命令显示
case INITIALIZED: //初始化状态
addCommand(cmd[CMD_ABOUT]); //增加about
removeCommand(cmd[CMD_RESET]); //去掉reset
addCommand(cmd[CMD_START]); //增加start
addCommand(cmd[CMD_UNLOCK]); //增加unlock
addCommand(cmd[CMD_EXIT]); //增加exit
addCommand(cmd[CMD_OPTIONS]); //增加options
break;
case PLAYING: //正在游戏状态
addCommand(cmd[CMD_ABOUT]); //增加about
addCommand(cmd[CMD_RESET]); //增加reset
removeCommand(cmd[CMD_START]); //去掉start
removeCommand(cmd[CMD_UNLOCK]); //去掉unlock
addCommand(cmd[CMD_EXIT]); //增加exit
addCommand(cmd[CMD_OPTIONS]); //增加options
break;
case WON: //胜利
addCommand(cmd[CMD_ABOUT]); //增加about
removeCommand(cmd[CMD_RESET]); //去除reset
addCommand(cmd[CMD_START]); //增加start
addCommand(cmd[CMD_UNLOCK]); //增加unlock
addCommand(cmd[CMD_EXIT]); //增加exit
addCommand(cmd[CMD_OPTIONS]); //增加options
break;
}
}
最终通过命令处理来执行相应的动作:

public void commandAction(Command c, Displayable d) {//命令处理函数
switch (((BoardCommand) c).tag) { //根据得到的命令标签筛选动作
case CMD_ABOUT: //点击about
About.showAbout(Display.getDisplay(midlet));
break;
case CMD_EXIT: //点击exit
midlet.notifyDestroyed();
break;
case CMD_OPTIONS: //点击option
dpy.setCurrent(options);
break;
case CMD_RESET: //点击reset
cheated = false;
resetGrid();
setState(INITIALIZED);
repaint();
break;
case CMD_START: //点击start
cheated = false;

if (options.funny) {
rearrangeFunnily(options.hard);
} else {
randomize(options.hard);
}

setState(PLAYING); //设定状态为进行游戏
repaint(); //调用paint函数,更新游戏画面
break;
case CMD_UNLOCK: //点击unlock
cheated = true;
setState(PLAYING); //设定状态为进行游戏
repaint(); //调用paint函数,更新游戏画面
break;
}
}


要想知道屏幕会怎样显示,我们还得研究一下paint()函数。
public void paint(Graphics g) {
//清屏
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
//绘制方框
g.translate(gridx, gridy);
g.setColor(0);
g.drawRect(-2, -2, gridw*cellw + 2, gridh*cellh + 2);
//更新每一个小方块,调用piece.paint()
for (int j = 0; j < gridw; j++) {
for (int k = 0; k < gridh; k++) {
grid[j][k].paint(g);
}
}
//如果游戏状态为won,那么显示胜利
if (gameState == WON) {
g.translate(-g.getTranslateX(), -g.getTranslateY());
g.setColor(0);
g.setFont(Font.getDefaultFont());
g.drawString(
(cheated ? "CHEATER!" : "YOU WIN!"),
getWidth() / 2,
getHeight() - 1,
Graphics.BOTTOM|Graphics.HCENTER);
}
}




↑返回目录
前一篇: 关于图片的一些知识
后一篇: TilePuzzle剖析(2)