📄 gamecanvas.java
字号:
if( gameState == STAGE_PLAYING && ! isPaused ||
gameState != STAGE_PLAYING ) {
//当不是在关卡中暂停时、
//或不是在关卡中时
//描绘拼图片的内容
for(int i=0; i < COLUMN_LENGTH; i++) {
drawY = (PIECE_HEIGHT +2) *i +screenHeight -heiSize -1;
for(int j=0; j < ROW_LENGTH; j++) {
if(pieces[(i *ROW_LENGTH) + j] != -1) {
drawX = (PIECE_WIDTH +2) *j +2;
g.setColor(0x00000000);
g.drawRect(drawX, drawY, PIECE_WIDTH, PIECE_HEIGHT);
switch((pieces[(i *ROW_LENGTH) + j] -1) / ROW_LENGTH) {
//对各列进行颜色变更
case 0:
g.setColor(0x00FF00FF); //粉红
g.fillRect(drawX, drawY, PIECE_WIDTH, PIECE_HEIGHT);
break;
case 1:
g.setColor(0x00FFFF00); //黄色
g.fillRect(drawX, drawY, PIECE_WIDTH, PIECE_HEIGHT);
break;
case 2:
g.setColor(0x0000FFFF); //水蓝
g.fillRect(drawX, drawY, PIECE_WIDTH, PIECE_HEIGHT);
break;
case 3://没有什么 //白
break;
}
//描绘各拼图板的编号
drawSt = String.valueOf(pieces[(i *ROW_LENGTH) + j]);
drawX = drawX + (
(PIECE_WIDTH - defFont.stringWidth(drawSt)
) /2);
g.setColor(0x00000000);
g.drawString(drawSt, drawX,
drawY + ((PIECE_HEIGHT - stHeight) /2),
Graphics.TOP|Graphics.LEFT);
}
}
}
}
////在暂停等画面中显示文字
switch(gameState) {
case STAGE_PLAYING://关卡中
if(isPaused) {
drawSt = "Pause";
}else {
return;
}
break;
case STAGE_CLEAR://过关时
drawSt = "Stage " + String.valueOf(stage) + " clear!";
break;
case ALL_STAGE_CLEAR://全部过关时
drawSt = "All stage clear!";
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 = STAGE_START;
doThreadStart();
}else if(c == exitCmd) {//Exit指令
//调用出NumberSliderPuzzle的doExit方法来将MIDlet本身结束
sliderPuzzle.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指令
//停止计时器
doTimerStop();
//删除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//显示标题
doTitle();
}
}
/** 在按键压下事件发生时被调用的方法 */
protected synchronized void keyPressed(int keyCode) {
if(gameState != STAGE_PLAYING ||
(gameState == STAGE_PLAYING && isPaused)) {
//若不是在关卡中、或是在关卡中的暂停状态时就是return
return;
}
int gameCode = getGameAction(keyCode);
switch(gameCode) {
case UP: //压下上按键时
doUp();
break;
case LEFT: //压下左按键时
doLeft();
break;
case DOWN: //压下下按键时
doDown();
break;
case RIGHT: //压下右按键时
doRight();
break;
}
}
/** 在按键压下的状态下重复被调用的方法 */
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
}
/** 压下上按键时被调用的方法 */
private void doUp() {
if( spaceIndex >= (COLUMN_LENGTH -1) * ROW_LENGTH &&
spaceIndex < COLUMN_LENGTH * ROW_LENGTH)
{
//当空白空间在最下方时为return
return;
}
//将下方的拼图片往上移动
pieces[spaceIndex] = pieces[spaceIndex +ROW_LENGTH];
//将下方的拼图片设为空白空间
pieces[spaceIndex +ROW_LENGTH] = -1;
//改变spaceIndex
spaceIndex = (short)(spaceIndex +ROW_LENGTH);
//再描绘
repaint();
//过关检查
doStageClearCheck();
}
/** 压下下按键时被调用的方法 */
private void doDown() {
if( spaceIndex >= 0 &&
spaceIndex < ROW_LENGTH)
{
//当空白空间在最上方时为return
return;
}
//将上方的拼图片往下移动
pieces[spaceIndex] = pieces[spaceIndex -ROW_LENGTH];
//将上方的拼图片设为空白空间
pieces[spaceIndex -ROW_LENGTH] = -1;
//变更spaceIndex
spaceIndex = (short)(spaceIndex -ROW_LENGTH);
//再描绘
repaint();
//过关检查
doStageClearCheck();
}
/** 按下左按键时被调用的方法 */
private void doLeft() {
if(spaceIndex % ROW_LENGTH == ROW_LENGTH -1)
{
//当空白空间在最右方时为return
return;
}
//将右方的拼图片往左移动
pieces[spaceIndex] = pieces[spaceIndex +1];
//将右方的拼图片设为空白空间
pieces[spaceIndex +1] = -1;
//变更spaceIndex
spaceIndex = (short)(spaceIndex +1);
//再描绘
repaint();
//过关检查
doStageClearCheck();
}
/** 按下右按键时被调用的方法 */
private void doRight() {
if(spaceIndex % ROW_LENGTH == 0)
{
//当空白空间在最左方时为return
return;
}
//将左方的拼图片往右移动
pieces[spaceIndex] = pieces[spaceIndex -1];
//将左方的拼图片设为空白空间
pieces[spaceIndex -1] = -1;
//改变spaceIndex
spaceIndex = (short)(spaceIndex -1);
//再描绘
repaint();
//过关检查
doStageClearCheck();
}
/** 线程的运作部分 */
public void run() {
try {
switch(gameState) {
case STAGE_START://关卡开始时
//先将标题的指令删除
removeCommand(startCmd);
removeCommand(exitCmd);
//显示关卡的开始画面
repaint();
Thread.sleep(1500);
//将状态设为关卡中,然后就此移动到关卡中的处理
gameState = STAGE_PLAYING;
case STAGE_PLAYING:
repaint();
addCommand(quitCmd);
if(! isPaused) {
//开始计时器
doTimerStart();
//新增指令
addCommand(pauseCmd);
}
break;
case STAGE_END://关卡结束时
//结束计时器
doTimerStop();
//删除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
repaint();
Thread.sleep(500);
//进行下一个关卡的准备
if(stage == MAX_STAGE) {
//当全部关卡都通过时
gameState = ALL_STAGE_CLEAR;
repaint();
Thread.sleep(5000);
//回到标题
doTitle();
}else {
//还有关卡的时候
//显示关卡结束画面
gameState = STAGE_CLEAR;
repaint();
Thread.sleep(2500);
//前进到下一个关卡
stage++;
doStageInit();
gameState = STAGE_START;
doThreadStart();
}
repaint();
break;
}
}catch(Exception e) {
}
}
/** 检查是否有过关的方法 */
private void doStageClearCheck() {
//当空白空间不在右下时
if(spaceIndex != pieces.length -1) {
return;
}
int loopCount = pieces.length -1;
for(int i=0; i < loopCount; i++) {
//依序检查各拼图片
if(pieces[i] != i+1) {
return;
}
}
//关卡过关时
//结束关卡
gameState = STAGE_END;
doThreadStart();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -