基于 Java 的 I Don’t Wanna Be The Bugger 冒险游戏

一、课程设计项目简单描述

在美国早期游戏业比较宁静的时代,I Wanna Be The Guy 作为一款难度较高的冒险类游戏,在当年很多人玩过。玩家将体验一个年轻、懵懂的孩子为了追寻理想中的角色所经历的过程。变幻莫测的完美剧情只是这项无限创意中的一部分,令人沮丧的跳跃和射击的挑战会使你对这个主角小孩产生敬意。

I Wanna 出名后,一些地方开始举行 I Wanna 大会,并利用 GM8 和 MMF2 等工具制作 I Wanna。这些可在百度 I_wanna_be_the_guy 吧或日本的 wiki 或维基百科 I Wanna 专题上找到并下载。除此之外,在 PIXIV 上也有 I Wanna 相关的作品。

该课程设计项目属于 I Wanna Be The Guy 游戏同人作品,构建了人物、关卡、关卡元素等模型;获取了相应的素材图片与音乐,丰富了游戏的内容;实现了基本的人物移动跳跃死亡,关卡和各种多种机关的创建,关卡切换和重开,存档等多种功能。基于 Java 语言封装使关卡的布局更加方便,精心设计了四个关卡使游戏更加具有乐趣。

二、需求分析

三、系统设计

1.碰撞检测算法

该算法为较为重要的算法,所有的关卡元素以及人物都继承自 Thing 类,judgeCrash 方法通过判断传入两个类的图片是否重叠进而返回是否碰撞。

矩形重叠判断公式

X 轴:[(x1+w1/2)-(x2+w2/2)]<(w1+w2)/2

Y 轴:[(y1+h1/2)-(y2+h2/2)]<(h1+h2)/2

当判断公式返回真值时说明矩形重叠。

2.GameComponent 类

1)Timer 类和 ActionListener 接口

通过 ActionListener 监听器和 Timer 结合定时调用 Kid 类的 run 方法和 Level 类中的 scan 方法,使画面每隔固定的一段时间改变并调用 repaint 刷新画面显示从而达到动效。

2)KeyListener 接口

使用 KeyListenr 对键盘输入监听,并对相应键的 KeyPress 调用 Kid 或者 Level 的方法对其的状态进行改变。

3)窗体的绘制

GameComponent 继承于 JComponent 重写了 paintComponent 方法,调用 Kid 类和 Level 类的 draw 方法绘制出当前的画面。

4)重新游戏

当监听到键盘键入‘R’或‘r’时调用 restart 方法,进而调用 Kid 对象的 reset 和 Level 的 reset 重置关卡。

3.Level 类

1)Level类的数据域

2)关卡的设置与重置

Level 中的 reset 具有关卡设置与重置的功能,将对应关卡的元素载入对应的 ArrayList 中,在 draw 类被调用时会根据载入的元素的坐标和贴图绘制出所有载入的元素,从而形成关卡,重置亦是如此。

3)关卡元素的检测和动态变化

Scan 方法会对所有的关卡元素进行扫描,如果满足触发条件,则调用关卡元素的触发内容。还可以定义关卡进行时的动态变化(触发后某个机关才会出现的某个机关需要在这里设置)。

4.Kid 类

1)Kid 类中的数据域

2)Kid 类状态的改变

通过 jump,walk,fall,idle,die 方法,使 Kid 对象进入某种状态,并改变 Kid 对象的数据域。

3)Kid 类的坐标根据状态的改变

人物根据坐标数据定位,在 run 方法中定义了当 Kid 处于某种状态时,实际的坐标根据随之改变。由于 GameComponent 的定时调用,从而达到人物状态改变的效果。

4)Kid 类的绘画

Draw 方法根据人物当前的状态载入对应的图片,并显示在窗体上。

5)Kid 的重置

当 Kid 经过死亡状态后,触发重开游戏后调用 reset 方法将 Kid 设置为初始状态。

6)Blood 类

在 Kid 进入死亡状态时,将人物死亡坐标传入 Blood 类,初始化 500 个血液坐标,并使用随机数方法随机出 500 个横纵轴速度,使 500 个血液坐标改变,最后调用绘制在屏幕上。

5.Platform,Trap,Judge,Save 类

(四类具有大部分相似的数据域与方法,以 Platform 为例分析)

1)Platform 类的数据域

2)Platform 类的站立与阻挡

judgeKidCrash 方法通过对 Kid 对象和 Platform 对象当前坐标进行一系列碰撞的判定,并对站立与阻挡两种不同的状态对 Kid 对象内部数据进行改变,从而达到站立和阻挡效果。其余三类均有通过碰撞检测实现的一些功能。

3)Platform 类的移动

Platform 对象在 Level 类中检测是否触发自身判定区域,若已触发判定区域,则调用 move 方法对 Platform 的坐标进行改变。由于 GameLevel 会定时调用 Level 类的检测方法,从而达到移动的效果。

4)Platform 的绘制

Draw 方法根据平台当前的状态载入对应的图片,并显示在窗体上。

6.ImageTool 和 MusicTool

在GameComponent创建时就将图片数据和音乐数据载入内存中,提高读写速度的同时也方便之后的读取。

四、效果及存在问题

1.运行效果

Level 1

Level 2

Level 3

Level 4

Level 5

Level 0(author page)

2.存在的问题

1) 碰撞算法精度问题

由于能力暂时的有限,所有的碰撞检测都只采取了矩形检测重叠的方法来判断是否碰撞,导致碰撞判定的精度并不高(会导致还没触碰机关元素到就死亡的现象)。

预期解决方法:引入检测像素碰撞方法,在一些需要精度比较高的地方使用。

2) 人物物理引擎的死板

原作的物理引擎可以根据按下键盘时的停留时间对人物跳跃的高度和速度做相应的处理,本作并没有做到比较死板,会造成有时候关卡的设计难度增大(因为需要人物本身是否能够通过)。

预期解决方法:监听键盘按键时间,并对其做出不同的反应。

3) 陷阱形式比较单一

只设计了最基本的移动陷阱方法,并没有设计出更多的陷阱方式(虽然已经可以衍生做到很多不同的陷阱效果),游玩过久可能会觉得枯燥。

预期解决方法:多设计一些不同的陷阱类型并应用。

4) 关卡放置方面过于底层,不是很好操作

关于关卡的放置还是处于代码层,新设计的关卡都需要重新写进代码里才可以显示,参数过于繁琐,不够方便。

预期解决方法:制作一个具有交互界面的游戏制作器,可以直接生成数据并传入内部程序运行。

五、心得体会

游嘉升:

经过本次课程设计后,在团队协作方面更加知道小组工作时配合的重要性,很多时候小组如果没有配合好会出现不协调的现象。比如某个地方需要另一个成员的某段代码,而另个成员还没写就会导致工程滞留,这是很严重的问题。还有成员之间的沟通需要相互理解,沟通是建立在理解的基础上的,如果互相不理解就容易造成更严重的误会。身为组长还需要做好分工协调的工作,提前将任务明细布置。

在技术层面,更加体会到 MVC 和封装的优越性。根据 MVC 模式构建的代码比较清晰明了,各个模块各司其事,相互使用又互不影响。封装后的代码若是想要修改很快就可以找得到其作用的位置。所以在写代码前需要设计框架,再将其填充。这次课设算是累计了不少有用的经验。

吴旭婷:

最大的体会是分工合作的重要性,这也是和之前所做课设的一大不同。明确的分工能避免不必要的争执和推脱,所以从一开始就需要和队友做好沟通,在做的过程中也需要不断磨合。在合作的时候曾起过小纠纷,让我误以为队友对于我设计的机关不满,好在最后解释清楚,也让我在后面制作的时候参考了更多元素,设计得更好。在这期间我也了解到有些组合在合作方面就做的很差,也没有好好沟通,导致最后心中不满,觉得还不如自己完成就好。相比之下我只想说,队友好给力!!!

♻️ 资源

大小: 17.2MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87354132

