⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecanvas.java

📁 一个关于数字游戏的J2ME游戏
💻 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 + -