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

📄 gamecanvas.java

📁 几个不错的手机程序例子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * GameCanvas.java
 *
 * Copyright 2001 SkyArts. All Rights Reserved.
 */
import javax.microedition.lcdui.*;
import java.util.Timer;

/**
 * NumberSliderPuzzle的游戏内容描绘与操作所用的类
 *
 * @author  Hideki Yonekawa
 * @version 1.0
 */
class GameCanvas extends Canvas implements Runnable, CommandListener {
	/** 存放宽度的变量 */
	private int					screenWidth;
	/** 存放高度的变量 */
	private int					screenHeight;

	/** 存放NumberSliderPuzzle对象的变量 */
	private NumberSliderPuzzle	sliderPuzzle;

	/** 暂停状态所用的标志 */
	private boolean				isPaused;

	/** Start指令变量 */
	private Command				startCmd		= new Command("Start", Command.SCREEN, 5);
	/** Exit指令变量 */
	private Command				exitCmd			= new Command("Exit", Command.SCREEN, 1);
	/** Pause指令变量 */
	private Command				pauseCmd		= new Command("Pause", Command.SCREEN, 5);
	/** Resume指令变量 */
	private Command				resumeCmd		= new Command("Resume", Command.SCREEN, 5);
	/** Quit指令变量 */
	private Command				quitCmd			= new Command("Quit", Command.SCREEN, 1);

	/** 储存默认字体的变量 */
	private Font				defFont				= Font.getDefaultFont();

	/** 储存解谜所需时间的变量 */
	private long				timeLong;

	/** 操作所需时间的计时器时所使用的Timer变量 */
	private Timer				timer				= null;

	/** 储存各关卡谜题资讯的变量 */
	private static final short[][] QUESTION_PIECES	= new short[][] {
		{	//关卡1的谜题
			 1,  5,  9, 13,
			 2,  6, 10, 14,
			 3,  7, 11, 15,
			 4,  8, 12, -1
		},
		{	//关卡2的谜题
			 4,  3,  2,  1,
			 8,  7,  6,  5,
			12, 11, 10,  9,
			15, 13, 14, -1
		},
		{	//关卡3的谜题
			12,  8,  4,  1,
			15,  9,  5,  2,
			13, 10,  6,  3,
			14, 11,  7, -1
		},
		{	//关卡4的谜题
			14, 15, 12, 13,
			 8,  9, 10, 11,
			 4,  5,  6,  7,
			 1,  2,  3, -1
		},
		{	//关卡5的谜题
			14, 12, 15, 13,
			11, 10,  9,  8,
			 7,  6,  5,  4,
			 3,  2,  1, -1
		}
	};

	/** 储存现在关卡的变量 */
	private int					stage;
	/** 储存最高关卡数的常量 */
	private static final int	MAX_STAGE			= QUESTION_PIECES.length;

	/** 代表拼图板的列(纵向)数的常量 */
	private static final int	COLUMN_LENGTH		= 4;
	/** 代表拼图板的行(横向)数的常量 */
	private static final int	ROW_LENGTH		= 4;

	/** 代表拼图片的横宽的常量 */
	private static final int	PIECE_WIDTH		= 25;
	/** 代表拼图片的高度的常量 */
	private static final int	PIECE_HEIGHT		= 25;

	/** 储存显示于画面的拼图板资讯的变量 */
	private short[]				pieces		= new short[COLUMN_LENGTH * ROW_LENGTH];

	/** 储存现在空白空间的Index的变量 */
	private short				spaceIndex;

	/** 代表标题显示状态的常量 */
	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 Image				titleImg;

