SWEN20003面向对象软件开发项目1,2024墨尔本大学
计算机与信息系统学院
SWEN20003面向对象软件开发
项目1,2024年第1学期
发布时间:2024年3月25日星期一,美国东部时间晚上11:30首次提交截止时间:2024年3月28日星期四,美国东部时间晚上11:30项目截止时间:2024年4月17日星期三上午11:30在开始项目之前,请阅读完整的规范,因为
是贯穿始终的重要指示!
概述
欢迎来到SWEN20003的第一个项目,2024年第1学期。在项目1和项目2中,您将设计并创建一款名为ShadowMario的Java街机游戏(改编自原版90年代的街机游戏《超级马里奥兄弟》)。在这个项目中,您将创建完整的您将在项目2B中完成的游戏。这是一个单独的项目。你可以讨论一下与其他学生一起,但所有的实施都必须是你自己的工作。通过提交你声明你理解大学的学术诚信政策,并意识到
任何侵权行为的后果,包括使用人工智能。
您可以使用任何想要开发游戏的平台和工具,但我们建议使用IntelliJJava开发的IDEA,因为这是我们将在课堂上支持的。本项目的目的是:
为您提供使用面向对象编程语言(Java)的经验,
介绍简单的游戏编程概念(2D图形、输入、简单计算)为您提供使用简单外部库(Bagel)的经验
延期和延迟提交:如果您需要项目延期,请完成
画布上项目模块中的扩展窗体。确保向解释您的情况
一些证明文件,如医疗证明、学业调整计划、婚礼
邀请等。您将收到一封电子邮件,说明延期是否获得批准,或者我们是否需要更多信息信息
如果您逾期提交(无论是否延期),请在
画布上的Projects模块。对于这两种表格,您都需要使用您的大学登录账户请不要向任何教学团队发送有关延期或延期提交的电子邮件。所有这些将在本说明书的末尾再次进行更详细的解释。
您必须在整个提交过程中至少进行5次提交(不包括初次提交提交)项目的发展,他们必须有有意义的信息。这也在中进行了解释更多细节见说明书末尾。
1.
SWEN20003面向对象软件开发项目1,2024游戏概述
“目的很简单——移动玩家跳过敌人并收集硬币。你能做到吗?”达到结束标志以完成关卡?
游戏由三个关卡组成——项目1将只提供第一个关卡。玩家有按箭头键向左、向右或跳跃。玩家可以通过与碰撞来收集硬币他们-收集一枚硬币,分数增加一分。玩家可以避开静止的敌人跳过它们(敌人将在项目2中移动!)。如果玩家与
敌人,他们将失去生命值。要想获胜,玩家需要到达终点旗。如果玩家的生命值减为零,游戏结束。
图1:已完成的项目1屏幕截图
2.
SWEN20003面向对象软件开发项目1,2024游戏引擎
基础学术游戏引擎库(Bagel)是您将用于开发的游戏引擎你的游戏。你可以在这里找到Bagel的文档。
协调
屏幕上的每个坐标都用(x,y)对来描述。(0,0)表示的左上角屏幕,并且坐标向右下角增加。这些坐标中的每一个都被称为像素Bagel Point类封装了这一点。
框架
Bagel将以与显示器相同的刷新率刷新程序的逻辑。每次屏幕将被清除为空白状态,所有图形都将重新绘制。这些步骤中的每一个称为框架。每次渲染帧时,ShadowMario中的update()方法是打电话。正是在这种方法中,您需要更新游戏的状态。
刷新率通常为每秒120次(Hz),但有些设备的刷新率可能较低60Hz。在这种情况下,当你的游戏运行时,它可能与演示视频不同,因为本说明书中的常数值已被选择用于120Hz的刷新率。为了你方便,在编写和测试代码时,您可以更改这些值来制作游戏可播放(这些变化将在后面解释)。如果您确实更改了值,请记住更改它们在提交之前返回到原始规范值,因为您的代码将标记在120Hz屏幕。
游戏元素
以下是您需要实现的不同游戏元素的概述。
窗口和背景
背景(background.png)应该在屏幕上呈现,并完全填满您的整个游戏的窗口。默认窗口大小应为1024*768像素。背景已经在骨架包中为您实现。信息
所有消息都应使用res文件夹(FSO8BITR.ttf)中提供的字体呈现。代 写SWEN20003面向对象软件开发项目如果不是否则,消息坐标应大致居中。
提示:Font类中的drawString()方法使用给定的坐标作为左下角的消息。因此,要使消息居中,您需要使用
Window.getWidth()和Window.getHeight()方法。3.
SWEN20003面向对象软件开发项目1,2024游戏开始
当游戏运行时,应该以字体呈现一条标题消息,内容为SHADOW MARIO假如此消息的左下角应位于(220250)处,大小为64。此外,一条由2行组成的指令消息:
按空格键开始
使用箭头键移动
应在标题消息下方以提供的字体呈现,大小为24。的左下角消息中的第一行应计算如下:x坐标应居中
水平方向,y坐标应为500像素。
两行之间必须有足够的间距以确保可读性(您可以决定
这个间距的值,只要它不够小,以至于文本重叠或太大
它不适合屏幕)。
属性文件
游戏的关键值列在骨架包中提供的两个属性文件中。消息坐标、图像文件名和其他值在app.properties中给出文件消息字符串在messageen.properties文件中给出。这些文件不应该已编辑(除非您需要针对任何帧速率问题调整值)。
若要从其中一个属性中读取值,必须创建properties对象。这个可以对此对象调用getProperty方法,并将所需的值作为参数。骨架包包含一个如何读取背景的示例,供您参考图像文件名、窗口宽度和窗口高度值。
世界文件
实体将在世界文件中定义,描述类型及其在窗口中的位置。世界文件位于res/level1.csv。世界文件是逗号分隔值(CSV)文件具有以下格式之一的行:
实体类型,x坐标,y坐标
世界文件示例:
平台,3000745
玩家,100687
硬币,300510
敌人,400695
END_FLAG,4100670
给定的(x,y)坐标指的是每个图像的中心,这些坐标应为用于绘制每个图像。您必须实际加载它——例如,复制和粘贴数据不允许。标记将在相同格式的隐藏的不同CSV文件上进行。笔记4.
SWEN20003面向对象软件开发项目1,2024您可以假设CSV中有50行,并且始终至少有一行
每个用于所有实体。你也可以假设项目1有14个敌人和33个硬币。获胜条件
如果玩家到达(碰撞)终点旗,则视为获胜。获胜的消息,它由2行组成:
祝贺你,你赢了!
按空格继续
应该以提供的字体呈现为24号。中第一行的左下角
消息应计算如下:x坐标应水平居中
y坐标应为400像素。如果按下空格键,游戏将返回到开始屏幕并允许玩家再次玩。
失去条件
如果玩家的生命值降低到0或以下,则视为失败,游戏结束。一条消息,由两行组成:
比赛结束了,你输了!
按空格继续
应该以提供的字体呈现为24号。中第一行的左下角
消息应计算如下:x坐标应水平居中
y坐标应为400像素。
如果再次按下空格键,游戏将返回到开始屏幕并允许玩家再次演奏。如果玩家在任何时候终止游戏窗口(通过按下Escape键或者单击“退出”按钮),窗口将简单地关闭,并且不会显示任何消息。游戏实体
以下游戏实体具有关联的图像(或多个!)和开始位置(x,y请记住,所有图像都是使用这些坐标从图像中心绘制的。游戏者
在我们的游戏中,当
按下相应的箭头键。然而,为了便于实现,我们假设
只能垂直移动并在水平方向上保持静止(即其他实体
将相对于玩家按下的箭头键移动——这将在后面详细解释)。5.
SWEN20003面向对象软件开发项目1,2024(a) 玩家左.png(b)玩家右.png
图2:玩家的图像
玩家由上面显示的两个图像表示。根据玩家的方向
移动时,应渲染相应的图像。玩家将面朝右开始游戏。
选手向上跳跃的动作将分三个阶段考虑,其中垂直方向的速度方向将改变:
播放器当前在平台上,按下向上箭头键=>垂直速度应为设置为-20(即,y坐标将每帧减少20个像素)。
在玩家跳跃动作过程中=>垂直速度应每帧增加1。
玩家已完成跳跃并再次到达平台=>垂直速度应设置为0并且玩家不应移动到平台下方。
提示:记住y在屏幕上是向下增加的。
图3:玩家得分
玩家有一个相关的分数。当玩家与
硬币,玩家的分数增加1(硬币的积分值)。这个
分数以的格式呈现在屏幕的左上角
“得分k”,其中k是当前得分。这个的左下角
消息应位于(35,35),字体大小应为30。
图4:玩家的健康状况
当玩家与敌人相撞时,玩家的生命值会降低
0.5(敌人的伤害点值)。玩家开始游戏
健康值为1。健康值显示在右上角
屏幕的一角,格式为“HEALTH k”,其中k是当前值运行状况,显示为总运行状况的整数百分比。左下角
此消息的角应位于(750,35)处,字体大小应为30。如果玩家的生命值小于或等于零,玩家将垂直向下移动
离开屏幕,游戏结束。这是通过将垂直速度设置为每帧2个像素来实现的。敌人
图5:enemy.png
敌人是由enemy.png显示的实体,可以在水平方向上移动。它的伤害点值为0.5。当玩家的按下箭头键,敌人将相应地移动,如下所述。
6.
SWEN20003面向对象软件开发项目1,2024当玩家按下或按住右箭头键时,敌人将向左移动5
每帧像素。当玩家按下或按住左箭头键时,敌人会移动
以同样的速度向右移动。当敌人与玩家碰撞时,会对玩家造成伤害球员的健康状况如前所述。一旦敌人造成一次伤害,就不能造成即使发生进一步碰撞,也会再次造成损坏。
碰撞检测
为了检测碰撞,首先通过将敌人图像的半径和
玩家图像的半径。这两个值都在app.properties文件中给出。玩家和敌人之间的当前距离是通过计算欧几里得距离来确定的在两个(x,y)坐标之间。如果当前距离小于或等于该范围,这被视为碰撞。
硬币
图6:coin.png
硬币是由coin.png显示的实体,可以在两个水平方向上移动和垂直方向。它的点值为1。当玩家的箭
按下键,硬币将按如下所述移动。
当玩家按下或按住右箭头键时,硬币将
每帧向左移动5个像素。当玩家的左箭头键被按下或按住时,硬币将以同样的速度向右移动。
当硬币与玩家碰撞时,玩家的分数增加1。碰撞检测的确定方式与上述Enemy部分中所述的方式相同。一旦发生碰撞,硬币会向上移动并从屏幕上消失。这是通过将垂直速度设置为-每帧10个像素。
站台
图7:platform.png(裁剪后显示在一页上)平台是platform.png显示的实体,可以在水平方向上移动。当按下玩家的箭头键时,平台将按如下所述移动。
当按下或按住玩家的右箭头键时,平台将向左移动
每帧5个像素。当按下或按住玩家的左箭头键时,平台将仅当平台的当前x坐标小于3000时,才能以相同的速度向右移动。7.
SWEN20003面向对象软件开发项目1,2024结束标志
图8:endflag.png
结束标志是endflag.png显示的一个实体,它可以在水平方向。当按下玩家的箭头键时,标志
将如下所述移动。
当按下或按住玩家的右箭头键时,旗帜将
每帧向左移动5个像素。当玩家的左箭头
按下或按住键,标志将以相同的速度向右移动。
当旗帜与玩家碰撞时,游戏以玩家获胜告终。碰撞检测
以与“敌人”部分中所述相同的方式进行检查。
您的代码
你必须提交一个名为ShadowMario的类,该类包含一个运行游戏的主方法如上所述。您可以选择创建您认为合适的尽可能多的其他类请注意本主题中迄今为止讨论的面向对象设计的原则。您将接受评估基于您的代码正确运行,以及Java概念的有效使用。一如既往软件工程、适当的注释和变量/方法/类名都很重要。
实施检查表
为了让您开始,这里有一个游戏功能清单,以及一个建议的实现顺序他们
在屏幕上绘制标题和游戏说明信息
阅读世界文件,并在屏幕上绘制平台
在屏幕上画出玩家、一枚硬币、一个敌人和平台
为上述4个实体实施移动逻辑
实现世界文件中所有实体的图像渲染和移动
当玩家与硬币相撞时,实施记分行为
为玩家实施健康逻辑
实现中奖检测并在屏幕上绘制中奖信息
实现丢失检测并在屏幕上绘制丢失信息
提供的包装
您将收到一个名为project-1-skeleton.zip的包,其中包含以下内容:(1)ShadowMario和IOUtils类的骨架代码可以帮助您入门,存储在src中8.
SWEN20003面向对象软件开发项目1,2024文件夹(2) 构建游戏所需的所有图形、字体和属性都存储在res中文件夹3.Maven所需的pom.xml文件。以下是更详细的描述:res/–游戏的图形和字体(不允许修改中的任何文件此文件夹)。
–background.png:表示背景的图像。
–coin.png:表示硬币的图像。
–endflag.png:表示结束标志的图像。
–enemy.png:表示敌人的图像。
–platform.png:表示平台的图像。
–player left.png:代表玩家面朝左的图像。–player right.png:代表玩家面朝右侧的图像。–app.properties:包含坐标、值和文件路径的属性文件。–message en.properties:包含消息字符串的属性文件。–FSO8BITR.ttf:在整个游戏中使用的字体。–level1.csv:第一级的世界文件。
–credit.txt:包含字体和图像信用的文件(您可以忽略此文件)。src/–游戏的骨架代码。
–ShadowMario.java:包含游戏入口点和update()方法绘制背景。
–IOUtils.java:具有读取CSV文件的空方法和已完成读取Properties文件的方法。
pom.xml:设置Maven依赖项所需的文件。
提交和标记
初次提交
为了确保您在启动项目时正确设置了本地和远程存储库,您必须在2024年3月28日星期四或之前在
晚上11:30。
1.从GitLab中克隆[用户名]-project-1文件夹。2.从Canvas下载项目1下的project-1-skeleton.zip包。3.打开拉链。
4.将解压缩文件夹的内容移动到您的
本地机器。
9
SWEN20003面向对象软件开发项目1,20245.添加、提交并使用提交消息将此更改推送到您的远程存储库“初次提交”。
6.检查您对Gitlab的推送是否成功并到达正确的位置。完成这项工作后,您可以通过添加代码来开始实现该项目,以满足本规范的要求。请记得定期添加、提交和推送您的代码有意义的提交消息。
您必须按照上述说明在截止日期前完成首次提交。不
这样做将导致该项目被罚3分。最好在开始项目之前进行初始提交,这样您就可以定期提交并推送到Gitlab,因为一开始。但是,如果您在完成初始提交之前就开始在本地处理项目,那也没关系,只需确保将项目文件夹中的所有内容移动到[用户名]-project-1在您的本地计算机中。技术要求
程序必须使用Java编程语言编写。
注释和类名必须仅使用英语。
程序不得依赖于Java标准库以外的任何库,以及
Bagel库(以及Bagel的依赖项)。
程序必须完全编译,没有错误。
提交将通过GitLab进行。您要提交到您的<用户名>-项目-1存储库。至少你应该遵循下面的结构。您可以创建
如果需要,可以在存储库中添加更多文件/目录。
用户名-项目-1
物件
用于项目1的资源
src
ShadowMario.java
其他Java文件
2024年4月17日晚上11:30,您的最新提交将自动从GitLab中获取。委员会
您可以自由地将发布截止日期推送到您的存储库,但仅限于当天或之前的最新提交2024年4月17日11:30将被标记。您必须至少进行5次提交(不包括Initial提交承诺)贯穿项目的整个开发过程,并且它们必须具有有意义消息(提交消息必须与提交中的代码匹配)。如果提交异常(例如。提交消息与代码不匹配,在两次提交中提交了大量代码
它们在时间上相距不远),你就有被处罚的风险。
10
SWEN20003面向对象软件开发项目1,2024好的、有意义的提交消息示例:
实施的移动逻辑
纠正球员的得分行为
重构代码以实现更简洁的设计
错误、无益的提交消息示例:
fesjakhbdjl
是的,很容易就完成了逻辑
固定的东西zzz
良好的编码风格
良好的编码风格是一个有争议的问题;但是,我们将根据以下标准:
您不应该在事后返回并评论您的代码。你应该试着评论
当你走的时候。
您应该注意确保正确使用可见性修改器。除非你有一个非常有充分的理由,所有实例变量都应该是私有的(除了常量)。任何常量都应定义为最终静态变量(注意:对于图像和字体对象,仅使用最终版本)。常数可以是公共的,具体取决于用法。不要使用魔术数字!考虑您的代码是否通过适当使用类而易于扩展。
确保每节课作为一个有凝聚力的整体都有意义。一个类应该有一个定义明确的目的,并应包含实现此目的所需的所有数据。
延期和延期提交
如果您需要项目延期,请填写项目中的延期表格
Canvas上的模块。一定要用一些证明文件来解释你的情况如医疗证明、学业调整计划、结婚邀请等。您将收到
一封电子邮件,说明延期是否获得批准,或者我们是否需要更多信息。该项目定于晚上11:30整完成。在此时间之后(从晚上11:30开始)收到的任何提交文件此后)将被视为延迟,除非已批准延期。没有例外。
迟到的项目将被罚1分,每24小时再加1分。如果你
逾期提交(无论是否延期),请填写项目中的逾期表格
Canvas上的模块。对于这两种表格,您都需要使用您的大学帐户登录。请不要向任何教学团队发送有关延期或延期提交的电子邮件。11
SWEN20003面向对象软件开发项目1,2024标志
在该科目的总分100分中,项目1得10分。尽管你可能会看到继承可以用于将来的可扩展性,不需要在中使用继承
项目
注意:未完成初次提交(如提交和标记中所述
部分)在开始您的项目之前将导致3分的处罚!
功能实施正确–6.5分
–启动屏幕执行正确:(0.5分)
–正确执行玩家图像和动作:(1分)
–平台形象和动作执行正确:(1分)
–正确执行敌人图像和移动(包括玩家碰撞逻辑):(1分)–硬币图像和移动(包括玩家碰撞逻辑)正确执行:
(1个标记)
–端旗图像和移动正确执行:(1分)
–获胜检测正确执行,并呈现获胜消息:(0.5分)
–通过游戏结束消息正确执行损失检测:(0.5分)
代码(编码风格、文档、良好的面向对象原则)——3.5分–授权和衔接–将代码分解为适当的类,每个类都是
包含所有数据的完整单元:(1个标记)
–方法的使用–避免重复代码和过长/复杂的方法:(1分)–代码样式–可见性修饰符、一致缩进、缺少幻数、注释等:(1.5分)