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

📄 gamecanvas.java

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

					case GAME_END://游戏结束时
						//显示游戏结束字符串
						drawSt = "Game over";
					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 = GAME_START;
			doThreadStart();

		}else if(c == exitCmd) {//EXIT指令
			//调用出SpaceShooter类别的doExit方法以结束MIDlet本身
			spaceShooter.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指令
			//调用出游戏结束方法
			doGameStop();
			//删除指令
			removeCommand(pauseCmd);
			removeCommand(resumeCmd);
			removeCommand(quitCmd);
			//显示标题
			doTitle();
		}
	}

	/** 按键按下事件发生时被调用出来的方法 */
	protected synchronized void keyPressed(int keyCode) {
		if(	gameState != GAME_PLAYING ||
			(gameState == GAME_PLAYING && isPaused)) {
		//非游戏中,或在游戏中暂停时为return
			return;
		}

		//为清除按键时不处理
		if(keyCode == 0) return;	//for KDDI

		int gameCode = getGameAction(keyCode);
		switch(gameCode) {
			case LEFT:	//按下向左按键时
				doLeft();
			break;

			case RIGHT:	//按下向右按键时
				doRight();
			break;

			case FIRE:	//按下Fire按键时
			case UP:	//按下向上按键时
				doFire();
			break;
		}
	}

	/** 压下按键状态时被重复调用的方法 */
	protected void keyRepeated(int keyCode) {
		keyPressed(keyCode);
	}

	/** 线程的运作部分 */
	public void run() {
		try {
			switch(gameState) {
				case GAME_START:	//游戏开始时
					//先将标题的指令删除
					removeCommand(startCmd);
					removeCommand(exitCmd);

					//显示游戏开始画面
					repaint();
					Thread.sleep(1500);

					//新增指令
					addCommand(quitCmd);
					if(! isPaused) {
						addCommand(pauseCmd);
					}

					//将状态设为游戏中,然后就此转移到游戏中的处理
					gameState = GAME_PLAYING;

				case GAME_PLAYING:	//游戏中
					repaint();
					//游戏结束标志
					boolean isGameOver = false;

					//开始游戏循环
					while(! isStopped) {//在Stop前持续循环
						//再描绘
						repaint();

						//移动自机(利用在爆炸显示时)
						myShip.doMove();

						//UFO处理
						for(int i=0; i < ufos.length; i++) {
							if(ufos[i].isAlive()) {
							//只处理在Alive状态的UFO
								//移动UFO
								ufos[i].doMove();
								if(! ufos[i].isAlive() ||
									ufos[i].getX()+ufos[i].getWidth() < 0 ||
									ufos[i].getX() > screenWidth) {
								//移动UFO之后不是Alive状态时
								//或是UFO跑到画面外时
									//设定UFO不是Alive状态,减少UFO数目
									ufos[i].setAlive(false);
									ufoCount--;

									//若UFO为命中状态的话,在分数中新增DEFAULT_SCORE
									if(ufos[i].isHit()) score = score + DEFAULT_SCORE;

								}else if(ufoMissileCount < ufoMissiles.length &&
										ufos[i].isDropBomb()) {
								//UFO在Alive状态下发射飞弹时
									//进行炸弹处理
									//在飞弹数组中寻找不是Alive状态的飞弹
									for(int j=0; j < ufoMissiles.length; j++) {
										if(! ufoMissiles[j].isAlive()) {
										//不是Alive状态的飞弹时
											//符合飞弹的座标来攻击
											ufoMissiles[j].setX((
												ufos[i].getWidth() - ufoMissiles[j].getWidth()) /2 +
														ufos[i].getX());
											ufoMissiles[j].setY(ufos[i].getY() + ufos[i].getHeight());
											ufoMissiles[j].setAlive(true);
											ufoMissileCount++;
											break;
										}
									}
								}
							}
						}// end for

						//UFO飞弹处理
						for(int i=0; i < ufoMissiles.length; i++) {
							if(ufoMissiles[i].isAlive()) {
							//只处理Alive状态的UFO飞弹
								//移动UFO飞弹
								ufoMissiles[i].doMove();

								//命中判定
								if(myShip.isOverlaps(ufoMissiles[i])) {
								//UFO飞弹与自机重叠时
									myShip.setHit(true);
									//删除飞弹
									ufoMissiles[i].setAlive(false);
									ufoMissileCount--;

									//减少生命点数
									lives--;
									if(lives < 1) {
									//当生命点数用完时
										//删除指令
										removeCommand(pauseCmd);
										removeCommand(resumeCmd);
										removeCommand(quitCmd);
										//建立游戏结束标志
										isGameOver = true;
										//抽出for语法
										break;
									}

								}else if(ufoMissiles[i].getY() > getHeight()) {
								//UFO飞弹跑到画面外时
									//将UFO飞弹设为无效
									ufoMissiles[i].setAlive(false);
									ufoMissileCount--;
								}
							}
						}

						//自机飞弹处理
						for(int i=0; i < myMissiles.length; i++) {
							if(myMissiles[i].isAlive()) {
							//只处理Alive状态的自机飞弹
								//移动自机飞弹
								myMissiles[i].doMove();

								//命中判定
								for(int j=0; j < ufos.length; j++) {
									if(ufos[j].isAlive() && ! ufos[j].isHit()) {
									//当UFO为在Alive状态,而不是被击中状态时
										if(ufos[j].isOverlaps(myMissiles[i])) {
										//自机飞弹与UFO重叠时
											//将UFO设为击中状态
											ufos[j].setHit(true);

											//删除飞弹
											myMissiles[i].setAlive(false);
											myMissileCount--;
											break;
										}
									}
								}
							}
							if(	myMissiles[i].isAlive() &&
								myMissiles[i].getY() + myMissiles[i].getHeight() < SCORE_AREA)
							{
							//从画面消失时
								//删除自机飞弹
								myMissiles[i].setAlive(false);
								myMissileCount--;
							}
						}// end for

						if(isGameOver) {
						//当游戏结束标志建立时
							//删除指令
							removeCommand(pauseCmd);
							removeCommand(resumeCmd);
							removeCommand(quitCmd);

							//结束这个循环
							doGameStop();

							//显示游戏结束,再等待一段时间后显示标题
							gameState = GAME_END;
							repaint();
							Thread.sleep(5000);
							doTitle();
							break;

						}else {
						//游戏未结束时
							//让UFO出现
							doEmerge4UFO();
							//在描绘间隔中待命
							Thread.sleep(DRAW_INTERVAL);
						}
					}// end while
				break;
			}
		}catch(Exception e) {}
	}

	/** 左按键被压下时所调用的方法 */
	private void doLeft() {
		//向左移动自机大小的一半
		int tmpX = myShip.getX() - (myShip.getWidth() /2);
		if(tmpX < 0) {
			tmpX = 0;
		}
		myShip.setX(tmpX);
	}

	/** 右按键被压下时所调用的方法 */
	private void doRight() {
		//向右移动自机大小的一半
		int tmpX = myShip.getX() + (myShip.getWidth() /2);
		if(tmpX > screenWidth -myShip.getWidth()) {
			tmpX = screenWidth -myShip.getWidth();
		}
		myShip.setX(tmpX);
	}

	/** 按下决定按键、下按键时被调用的方法 */
	private void doFire() {
		if(myMissileCount < myMissiles.length) {
		//比飞弹数的上限还少时
			for(int i=0; i < myMissiles.length; i++) {
				if(! myMissiles[i].isAlive()) {
				//自机飞弹不是Alive状态时
					//发射飞弹
					myMissiles[i].setX((myShip.getWidth() - myMissiles[i].getWidth()) /2 +
										myShip.getX());
					myMissiles[i].setY(myShip.getY() - myMissiles[i].getHeight());
					myMissiles[i].setAlive(true);
					myMissileCount++;
					break;
				}
			}
		}
	}

	/** 要让UFO出现时所调用的方法 */
	private void doEmerge4UFO() {
		//在Tick计数中增加1
		tickCount4UFO++;
		if(ufoCount < 1 || tickCount4UFO > 4) {
		//UFO为0时,或是是Tick计数比4还大时
			tickCount4UFO = 0;

			if(ufoCount < ufos.length) {
			//UFO的数目比上限还少时

				//取得乱数的int值
				int tmpInt = random.nextInt() % 2;
				if(tmpInt == 1 || tmpInt == -1) {
				//让其出现时

					tmpInt = random.nextInt() % 2;
					//寻找不是Alive状态的UFO
					UFO ufo;
					for(int i=0; i < ufos.length; i++) {
						if(! ufos[i].isAlive()) {
							if(tmpInt == 0) {
							//从右边出现时
								tmpInt = random.nextInt() % 2;//改变高度
								if(tmpInt < 0) tmpInt = tmpInt* (-1);
								ufos[i].setDirection(UFO.DIRECTION_RIGHT);
								ufos[i].setX(0 +2);
								ufos[i].setY(SCORE_AREA + (((ufos[i].getHeight() +2) *2) * tmpInt));

							}else {
							//从左边出现时
								tmpInt = random.nextInt() % 2;//改变高度
								if(tmpInt < 0) tmpInt = tmpInt* (-1);
								ufos[i].setDirection(UFO.DIRECTION_LEFT);
								ufos[i].setX((screenWidth - ufos[i].getWidth() / 2) -2);
								ufos[i].setY(SCORE_AREA +
											(((ufos[i].getHeight() +2) *2) * tmpInt) +
											(ufos[i].getHeight() +2));
							}
							ufos[i].setAlive(true);
							ufoCount++;
							break;
						}
					}
				}
			}
		}
	}

	/** 设定最高分数的方法 */
	private void setHighScore(long score) {
		if(score > highScore) {
			highScore = score;
		}
	}
}

⌨️ 快捷键说明

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