Java课程设计--飞机大战

為{幸葍}努か 提交于 2020-12-21 04:01:33

#一. 团队介绍

成员姓名 任务分配
文**(组长) GUI、数据持久化
李** 背景音乐、博客撰写
#二. 参考代码
部分参考代码链接
#三. 项目git地址
https://gitee.com/net1811wzs/Java.git
#四. 项目git提交记录截图,老师将重点考核

#五. 前期调查

#六. 项目功能架构图、主要功能流程图

#七. 面向对象设计包图、类图

#八. 项目运行截图或屏幕录制

#九. 项目关键代码:模块名称-文字说明-关键代码 ##1. 主流程控制

  • 主流程:通过判断是否是运行状态来判断是否执行飞行物入场、飞行物运动、射击、删除越界飞行物及子弹和检查游戏结束
		timer = new Timer(); // 主流程控制
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				if (state == RUNNING) { // 运行状态

					enterAction(); // 飞行物入场
					stepAction(); // 走一步
					shootAction(); // 英雄机射击
					enemyShootAction();// 敌机射击
					bangAction(); // 子弹打飞行物
					outOfBoundsAction(); // 删除越界飞行物及子弹
					checkGameOverAction(); // 检查游戏结束
				}
				repaint(); // 重绘,调用paint()方法
			}

		}, intervel, intervel);

##2. 英雄机发射子弹

  • 英雄机发射子弹的方法,当双倍火力开启时在英雄机两侧发射子弹,双倍火力未开启时则在机头发射子弹
	/** 发射子弹 */
	public Bullet[] shoot() {
		int xStep = width / 4; 
		int yStep = 20; // 步
		if (doubleFire > 0) { // 双倍火力
			Bullet[] bullets = new Bullet[2];
			bullets[0] = new Bullet(x + xStep, y - yStep); // y-yStep(子弹距飞机的位置)
			bullets[1] = new Bullet(x + 3 * xStep, y - yStep);
			return bullets;
		} else { // 单倍火力
			Bullet[] bullets = new Bullet[1];
			bullets[0] = new Bullet(x + 2 * xStep, y - yStep);
			return bullets;
		}
	}

##3. 英雄机射击、敌机/boss射击

  • 分成两类射击:"英雄机射击"和"敌机/Boss射击",都是用时间来控制子弹的发射
  • "英雄机射击"通过定义子弹数组,英雄机只有一个,"敌机/Boss射击"通过定义子弹数组,敌机和boss的数量来确定数组大小
	/** 射击 */
	public void shootAction() {
		shootIndex++;// 10毫秒执行一次
		if (shootIndex % 30 == 0) { // 300毫秒发一颗
			Bullet[] bs = hero.shoot(); // 英雄打出子弹
			bullets = Arrays.copyOf(bullets, bullets.length + bs.length); // 扩容
			System.arraycopy(bs, 0, bullets, bullets.length - bs.length, bs.length); // 追加数组
		}
	}

	/** 敌机、boss射击 */
	public void enemyShootAction() {
		eShootIndex++;
		Bullet[] bs = null;
		if (eShootIndex % 60 == 0) { // 600毫秒发一颗
			for (int i = 0; i < flyings.length; i++) {
				bs = flyings[i].shoot();
				if (bs != null) {
					enemyBullets = Arrays.copyOf(enemyBullets, enemyBullets.length + bs.length); // 扩容
					System.arraycopy(bs, 0, enemyBullets, enemyBullets.length - bs.length, bs.length); // 追加数组
				}

			}
		}
	}

##4. 碰撞检测

  • 通过遍历所有子弹并使用碰撞检查方法,来分别处理子弹与敌机、蜜蜂和boss的碰撞 和 子弹与英雄机的碰撞
	// * 敌机子弹与我方英雄机碰撞检测 */
	public void bangAction() {
		for (int i = 0; i < bullets.length; i++) { // 遍历所有子弹
			Bullet b = bullets[i];
			bang(b); // 子弹和飞行物之间的碰撞检查
		}

		int index = 0; // 索引重置为0
		Bullet[] bulletLives = new Bullet[enemyBullets.length];// 存活子弹
		for (int i = 0; i < enemyBullets.length; i++) {// 现有所有子弹
			Bullet b = enemyBullets[i];// 取出所有子弹
			if (enemybang(b)) {// 将取出的子弹一个个和英雄机碰撞检测
				continue;
			}
			bulletLives[index++] = b;// 如果没有撞到,代表子弹存活,加到存活子弹数组中
		}
		enemyBullets = Arrays.copyOf(bulletLives, index); // 把存活子弹数组复制到真正要绘制的子弹数组中
	}

#十. 项目总结(包括不足与展望) 不足:没有实现Boss在360°方向上均匀发射子弹的功能;没有实现Boss生命值较大不至于被一颗子弹打死。 展望:添加敌机被击败的音效、Boss出场音效。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!