	/**
	 * 构造函数
	 * @param sliderPuzzle	NumberSliderPuzzle
	 */
	GameCanvas(NumberSliderPuzzle sliderPuzzle) {
		this.sliderPuzzle = sliderPuzzle;

		//画面的描绘范围的取得
		screenWidth = getWidth();
		screenHeight = getHeight();

		//登录注册Command listener
		setCommandListener(this);

		//取得标题图像
		try {
			titleImg = Image.createImage("/title.png");
		}catch(Exception e) {}

		//游戏的状态指定为显示标题
		gameState = TITLE;
	}

	/** 将使用在各关卡的变量加以初始化的方法 */
	private void doGameInit() {
		stage = 1;
		isPaused = false;
		doStageInit();
		timeLong = 0;
	}

	/** 将使用在各关卡的变量加以初始化的方法 */
	private void doStageInit() {
		//设定各关卡的谜题
		System.arraycopy(QUESTION_PIECES[stage -1], 0, pieces, 0, pieces.length);
		//将空白空间放到右下
		spaceIndex = (short)(pieces.length -1);
	}

	/** MIDlet的startApp()被调用出来时所调用的方法 */
	void doStartApp() {
		//根据现在的状态来选择运作
		switch(gameState) {
			case TITLE:			//显示标题时
				doTitle();
			break;

			case STAGE_START:	//关卡开始时
			case STAGE_PLAYING:	//关卡中
				//暂停
				isPaused = true;
				//以防万一先删除关卡中的指令
				removeCommand(pauseCmd);
				removeCommand(resumeCmd);
				//新增Resume指令
				addCommand(resumeCmd);
			break;

			default:			//上述以外的时候
				//解除暂停
				isPaused = false;
			break;
		}
	}

	/** MIDlet的pauseApp()被调用出来时所调用的方法 */
	void doPauseApp() {
		switch(gameState) {
			case TITLE:			//标题显示时
			break;

			default:			//上述以外的时候
				//暂停
				doTimerStop();
				isPaused = true;
			break;
		}
	}

	/** 进行标题显示的方法 */
	private void doTitle() {
		//将游戏的状态显示在标题上
		gameState = TITLE;

		//以防万一先删除关卡中的指1令
		removeCommand(pauseCmd);
		removeCommand(resumeCmd);
		removeCommand(quitCmd);

		//显示标题画面
		repaint();
		//新增指令
		addCommand(exitCmd);
		addCommand(startCmd);
	}

	/** 调用到计时器的方法 */
	void addSec() {
		//增加计时器的计数让其再描绘
		timeLong++;
		repaint();
	}

	/** 启动描绘线程的方法 */
	private void doThreadStart() {
		new Thread(this).start();
	}

	/** 启动计时器的方法 */
	private void doTimerStart() {
		//计时器不是null的时候就启动计时器
		if(timer == null) {
			GameTimer gameTimer = new GameTimer(this);
			timer = new Timer();
			timer.schedule(gameTimer, 1000, 1000);
		}
	}

	/** 停止计时器的方法 */
	private void doTimerStop() {
		//计时器不是null的时候就停止计时器
		if(timer != null) {
			timer.cancel();
			timer = null;
		}
	}

	/** 进行暂停或重新开始的方法 */
	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 - titleImg.getWidth()) /2;
				g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);

				//着作权的显示
				g.setColor(0x00000000);
				drawSt = "Copyright 2001";
				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);

				drawSt = "Start!!";
				stWidth = defFont.stringWidth(drawSt);
				drawX = (screenWidth - stWidth) / 2;
				g.drawString(drawSt, drawX, drawY + stHeight, 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);//加上0变成两位数
				int sec = (int)(timeLong - (hour * 3600) - (minute * 60));
				String secSt = String.valueOf(sec);
				secSt = (secSt.length() < 2 ? "0"+secSt : secSt);//加上0变成两位数傞
				drawSt = String.valueOf(hour) + ":" + minuteSt + ":" + secSt;
				stWidth = defFont.stringWidth(drawSt);
				g.drawString(drawSt, (screenWidth-stWidth) / 2, 0, Graphics.TOP|Graphics.LEFT);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -