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

📄 planecanvas.java

📁 用J2ME写的射击游戏。玩法简单
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
							if (ep[j][1] == 1) {
								if (Math.abs(ep[j][2] - pb[i][2])
										+ Math.abs(ep[j][3] - pb[i][3]) < distance) {
									// 得到可见敌机最近距离
									distance = Math.abs(ep[j][2] - pb[i][2])
											+ Math.abs(ep[j][3] - pb[i][3]);
								}
							}
						}
						for (int j = 0; j < ep.length; j++) { // 敌人飞机
							// 得到最近距离敌机的坐标
							if (Math.abs(ep[j][2] - pb[i][2])
									+ Math.abs(ep[j][3] - pb[i][3]) == distance) {
								if (pb[i][3] + pb[i][5] / 2 > ep[j][3]
										+ ep[j][5] / 2) { // 在下
									pb[j][3] -= pb[j][8] + 6;
								}
								if (pb[i][2] + pb[i][4] / 2 < ep[j][2]
										+ ep[j][4] / 2) { // 在左
									pb[i][2] += pb[i][7] + 3;
								}
								if (pb[i][2] + pb[i][4] / 2 > ep[j][2]
										+ ep[j][4] / 2) { // 在右
									pb[i][2] -= pb[i][7] + 3;
								}
								if (pb[i][3] + pb[i][5] / 2 < ep[j][3]
										+ ep[j][5] / 2) { // 在上
									pb[j][3] += pb[j][8] + 4;
								}
								break;
							}
						}
					} else { // 1、2代的移动
						switch (pb[i][10]) {
						case 0:
							pb[i][3] -= 8;
							break;
						case 1:
							pb[i][3] += 8;
							break;
						case 2:
							pb[i][2] -= 8;
							break;
						case 3:
							pb[i][2] += 8;
							break;
						case 4:// 左上
							pb[i][2] -= 8;
							pb[i][3] -= 8;
							break;
						case 5:// 左下
							pb[i][2] -= 8;
							pb[i][3] += 8;
							break;
						case 6:// 右上
							pb[i][2] += 8;
							pb[i][3] -= 8;
							break;
						case 7:// 右下
							pb[i][2] += 8;
							pb[i][3] += 8;
							break;
						}
					}
				} else {
					pb[i][3] -= pb[i][8];
				}
				// 边界检测
				if (pb[i][3] + pb[i][5] / 2 < 0
						|| pb[i][3] + pb[i][5] / 2 > height
						|| pb[i][2] + pb[i][4] / 2 < 0
						|| pb[i][2] + pb[i][4] / 2 > width) {
					pb[i][1] = 0;
				}
			}
		}
	}

	/** 玩家炮弹绘制 */
	private void drawPB(Graphics g) {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		for (int i = 0; i < pb.length; i++) {
			if (pp[9] == 1 && pb[i][1] == 1) {
				// 设置剪切区域
				g.setClip(pb[i][2], pb[i][3], pb[i][4], pb[i][5]);
				// 绘制炮弹
				g.drawImage(pbImg[pb[i][0]], pb[i][2], pb[i][3], Graphics.TOP
						| Graphics.LEFT);
				// 恢复剪切区域
				g.setClip(0, 0, width, height);
			}
		}
	}

	/** 添加敌人炮弹,敌人飞机开火 */
	private void addEB() {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		// 对应的飞机可见
		for (int i = 0; i < ep.length; i++) {
			if (ep[i][1] == 1) {
				for (int j = 0; j < eb.length; j++) {
					// 找到未用的炮弹数据空间
					if (eb[j][1] == 0) {
						switch (ep[i][0]) {
						case BOSS1:
						case BOSS2:
							// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
							if (ep[i][3] + ep[i][5] / 2 > 0
									& ep[i][3] + ep[i][5] < pp[4]) {
								// 发射计时
								ep[i][14]++;
								// 每隔10个发射计时单位发射一次三发炮弹
								if (ep[i][14] == 176) {
									// 炮弹种类
									eb[j][0] = 1; // 三发炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 16;
									// 炮弹图高
									eb[j][5] = 12;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界x)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 8;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 6;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
									// 发射计时器返回计时
									ep[i][14] = -16;
									break;
								}
								if (ep[i][14] % 16 == 0) {
									// 炮弹种类
									eb[j][0] = 1; // 双发炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 10;
									// 炮弹图高
									eb[j][5] = 12;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界x)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 6;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 6;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
								}
							}
							break;
						case BOSS3:
							// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
							if (ep[i][3] + ep[i][5] / 2 > 0
									& ep[i][3] + ep[i][5] < pp[4]) {
								// 发射计时
								ep[i][14]++;
								// 每隔7个发射计时单位发射一次跟踪炮弹
								if (ep[i][14] == 160) {
									// 炮弹种类
									eb[j][0] = 3; // 跟踪炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 10;
									// 炮弹图高
									eb[j][5] = 10;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界x)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 10;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 3;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
									// 发射计时器返回计时
									ep[i][14] = -20;
									break;
								}
								if (ep[i][14] % 20 == 0) {
									// 炮弹种类
									eb[j][0] = 2; // 三发炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 16;
									// 炮弹图高
									eb[j][5] = 12;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界y)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 8;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 6;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
								}

							}
							break;
						case EP0:
						case EP1:
						case EP2:
						case EP3:
						case EP4:
							// 飞机中点进入屏幕后,并且敌人飞机下边界位于玩家上边界上面时计时控制发射
							if (ep[i][3] + ep[i][5] / 2 > 0
									& ep[i][3] + ep[i][5] < pp[4]) {
								// 发射计时
								ep[i][14]++;
								// 每隔10个发射计时单位发射一次双发炮弹
								if (ep[i][14] == 150) {
									// 炮弹种类
									eb[j][0] = 1; // 双发炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 10;
									// 炮弹图高
									eb[j][5] = 12;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界x)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 6;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 6;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
									// 发射计时器返回计时
									ep[i][14] = -15;
									break;
								}
								if (ep[i][14] % 15 == 0) {
									// 炮弹种类
									eb[j][0] = 0; // 单发炮弹
									// 炮弹可见
									eb[j][1] = 1;
									// 炮弹图宽
									eb[j][4] = 4;
									// 炮弹图高
									eb[j][5] = 10;
									// 炮弹左上x坐标(飞机中心x减去炮弹半宽)
									eb[j][2] = ep[i][2] + ep[i][4] / 2
											- eb[j][4] / 2;
									// 炮弹左上y坐标(飞机下边界x)
									eb[j][3] = ep[i][3] + ep[i][5];
									// 炮弹伤害值
									eb[j][6] = 4;
									// 炮弹x向速度
									eb[j][7] = 2;
									// 炮弹y向速度
									eb[j][8] = 6;
									// 炮弹初时方向
									eb[j][9] = MOVE_DOWN;
								}
							}
							break;
						}
						break;
					}
				}
			}
		}
	}

	/** 敌人炮弹移动 */
	private void ebMove() {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		for (int j = 0; j < eb.length; j++) {
			if (eb[j][1] == 1) {
				if (eb[j][0] == 3) { // 追踪弹
					// 追踪(与玩家飞机的x差y差和小于160时追踪,否则一直向下边界移动)
					if (Math.abs(eb[j][2] - pp[3]) + Math.abs(eb[j][3] - pp[4]) < 160) {
						if (eb[j][3] + eb[j][5] / 2 < pp[4] + pp[7] / 2) { // 在上
							eb[j][3] += 2 * eb[j][8];
						} else if (eb[j][3] + eb[j][5] / 2 > pp[4] + pp[7] / 2) { // 在下
							eb[j][3] -= eb[j][8];
						}
						if (eb[j][2] + eb[j][4] / 2 < pp[3] + pp[6] / 2) { // 在左
							eb[j][2] += 2 * eb[j][7];
						} else if (eb[j][2] + eb[j][4] / 2 > pp[3] + pp[6] / 2) { // 在右
							eb[j][2] -= 2 * eb[j][7];
						}
					} else {
						eb[j][3] += 2 * eb[j][8];
						// 边界检测
						if (eb[j][3] + eb[j][5] / 2 > height) {
							eb[j][1] = 0;
						}
					}
				} else {
					eb[j][3] += eb[j][8];
					if (eb[j][2] + eb[j][4] / 2 < pp[3] + pp[6] / 2) {
						eb[j][2] += eb[j][7];
					} else {
						eb[j][2] -= eb[j][7];
					}
					// 边界检测
					if (eb[j][3] + eb[j][5] / 2 > height
							|| eb[j][2] + eb[j][4] / 2 < 0
							|| eb[j][2] + eb[j][4] / 2 > width) {
						eb[j][1] = 0;
					}
				}
			}
		}
	}

	/** 敌人炮弹绘制 */
	private void drawEB(Graphics g) {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		for (int i = 0; i < eb.length; i++) {
			if (eb[i][1] == 1) {
				g.setClip(eb[i][2], eb[i][3], eb[i][4], eb[i][5]);
				g.drawImage(ebImg[eb[i][0]], eb[i][2], eb[i][3], Graphics.TOP
						| Graphics.LEFT);
			}
		}
	}

	/**
	 * 添加敌人飞机到敌人飞机数组(最多10架)
	 */
	private void addEP() {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		if (pp[9] == 1) {
			times++;
		} else {
			return;
		}
		switch (gate) {
		case 1:
			for (int i = 0; i < addEPArray1.length; i++) {
				// 时间到
				if (addEPArray1[i][0] == times) {
					for (int j = 0; j < ep.length; j++) {
						// 找未添加的空间添加(凡加进去的皆可见,移出屏幕和死亡的不可见)
						if (ep[j][1] == 0) {
							ep[j][0] = addEPArray1[i][1];
							ep[j][1] = 1;
							ep[j][2] = addEPArray1[i][2];
							ep[j][3] = addEPArray1[i][3];
							ep[j][4] = addEPArray1[i][4];
							ep[j][5] = addEPArray1[i][5];
							ep[j][6] = addEPArray1[i][6];
							ep[j][7] = 1;
							ep[j][8] = addEPArray1[i][7];
							ep[j][9] = addEPArray1[i][8];
							ep[j][11] = 1;
							ep[j][12] = 0;
							ep[j][13] = 0;
							ep[j][14] = 0;
							// 可见计时初始化
							ep[j][10] = 0;
							break;
						}
					}
				}
			}
			break;
		case 2:
			for (int i = 0; i < addEPArray2.length; i++) {
				// 时间到
				if (addEPArray2[i][0] == times) {
					for (int j = 0; j < ep.length; j++) {
						// 找未添加的空间添加(凡加进去的皆可见,移出屏幕和死亡的不可见)
						if (ep[j][1] == 0) {
							ep[j][0] = addEPArray2[i][1];
							ep[j][1] = 1;
							ep[j][2] = addEPArray2[i][2];
							ep[j][3] = addEPArray2[i][3];
							ep[j][4] = addEPArray2[i][4];
							ep[j][5] = addEPArray2[i][5];
							ep[j][6] = addEPArray2[i][6];
							ep[j][7] = 1;
							ep[j][8] = addEPArray2[i][7];
							ep[j][9] = addEPArray2[i][8];
							ep[j][11] = 1;
							ep[j][12] = 0;
							ep[j][13] = 0;
							ep[j][14] = 0;
							// 可见计时初始化
							ep[j][10] = 0;
							break;
						}
					}
				}
			}
			break;
		}
	}

	/** 敌人飞机的移动和移动动画(按类别进行轨迹描述) */
	private void EPMove() {
		if (gameState != GAME_CONTINUE || gateState != GATE_CONTINUE) {
			return;
		}
		for (int i = 0; i < ep.length; i++) {
			// 如果飞机可见
			if (ep[i][1] == 1) {
				// 飞机动画
				if (ep[i][7] == 1) {
					ep[i][7] = 2;
				} else if (ep[i][7] == 2) {
					ep[i][7] = 3;
				} else {
					ep[i][7] = 1;
				}
				// 按类进行轨迹描述
				switch (ep[i][0]) {
				case BOSS1:
					// 在y向一定距离内前后移动,同时x向左右来回移动(锯齿形轨迹),一定次数后,y向移动从底部移出
					if (ep[i][1] == 1) {
						ep[i][10]++;
					}
					if (ep[i][10] < 500) {
						switch (ep[i][11]) {
						case MOVE_UP:
							break;
						case MOVE_DOWN:
							// 进入屏幕后选择x向方向开始锯齿轨迹
							ep[i][3] += ep[i][9];
							if (ep[i][3] >= 0) {
								ep[i][10] = 0;
								if (ep[i][2] <= width / 2 - ep[i][4] / 2) {
									ep[i][11] = MOVE_LEFT;
								} else {
									ep[i][11] = MOVE_RIGHT;
								}
							}
							break;
						case MOVE_LEFT:
							ep[i][2] -= ep[i][8];
							ep[i][3] += 2 * ep[i][9];
							if (ep[i][3] >= 35 || ep[i][3] <= 0) {
								// y向速度取反
								ep[i][9] = -ep[i][9];
							}
							// 左边界检测
							if (ep[i][2] < 0) {
								ep[i][2] = 0;
								ep[i][11] = MOVE_RIGHT;
							}
							break;
						case MOVE_RIGHT:
							ep[i][2] += ep[i][8];
							ep[i][3] += 2 * ep[i][9];
							if (ep[i][3] >= 35 || ep[i][3] <= 0) {
								// y向速度取反
								ep[i][9] = -ep[i][9];
							}
							// 右边界检测
							if (ep[i][2] >= width - ep[i][4]) {
								ep[i][2] = width - ep[i][4];
								ep[i][11] = MOVE_LEFT;

⌨️ 快捷键说明

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