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

📄 planecanvas.java

📁 用J2ME写的射击游戏。玩法简单
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
					// 调用退出方法
					PlaneMIDlet.quitApp();
					break;
				}
				break;
			}
		}
	}

	/** 游戏帮助界面按键功能块 */
	private void helpKeyPressed(int keyCode) {
		if (gameState == GAME_HELP) {
			if (keyCode == -6) {
				gameState = GAME_MENU;
				delay = 0;
			}
			if (keyCode == -7) {
				gameState = GAME_SETTING;
				delay = 0;
			}
		}
	}

	/** 游戏设置界面按键功能块 */
	private void settingKeyPressed(int keyCode) {
		int action = getGameAction(keyCode);
		if (gameState == GAME_SETTING) {
			if (keyCode == -6) {
				gameState = GAME_MENU;
				delay = 0;
			}
			if (keyCode == -7) {
				gameState = GAME_READING;
				delay = 0;
			}
			switch (action) {
			case UP:
			case LEFT:
				if (settingIndex > 0) {
					settingIndex--;
				} else {
					settingIndex = gameSpeedStr.length - 1;
				}
				break;
			case DOWN:
			case RIGHT:
				if (settingIndex < gameSpeedStr.length - 1) {
					settingIndex++;
				} else {
					settingIndex = 0;
				}
				break;
			case FIRE:
				switch (settingIndex) {
				case FAST: // 快速
					sleepTime = 80;
					break;
				case NORMAL: // 正常
					sleepTime = 100;
					break;
				case SLOW: // 慢速
					sleepTime = 150;
					break;
				}
				delay = -100;
				break;
			}
		}
	}

	/** 游戏说明界面按键功能块 */
	private void readKeyPressed(int keyCode) {
		if (gameState == GAME_READING) {
			if (keyCode == -6 || keyCode == -7) {
				gameState = GAME_MENU;
				delay = 0;
			}
		}
	}

	/** 游戏执行中的按键功能块 */
	private void gameKeyPressed(int keyCode) {
		int action = getGameAction(keyCode);
		if (gameState == GAME_CONTINUE) {
			if (keyCode == -6) {
				if (popMenuOpen) {
					return;
				}
				if (leftPauseSwitch) {
					leftPauseSwitch = false;
				} else {
					leftPauseSwitch = true;
				}
			}
			if (keyCode == -7) {
				if (popMenuOpen) {
					popMenuOpen = false;
				} else {
					popMenuOpen = true;
				}
			}
			if (popMenuOpen) { // 右键菜单打开时
				switch (action) {
				case UP:
				case LEFT:
					if (popMenuIndex > 0) {
						popMenuIndex--;
					} else {
						popMenuIndex = popMenuStr1.length - 1;
					}
					break;
				case DOWN:
				case RIGHT:
					if (popMenuIndex < popMenuStr1.length - 1) {
						popMenuIndex++;
					} else {
						popMenuIndex = 0;
					}
					break;
				case FIRE:
					switch (popMenuIndex) {
					case 0: // 储存进度
						gameState = GAME_SAVING;
						delay = 0;
						break;
					case 1: // 开启或关闭无敌
						if (unlock) {
							unlock = false;
						} else {
							unlock = true;
						}
						runRightMenuIndex = 1;
						break;
					case 2: // 重闯本关
						popMenuOpen = false;
						gameState = GAME_CONTINUE;
						gateState = GATE_OPEN;
						// 存储器刷新
						clearArray();
						break;
					case 3: // 退出任务(返回主界面)
						popMenuOpen = false;
						gameState = GAME_MENU;
						gateState = GATE_OPEN;
						// 存储器刷新
						clearArray();
						break;
					}
					break;
				}
			} else { // 右键菜单关闭状态
				switch (action) {
				case UP:
					repeat = 0;
					break;
				case DOWN:
					repeat = 1;
					break;
				case LEFT:
					repeat = 2;
					break;
				case RIGHT:
					repeat = 3;
					break;
				case FIRE:
					if (pp[13] == 1) {
						// 分值减少
						pp[11] -= INVINCIBILITY_COST;
						// 炮弹左上x坐标
						int x = pp[3] + (pp[6] - 10) / 2;
						// 炮弹左上y坐标
						int y = pp[4] + 12;
						// 释放必杀技
						Invincibility_Logicol(x, y, 0);
					}
					break;
				default:
					repeat = -1;
					break;
				}
			}
		}
	}

	/** 关卡或游戏失败界面的按键功能块 */
	private void overKeyPressed(int keyCode) {
		if (keyCode == -6) {
			// 左键暂停功能开着,则……
			if (leftPauseSwitch) {
				// 玩家不放弃,重玩当前关卡
				popMenuOpen = false;
				leftPauseSwitch = false;
				gameState = GAME_CONTINUE;
				gateState = GATE_OPEN;
				delay = 0;
				times = 0;
				shotDelay = 0;
			}
		}
	}

	/** 获得状态栏显示数据 */
	private void getBarSreDate() {
		// 关卡数
		barStr[0] = String.valueOf(gate);
		// 级别
		barStr[1] = String.valueOf(pp[14]);
		// 得分
		barStr[2] = String.valueOf(pp[11]);
		// 剩余生命
		barStr[3] = String.valueOf(LIFE - pp[12] + 1);
	}

	/** 状态栏绘制 */
	private void drawBar(Graphics g) {
		if (gameState == GAME_CONTINUE & gateState == GATE_CONTINUE) {
			switch (pp[13]) {
			case 0:
				g.drawImage(bar0Img, 0, 309, Graphics.BOTTOM | Graphics.LEFT);
				break;
			case 1:
				g.drawImage(bar1Img, 0, 309, Graphics.BOTTOM | Graphics.LEFT);
				break;
			}
			g.setColor(255, 0, 0);
			g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
					Font.SIZE_MEDIUM));
			g.drawString(barStr[0], 36, 294, Graphics.TOP | Graphics.RIGHT);
			g.drawString(barStr[1], 76, 294, Graphics.TOP | Graphics.RIGHT);
			g.drawString(barStr[2], 156, 294, Graphics.TOP | Graphics.RIGHT);
			g.drawString(barStr[3], 195, 294, Graphics.TOP | Graphics.RIGHT);
		}
	}

	/** 绘制游戏主菜单界面 */
	private void drawGameMenu(Graphics g) {
		g.drawImage(menuImg, 0, 0, Graphics.TOP | Graphics.LEFT);
		for (int i = 0; i < 6; i++) {
			if (menuIndex == i) {
				g.setColor(0, 255, 0);
				if (delay % 4 < 2) {
					g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,
							Font.STYLE_BOLD | Font.STYLE_UNDERLINED,
							Font.SIZE_LARGE));
				} else {
					g.setFont(font);
				}
			} else {
				g.setFont(font);
				g.setColor(255, 0, 0);
			}
			g.drawString(menuStr[i], width / 2, 130 + i * 25, Graphics.TOP
					| Graphics.HCENTER);
		}
	}

	/** 绘制游戏设置界面 */
	private void drawGameSetting(Graphics g) {
		g.drawImage(settingImg, 0, 0, Graphics.TOP | Graphics.LEFT);
		if (delay < 0) {
			g.setFont(font);
			g.setColor(0, 255, 0);
			g.drawString("游戏速度已设定为:" + gameSpeedStr[settingIndex], width / 2,
					170, Graphics.TOP | Graphics.HCENTER);
			g.setColor(3, 27, 205);
			g.fillRect(0, 210, width, 50);
			delay = -100;
			return;
		}
		for (int i = 0; i < 3; i++) {
			if (settingIndex == i) {
				g.setColor(0, 255, 0);
				if (delay % 4 < 2) {
					g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,
							Font.STYLE_BOLD | Font.STYLE_UNDERLINED,
							Font.SIZE_LARGE));
				} else {
					g.setFont(font);
				}
			} else {
				g.setFont(font);
				g.setColor(255, 0, 0);
			}
			g.drawString(gameSpeedStr[i], width / 2, 150 + i * 25, Graphics.TOP
					| Graphics.HCENTER);
		}
	}

	/** 绘制游戏失败界面 */
	private void drawGameFail(Graphics g) {
		if (delay < 30) {
			g.drawImage(failImg, 0, 0, Graphics.TOP | Graphics.LEFT);
		} else if (delay < 91) {
			// 辅助界面显示开关
			leftPauseSwitch = true;
			popMenuOpen = false;
			// 绘制文字
			g.setColor(0);
			g.fillRect(0, 0, width, height);
			g.setFont(font);
			g.setColor(0, 255, 0);
			g.drawString("不 轻 言 放 弃", width / 2, 100, Graphics.TOP
					| Graphics.HCENTER);
			g.drawString("就 继 续 努 力", width / 2, 122, Graphics.TOP
					| Graphics.HCENTER);
			// 倒计时显示(60)
			g.setColor(5, 253, 238);
			g.drawRect(57, 152, 121, 8);
			g.setColor(0, 255, 0);
			g.fillRect(58, 153, (delay - 30) * 2, 7);
			g.setColor(253, 238, 5);
			g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN,
					Font.SIZE_MEDIUM));
			g.drawString("【倒计时完毕将返回主菜单】", width / 2, 172, Graphics.TOP
					| Graphics.HCENTER);
			// 绘制左软键继续游戏提示
			drawContinue(g);
		}
	}

	/** 绘制左软键继续游戏提示 */
	private void drawContinue(Graphics g) {
		if (gameState == GAME_OVER || gameState == GAME_CONTINUE) {
			if (leftPauseSwitch & !popMenuOpen) {
				g.setColor(255, 0, 0);
				g.setFont(font);
				g.drawString("继续", 5, height - 15, Graphics.BOTTOM
						| Graphics.LEFT);
			}
		}
	}

	/** 绘制右软键菜单 */
	private void drawRightMenu(Graphics g) {
		if (gameState == GAME_CONTINUE & popMenuOpen == true) {
			// 绘制底色
			g.setColor(3, 27, 205);
			g.fillRect(width - 84, height - 105, 83, 89);
			// 绘制边框
			g.setColor(255, 0, 0);
			g.drawRect(width - 85, height - 106, 84, 90);
			for (int i = 0; i < popMenuStr1.length; i++) {
				if (popMenuIndex == i) {
					g.setColor(0, 255, 0);
				} else {
					g.setColor(255, 0, 0);
				}
				g.setFont(font);
				// 根据必杀技开启状态选择绘制右键菜单
				if (unlock) { // 已开启必杀技
					g.drawString(popMenuStr2[i], width - 12, height - 100 + i
							* 20, Graphics.TOP | Graphics.RIGHT);
				} else { // 未开启必杀技
					g.drawString(popMenuStr1[i], width - 12, height - 100 + i
							* 20, Graphics.TOP | Graphics.RIGHT);
				}
			}
		}
	}

	/** 右键菜单选项执行信息绘制 */
	private void drawRightMenuRunInfo(Graphics g) {
		if (!popMenuOpen || gameState != GAME_CONTINUE
				|| gateState != GATE_CONTINUE) {
			return;
		}
		switch (runRightMenuIndex) {
		case 0: // 存盘

			break;
		case 1: // 作弊
			g.setColor(255, 0, 0);
			g.setFont(font);
			if (popMenuIndex == 1) {
				if (unlock) {
					g.drawString("【已处于无敌状态】", width / 2, 140, Graphics.TOP
							| Graphics.HCENTER);
				} else {
					g.drawString("【已解除无敌状态】", width / 2, 140, Graphics.TOP
							| Graphics.HCENTER);
				}
			}
			break;
		}
	}

	/**
	 * 加载或存盘界面绘制
	 * 
	 * @param sys_state操作状态标识,0加载,1存盘
	 * @param g画笔
	 */
	public void loadOrSave(Graphics g, int sys_state) {
		// 绘制底色
		g.setColor(0);
		g.fillRect(0, 0, width, height);
		if (!record && gameState == GAME_LOADING) {
			g.setFont(font);
			g.setColor(0, 255, 0);
			g.drawString("【游戏存档不存在或未发现】", width / 2, 150, Graphics.TOP
					| Graphics.HCENTER);
			if (delay > 10) {
				gameState = GAME_MENU;
				delay = 0;
				return;
			}
			return;
		}
		// 设置剪切区域
		g.setClip(92, 250 - 44 - delay * 4, 57, 44);
		// 绘制飞机动画
		g.drawImage(loadSaveImg, 92 - delay % 3 * 57, 250 - 44 - delay * 4,
				Graphics.TOP | Graphics.LEFT);
		// 恢复剪切区域
		g.setClip(0, 0, width, height);
		// 设置字体、前景色
		g.setFont(font);
		g.setColor(0, 255, 0);
		switch (sys_state) {
		case LOADING: // 加载游戏进度
			g.drawString("正在加载存档...", width / 2, 250, Graphics.TOP
					| Graphics.HCENTER);
			break;
		case SAVING: // 存储游戏进度
			g.drawString("正在存储游戏...", width / 2, 250, Graphics.TOP
					| Graphics.HCENTER);
			break;
		}
		// 绘制进度条框
		g.setColor(5, 56, 248);
		g.drawRect(68, 278, 103, 8);
		// 绘制进度条
		g.setColor(0, 255, 0);
		g.fillRect(70, 280, delay * 2, 5);
	}

	/** 玩家被击中:敌人炮弹同玩家飞机的碰撞检测及碰撞处理、数据存储等 */
	private void collidesWithPP() {
		// 玩家飞机处于新生状态不进行此操作
		if (pp[9] == 1 & pp[1] == 1 & gameState == GAME_CONTINUE
				& gateState == GATE_CONTINUE) {
			for (int i = 0; i < eb.length; i++) { // 敌人炮弹
				if (eb[i][1] == 1) {
					// 缩小玩家飞机碰撞区域为:20*20
					if (collision(pp[3] + 7, pp[4] + 3, pp[6] - 14, pp[7] - 6,
							eb[i][2], eb[i][3], eb[i][4], eb[i][5])) {
						// 炮弹不再可见
						eb[i][1] = 0;
						// 动画数据存储
						for (int k = 0; k < ppBlast.length; k++) {
							// 找空位
							if (ppBlast[k][0] == 0) {
								// 爆炸可见
								ppBlast[k][0] = 1;
								// 爆炸帧
								ppBlast[k][1] = 1;
								// 爆炸x坐标
								ppBlast[k][2] = pp[3] - 8;
								// 爆炸y坐标
								ppBlast[k][3] = pp[4] - 13;
							}
						}
						// 玩家飞机生命值处理
						pp[5] -= eb[i][6];
						if (pp[5] <= 0) {
							pp[1] = 0;
							// 玩家飞机复活(在其中添加复活记录,并判断是否游戏失败)
							ppRevival();
						}
					}
				}
			}
		}
	}

	/** 玩家飞机复活 */
	private void ppRevival() {
		// 添加复活记录(共六次生命机会,可复活5次)
		if (pp[1] == 0) {
			pp[12]++;
			if (pp[12] > LIFE) {
				gateState = GATE_CLOSE;
			} else {
				// 在屏幕起始位置复活(也可以在原位复活,把死亡时的x、y赋值给中间变量,再转赋给新生后的x、y即可)
				createPP();
			}
		}
	}

	/** 绘制玩家飞机爆炸动画 */
	private void drawPPBlast(Grap

⌨️ 快捷键说明

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