基于 Java 的 I Don’t Wanna Be The Bugger 冒险游戏【100010211】相关推荐

  1. [源码和文档分享]基于java 的仿QQ聊天工具

    一 需求分析 本系统是基于java开发的聊天室.有用户注册.用户登陆.修改密码.忘记密码.添加好友.用户聊天.群聊功能.如果服务器还没有启动,则客户端是不可以登陆.注册.忘记密码,如果在运行过程中,服 ...

  2. Lucene:基于Java的全文检索引擎简介(转载)

    Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基 ...

  3. java旅游网站毕业论文,基于JAVA技术的旅游网站的开发.doc

    摘要: 这次毕设主要是为了实现基于JAVA技术的旅游网站的开发,方便人们近距离的出行游玩.网站的开发过程中用到了很多方法技术,最主要的是JAVA技术,用于编写后台的功能实现代码:框架采用的是Sprin ...

  4. 基于Java的webapp_几乎所有基于Java的web app都需要Model 2 (part II) (转)

    几乎所有基于Java的web app都需要Model 2 (part II) (转)[@more@] 几乎所有基于的 app都需要Model 2 当Web容器从客户端接收到一个请求时,控制流开始运行. ...

  5. 统计学Java_【gloomyfish】基于Java的统计学计算结果

    最近经常跟数值计算的东西打交道,特别是大量样本的统计计算,在常见的描述统计结果中,最常用到的是一下几种: -一组样本的平均价值 -一组样本的中值 -一组样本中的最小值 -一组样本中的最大值 -一组样本 ...

  6. 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

    题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...

  7. 题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)

    题目:任意给定一个浮点数,计算这个浮点数的立方根.(基于二分法和牛顿迭代法)(基于Java实现) 首先,来分析一下这道题,其实在leetcode上做了求解根号3的题之后,对于这种求解立方根的题,基本上 ...

  8. 基数排序算法(基于Java实现)

    title: 基数排序算法(基于Java实现) tags: 基数算法 基数排序算法原理及代码实现: 一.基数排序算法的原理 基数排序属于"分配式排序",又称"桶子法&qu ...

  9. 选择排序算法(基于Java实现)

    title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...

  10. 插入排序算法(基于Java实现)

    title: 插入排序算法(基于Java实现) tags: 插入算法 插入排序算法原理及代码实现: 一.插入排序算法的原理 首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间.初始已排序区间 ...

最新文章

  1. python os 获取当前路径的绝对路径的上层目录_os 模块常用函数
  2. 【转】彻底解决matplotlib中文乱码问题
  3. [导入]sqlserver2005 数据挖掘控件研究
  4. flink 8 state checkpoint savepoint区别
  5. SAP Data Intelligence API执行出错的排错之道
  6. “只有DBA才能导入由其他DBA导出的文件”各种解决办法
  7. Tableau数据分析:NC Retail Order Data(英)Data Science Program Lab#1(GTI)
  8. 【免费毕设】IT产品网上物流管理信息系统的设计与实现(源代码+lunwen)
  9. 二阶无源低通滤波器幅频特性曲线_几种无源滤波器的电路及频响特性对比
  10. Win7 关闭触摸屏 屏幕键盘功能
  11. dedecms5.7(织梦)源码解析之程序安装补全篇
  12. 华硕路由域名访问_动态域名是什么?
  13. 学习笔记——Python输入与输出
  14. 5款宝藏浏览器插件推荐,每一个都真香,一定要看到最后
  15. 大数据实战二十四课 - Spark SQL04
  16. 【Busybox】Busybox源码分析-04 | ash和login程序
  17. 通俗地、有效地学习Linux驱动应用(只要没更完有空就更)
  18. 【实战】python-docx---每页表格固定显示行数
  19. 2021-08-04 TCP/IP协议栈简述
  20. 大清早的发现github凉凉了

热门文章

  1. SPEA多目标优化算法--测试case发电机发电量分配[转]
  2. 阿里高校实践计划 class6 搭建nas个人网盘
  3. 电表485通讯抄表软件
  4. 根据页面结构,用jquery取里面对应的内容 组装成json数据
  5. 时间序列预测中使用类EMD方法时的信息泄露和计算量问题
  6. github之处理“忒修斯之船”问题
  7. android补间动画有哪几种,android三种动画详解(补间动画、帧动画、属性动画)...
  8. 六年级语文计算机个人研修计划,个人研修计划
  9. 转!!以太网方案设计
  10. 建服务器数据中心,如何构建一个服务器数据中心