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

📄 gamecanvas.java

📁 几个不错的手机程序例子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

				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 + -