📄 gamecanvas.java
字号:
package game;
import javax.microedition.lcdui.*;
import java.util.Timer;
public class GameCanvas extends Canvas implements Runnable,CommandListener {
private static final short TITLE=0;//标题
private static final short STAGE_START=1;//关卡启动
private static final short STAGE_PLAYING=2;//关卡显示
private static final short STAGE_END=5;//关卡结束
private static final short STAGE_CLEAR=7;//过关
private static final short ALL_STAGE_CLEAR=9;//全部过关
private short gameState;//存储现在的关卡显示状态的变量
private boolean isPaused;//是否暂停
private int screenHeight;
private int screenWidth;
private Image titleImage;
private NumberSliderPuzzle sliderPuzzle;//存储NumberSliderPuzzle对象的变量
private long timeLong;//存储解谜所需的时间
private int stage;//存储现在关卡的变量
private static final int COLUMN_LENGTH=4;
private static final int ROW_LENGTH=4;
private static final int PIECE_WIDTH=35;
private static final int PIECE_HEIGHT=35;
private short[] pieces=new short[COLUMN_LENGTH*ROW_LENGTH];
private short spaceIndex;
private Font defFont=Font.getDefaultFont();
private Command startCmd=new Command("Start",Command.SCREEN,5);
private Command exitCmd=new Command("Exit",Command.EXIT,1);
private Command pauseCmd=new Command("Pause",Command.SCREEN,5);
private Command resumeCmd=new Command("Resume",Command.SCREEN,5);
private Command quitCmd=new Command("Quit",Command.EXIT,1);
private Timer timer=null;
GameCanvas(NumberSliderPuzzle sliderPuzzle) {
// TODO Auto-generated constructor stub
this.sliderPuzzle=sliderPuzzle;
screenHeight=getHeight();
screenWidth=getWidth();
setCommandListener(this);
try{
titleImage=Image.createImage("/res/title.png");
}catch(Exception e){}
gameState=TITLE;
}
private static final short[][] QUESTION_PIECES=new short[][]{
{
1, 5, 9, 13,
2, 6,10, 14,
3, 7,11, 15,
4, 8,12, -1
},
{
4, 3, 2, 1,
8, 7, 6, 5,
12, 11, 10, 9,
15, 13, 14,-1
},
{
12, 8, 4, 1,
15, 9, 5, 2,
13,10, 6, 3,
14,11, 7,-1
},
{
14,15,12,13,
8, 9,10,11,
4, 5, 6, 7,
1, 2, 3, -1
},
{
14,12,15,13,
11,10, 9, 8,
7, 6, 5, 4,
3, 2, 1,-1
}
};
private void doGameInit(){
stage=1;
isPaused=false;
doStageInit();
timeLong=0;
}
private void doStageInit(){
System.arraycopy(QUESTION_PIECES[stage-1], 0, pieces, 0, pieces.length);
/**Copies an array from the specified source array, beginning at the specified position,
to the specified position of the destination array*/
spaceIndex=(short)(pieces.length-1);
}
public void commandAction(Command c,Displayable s){
if(c==startCmd){
doGameInit();
gameState=STAGE_START;
doThreadStart();
}else if(c==exitCmd){
sliderPuzzle.doExit();
}else if(c==pauseCmd){
removeCommand(pauseCmd);
addCommand(resumeCmd);
doPauseOrResume();
}else if(c==resumeCmd){
removeCommand(resumeCmd);
addCommand(pauseCmd);
doPauseOrResume();
}else if(c==quitCmd){
doTimerStop();//记时器停止
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
doTitle();//显示标题
}
}
void doStartApp(){
switch(gameState){
case TITLE:
doTitle();
case STAGE_START:
case STAGE_PLAYING:
isPaused=true;
//以防万一先删掉关卡中的命令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
//addCommand(resumeCmd);
break;
default:
isPaused=false;
break;
}
}
private void doTitle(){
gameState=TITLE;
//以防万一先删掉关卡中的命令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
repaint();
addCommand(exitCmd);
addCommand(startCmd);
}
void doPauseApp(){
switch(gameState){
case TITLE:
break;
default:
doTimerStop();
isPaused=true;
break;
}
}
/**启动计时器的方法*/
private void doTimerStart(){
if(timer==null){
GameTimer gameTimer=new GameTimer(this);
timer=new Timer();
timer.schedule(gameTimer, 1000,1000);
}
}
private void doTimerStop(){
if(timer!=null){
timer.cancel();
timer=null;
}
}
void addSec(){
//增加计时器的计数让其再描绘
timeLong++;
repaint();
}
private static final int MAX_STAGE=QUESTION_PIECES.length;
private void doThreadStart(){
new Thread(this).start();
}
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){}
}
protected synchronized void keyPressed(int keyCode){
if(gameState!=STAGE_PLAYING || (gameState==STAGE_PLAYING && isPaused))
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;
}
pieces[spaceIndex]=pieces[spaceIndex+ROW_LENGTH];
pieces[spaceIndex+ROW_LENGTH]=-1;
spaceIndex=(short)(spaceIndex+ROW_LENGTH);
repaint();
doStageClearCheck();
}
private void doDown(){
if(spaceIndex>=0 && spaceIndex<ROW_LENGTH)
{
return;
}
pieces[spaceIndex]=pieces[spaceIndex-ROW_LENGTH];
pieces[spaceIndex-ROW_LENGTH]=-1;
spaceIndex=(short)(spaceIndex-ROW_LENGTH);
repaint();
doStageClearCheck();
}
private void doLeft(){
if(spaceIndex % ROW_LENGTH==ROW_LENGTH-1)
{
return;
}
pieces[spaceIndex]=pieces[spaceIndex+1];
pieces[spaceIndex+1]=-1;
spaceIndex=(short)(spaceIndex+1);
repaint();
doStageClearCheck();
}
private void doRight(){
if(spaceIndex % ROW_LENGTH==0)
{
return;
}
pieces[spaceIndex]=pieces[spaceIndex-1];
pieces[spaceIndex-1]=-1;
spaceIndex=(short)(spaceIndex-1);
repaint();
doStageClearCheck();
}
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();
}
private void doPauseOrResume(){
if(isPaused){
isPaused=false;
doTimerStart();
}else{
isPaused=true;
doTimerStop();
}
repaint();
}
protected void paint(Graphics g){
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, screenWidth,screenHeight);
g.setFont(defFont);
String drawSt;
int drawX,drawY,stWidth;
int stHeight=defFont.getHeight();
switch(gameState){
case TITLE:
drawX=(screenWidth-titleImage.getWidth())/2;
g.drawImage(titleImage, drawX, 0, Graphics.TOP|Graphics.LEFT);
g.setColor(0x00000000);
drawSt="Copyright 2006";
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 STAGE_START:
g.setColor(0x00000000);
drawSt="Stage"+String.valueOf(stage);
stWidth=defFont.stringWidth(drawSt);
drawX=(screenWidth-stWidth)/2;
drawY=(screenHeight-(stHeight*2))/2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
return;
default:
int widSize=ROW_LENGTH*(PIECE_WIDTH+2);
int heiSize=COLUMN_LENGTH*(PIECE_HEIGHT+2);
g.setColor(0x0000FFFF);
g.drawRect(1, screenHeight-heiSize-2, widSize, heiSize);
g.setColor(0x000000FF);
g.drawRect(0, screenHeight-heiSize-3, widSize+2, heiSize+2);
g.setColor(0x00000000);
int hour=(int)(timeLong/3600);
int minute=(int)((timeLong-(hour*3600))/60);
String minuteSt=String.valueOf(minute);
minuteSt=(minuteSt.length()<2?"0"+minuteSt:minuteSt);
int sec=(int)(timeLong-(hour*3600)-(minute*60));
String secSt=String.valueOf(sec);
secSt=(secSt.length()<2?"0"+secSt:secSt);
drawSt=String.valueOf(hour)+":"+minuteSt+":"+secSt;
stWidth=defFont.stringWidth(drawSt);
g.drawString(drawSt, (screenWidth-stWidth)/2,0,Graphics.TOP|Graphics.LEFT);
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, 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 + -