yujun59

博客园 首页 新随笔 联系 订阅 管理

JAVA课程设计-飞机大战

1.团队名称、团队成员介绍

1.1 团队名称:做个飞机哦

1.2团队成员介绍:

余俊良(组长):编写博客、游戏主界面设计与实现、英雄机与子弹类的实现、场景设计
林祥涛:游戏音效设计、玩家类编码与设计、小Boss类设计、ppt设计
高凯:画uml类图、积分榜设计、游戏道具定义实现、游戏状态设计

2.项目git地址

https://gitee.com/net_201821123052/Planewar.git

3.项目git提交记录截图

4.前期调查及游戏介绍

玩家通过控制飞机发射子弹击中不同的敌机获取积分,击中快速移动的浮标获得奖励(获得双倍子弹奖励、生命值增加)。游戏过程伴随着背景音乐,而且击中敌机或生命耗尽后会产生相应音效。与敌机相撞则扣除生命值1点,直到生命值为0,游戏结束,玩法简单有趣,锻炼反应能力。

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

6.面向对象设计包图、类图

包图

类图

7.项目运行截图

主界面显示

英雄机

普通敌机

精英机

小boss

切换飞机

双倍子弹模式

排行榜

奖励

游戏结束

8.项目关键代码

8.1鼠标事件

使用鼠标事件监听MouseAdapter对鼠标进行监听,当鼠标移动时获取鼠标的坐标,点击时开启游戏,鼠标移出窗体后游戏暂停,移入则继续。

		MouseAdapter m = new MouseAdapter() {
			// 鼠标移动事件
			public void mouseMoved(MouseEvent e) {// 鼠标坐标获取
				if (Running == state) {
					hero.moveTo(e.getX(), e.getY());
				}
			}

			// 鼠标点击事件
			public void mouseClicked(MouseEvent e) {
				if (Start == state) {// 点击开始游戏
					state = Running;
				} else if (Over == state) {// 游戏结束后点击重新开始
					state = Start;
					score = 0;// 积分,飞行物重置
					hero = new Heroplane();
					flyobj = new ArrayList<AbstractFlyingObject>();
					bullets = new ArrayList<Bullet>();
				}
			}

			// 鼠标移出事件
			public void mouseExited(MouseEvent e) {
				if (Running == state) {// 移出窗体,游戏暂停
					state = Pause;
				}
			}

			// 鼠标移入事件
			public void mouseEntered(MouseEvent e) {// 移回窗体,游戏继续
				if (Pause == state) {
					state = Running;
				}
			}
		};

8.2双缓冲技术消除闪屏

闪屏的出现是因为在while循环中执行线程时每循环一次便会重绘一次,而update()方法即会先清理掉当前的画面再重新绘制新的画面。可以在内存中重新开辟新空间,作为后台图像,本应该在界面上进行清理与重绘现在内存中先实现,生成新画面,最后显示到屏幕上。

private Image offScreenImage = null;// 利用双缓冲技术消除屏幕闪烁
public void update(Graphics g) {
	if (offScreenImage == null) {
		offScreenImage = this.createImage(WIDTH, HEIGHT);
	}
	Graphics gOff = offScreenImage.getGraphics();
	paint(gOff);
	g.drawImage(offScreenImage, 0, 0, null);
}

8.3飞行物显示

通过根据状态不断重绘飞行物来达到动画效果

		Timer timer = new Timer();
		int timeGap = 10;// 设定时间隔
		timer.schedule(new TimerTask() {
			public void run() {
				if (state == Running) {
					heroBulletEnter();// 英雄子弹的入场
					enemyEnter();// 敌机的入场
					enemyStep();// 敌机的移动
					outBoundDel();// 删除越界(底)的敌机和子弹
					enemyCrash();// 英雄机子弹与敌人相撞(子弹和敌机退场)
					checkGame();// 检查游戏是否结束(敌机和英雄机相撞)
				}
				repaint();// 重画
			}
		}, timeGap, timeGap);// timeGap为每一次到下一次的触发间隔

9.项目代码扫描结果及改正

9.1第一次扫描结果

9.2扫描修正

在所有的覆写方法前增加@Override注释
常量名应当全部大写,单词用下划线隔开
switch块中,每个case都应通过break/default来终止
方法内部单行注释,在被注释语句上方另一行使用//注释,多行注释使用/**/注释

9.3全部修正后结果

10.项目总结

10.1不足

原先计划能够在完成单人模式的基础上增加联网模式,但是在基本完成单人模式后剩余的时间的确不够去实现联网。设计的敌机类型也不够多,道具类型也可以再增加。

10.2展望

在课设完成后利用课余时间增加网络模式,并在网络中进行线上合作与排行

posted on 2020-01-09 13:37  yujun59  阅读(2267)  评论(1编辑  收藏  举报