Java课设——SuperMario(团队)

SuperMario

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

团队名称:酸菜鱼啊啊啊

吴沂聪(组长)🍋

  • “酸”字代表人物,因素材问题经常羡慕其他组
  • 负责登录
  • 注册gui设计以及功能的实现
  • 设计背景
  • 素材收集和编辑

吕恬(组员)🥦

  • “菜”字代表,自封,其实是我组技术骨干,可靠的优秀组员
  • 利用二维数组存储文件流导入的map.txt,绘制出马里奥游戏的地图
  • 多层背景滚动向后,实现动态背景。马里奥移动时背景也会移动
  • 游戏开始界面与菜单的切换
  • 背景音乐的插入与循环播放
  • 实现重力和碰撞检测的功能
  • 特殊道具及马里奥获得后的效果

林玮璐(组员)🐟

  • “鱼”字代表人物,编辑的素材使用率低达10%
  • 设计砖块
  • 管道
  • 蘑菇
  • 乌龟
  • 盒子
  • 通关塔
  • 素材收集和编辑

2.项目git地址

康这里~ https://gitee.com/ty0805/Super-Mario

3.项目git提交记录截图



4.前期调查

通过进行马里奥游戏获得以下内容

  • 马里奥人物:可通过前进,跳跃等动作进行相关冒险
  • 障碍物:小怪兽(可进行攻击)、其他障碍物,如:管道、砖块(可进行躲避)
  • 记分:金币,攻击怪兽,进行的关卡
  • 失败条件:碰到怪兽,掉落到“无尽深渊”游戏提前结束
  • 通关条件:到达旗帜

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

功能架构图

MVC图

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

UML类图

包图

7.项目运行截图或屏幕录制。

登录注册界面

主界面游戏

8.项目关键代码:模块名称-文字说明-关键代码(注意:不得直接复制所有源代码,仅粘贴最关键代码)。

登录

获取密码框的密码及文本框的账号,然后与从文件中读取的账号密码依次进行比对,若完全一致则登录成功,不一致则提示登录失败。

注册

与登录部分类似,获得账号、两次密码后,与文件读取的账号比对,满足用户名和密码不为空、用户名不重复、用户名和密码不包含空格的条件后写入文件。

背景部分:将图片写进HashMap中,便于之后读取

BackGroundMap类中设置背景素材的位置等因素调用BackGround类的方法,BackGround类获取到素材的因素,用draw方法绘制背景。


管道设计

其他静态设计与此相同

乌龟设计

其他动态设计与此相同




利用二维数组存储文件流导入的map.txt,绘制出马里奥游戏的地图


定义二维数组map[][]存储IO流读取的map.txt文件,通过readLine()方法全部读入,返回行数和列数定下固定的数组大小。

将读取到文件的数据全部传递存储在map[][],行数row与列数cloum作为关键变量,后续通过遍历数组来找到标记好的位置,进行游戏界面的绘制工作和插入背景图片及相关图片。
优化:存在map.txt文件就能对地图进行修改,原本想要完成地图编辑器的功能,游戏开始前让玩家自由编辑接下来关卡的地图,游戏结束或进入下一关卡(换了背景图片),能够弹出地图编辑的界面,同时会弹出选关界面

确定数组中的标记数字:0表示没有标记,1表示该位置绘制水管,2表示该位置绘制砖块。(不同数字代表不同物体)

游戏开始界面与菜单的切换音效


Menu类的属性,大多是图形界面GUI的固定变量,开始界面包括五张图片,全数以HashMap存储,读入图片时采用双缓存的方法,提高图片读取速度

绘制开始界面,同时启动音乐线程(采用多线程技术),调用Mp3Thread类,实现背景音乐的循环播放,此时鼠标移动到相应按钮上会有音效,点击MarioGame按钮进入游戏,Out按钮直接退出游戏,界面自动关闭

进入游戏即启动gc线程,paint()方法开始绘制相关组件,当判断条件为true时绘制相应的组件画面,出现开始菜单;当判断条件为false时进入死亡页面。进入开始页面后插入的背景音乐随即启动,一直循环播放,当lose或者win后会替换成新的音乐。

游戏开始前的菜单设置,还有死亡后弹出的菜单按钮设置,GUI界面的布局只截取上述关键代码,整个开始界面的设计使用NetBeans,还导入substance.jar栈包来对边框和页面进行美化

Mp3Thread线程,游戏开始即新建一个线程,线程启动后音乐播放;音乐的导入采用IO流形式;run方法中包含异常处理,若没有找到音乐文件则输出异常信息。

重力效果的实现


在跳跃时加入了音效,运行时应用键盘监听插入水滴音效

马里奥与其他物体的碰撞检测



因为有坐标轴作为参照,可以在x,y两个水平方向进行最简单的碰撞检测,

物体形状一般可以设定为矩形区域,这类规则图形。它的碰撞检测可以通过java API中的Rectangle类来实现碰撞的检测。规则图形碰撞检测(Rectangle):它就是指定坐标空间的一个区域,这个区域是通过指定左上角x、y坐标和去高度和宽度来确定的。如果两个Rectangle对象有交集,那么他们就有碰撞了。而每个形状我们都可以得到他们的Rectangle对象,这样图形的碰撞检测也就得以实现了。

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

扫描结果

扫描修正



10.项目总结(包括不足与展望)

不足:

  • 关卡设计比较少
  • 排行榜最终没能实现
  • 道具功能过少

展望:

  • 增加金币功能,实质上没有加入金币处理,所以还需要考虑相关设计
  • 道具上设计一些其他更加精妙有趣的内容,比如增加生命值,增加速度,加入保护保护盾等

特色:

  • 设置隐藏道具,可以使马里奥变大,进而具备二段跳的功能
  • 主面板设置动态循环图片,使页面更加美观
  • 游戏加入背景音乐并且具备某些动作触发特殊音效的作用
  • 背景也设置动态效果,增加页面美观
  • 水管采用多张图片叠加的效果,使水管看起来更加立体
  • 在盒子的设计上,加入了让盒子不停旋转的功能
  • 增加了马里奥与地面之间的的摩擦,重力加速度,奔跑为变速

总结:

  • 吴沂聪(组长):
    因为选题使制作游戏,完成游戏的过程比较繁琐,需要考虑许多内容,整个过程是痛苦又快乐的,需要考虑许多细节,有些时候需要发挥自己的想象力,修改一系列的错误,又因为游戏的可视化,美观性,搜索许多素材,但当自己写的环节运行出来,也是十分快乐的,通过完成,更深层次了解IO流、GUI的运用,也从队友那儿了解了碰撞检测,重力检测,收获颇多。
  • 吕恬(组员):
    开始马里奥的背景无法移动,因为是导入很长的图片,无法随着马里奥的行动变化,最初的想法是代入了以前的游戏体验,只有马里奥移动,图片完全保持静止。后来对比了游戏的运行界面,为背景图片也加入了一个相对速度:即马里奥以一定的速度向右移动,图片会以相同的速度往左运动,但是其他障碍物或者敌人的初始位置不会发生什么变化。静止的背景确实还原了原作的风格,但是改进成动画后制作更为精良同时背景的白云是能够移动的,即形成了动画的效果。实现重力的模拟之后,再次改进优化,增加了摩擦力的判断和实现,马里奥在平地移动时会有拖拽的效果,并不是定速。
  • 林玮璐(组员):
    做游戏的过程特别困难,但因为可视的界面,且游戏的趣味性,让人在过程中也充满快乐,就是又难受又快乐。其中学习了解了游戏实际实现具体需要哪些方法,也是通过了这次课设才知道,那些动态的动作都是通过图片一帧一帧弄出来,进而呈现动态的状态。也学习了解了碰撞检测,知道了Rectangle类,还了解了像素检测。

posted on 2020-01-09 01:52  白居过隙巍澜可期  阅读(253)  评论(0编辑  收藏  举报

导航