1、综合课程设计报告题目: 马里奥游戏班级:xxxxxxxx姓名:xxxxxxxxx学号:xxxxxxxxx指导教师: xxxx完毕日期: xx年 xx月 xx日 一、 设计内容 程序面向对象设计 :马里奥对象,敌人对象,障碍物对象,场景对象,窗体对象,图片以及音乐对象等等。欧阳茂: 1)游戏操作:玩家操作游戏方法 2)障碍物的开发:开发游戏中的障碍物 3)马里奥主角的开发 :开发马里奥主角 4)马里奥与障碍物 :开发马里奥碰到障碍物的不同状态 5)敌人的开发 :不同敌人类的开发,涉及三角怪,食人花 6)敌人与马里奥:马里奥碰到不同敌人的状态刘金凤: 1)美工设计:图片美化,游戏体验度 2)窗体类
2、的设计:将游戏显示到界面 3)开发游戏场景:开发游戏的背景或者游戏环境 4)通关开发:马里奥通过当前进入下一个通关 5)其他:计分,生命,音乐,时间的设定 二、设计目的开始游戏时,Mario 会有3条生命,消灭敌人或顶一些物品可以得到分数, 每到500分会增长一条生命,假如Mario 被敌人杀死或是掉下悬崖,会失去 一条生命,并从该版面重新开始游戏,假如Mario 的生命数为0,则游戏结束,返回标题画面重新开始游戏。设计中的基本规定: 1) 完毕游戏人物的基本动作,上下左右,跳跃等 2) 完毕障碍物和敌人类的操作以及不同的设定 3) 完毕通关以及每一个关的障碍物和场景都不同样 4) 完毕游戏人
3、物的声明和加分问题 5) 完毕游戏时间的设定,游戏的开始和结束设计中的更高规定: 1) 游戏运营流畅,用户体验好 2) 游戏尽量考虑内存资源合理运用 3) 游戏画面美观,不同的通关难以限度不同 4) 游戏可以具有足够的吸引力 三、需求分析游戏行业火爆近十年,特别是网络游戏的势头非常的猛,已经成为很数年轻人不可或缺的娱乐工具。据报告指出,游戏行业市场已经是我们最有活力的行业,互联网和宽带的普及也进一步的加快了游戏行业的发展。特别是2023年,随着4g的到来,相信游戏行业将进一步的加快发展。中国网络游戏打的增势不减,市场巨大:在中国,每年新增网民超过5000w,市场巨大。专家认为,网络游戏定位于大
4、众化娱乐,收费低廉,内容丰富,有助于缓解人们由于工作学习紧张或者经济不景气导致的心理压力。此外,我们游戏行业上市的公司或者拟上市公司,资金充足。由此来看,游戏行业必然会在未来更加的突破。预计2023年的细分市场份额占比仍将保持在70%左右,但是由于端游市场处在高位滞涨状态,增速缓慢,并且还受到页游和移动端游快速发展所带来的冲击,此后端游市场份额将进一步被缩小。而随着游戏娱乐时间碎片化价值的不断提高,一些策略、益智、休闲类的轻游戏同样吸引了大量可支配游戏时间相对较少,但付费能力较强的上班族玩家的青睐,这也为网页游戏发展提供了强劲的增长动力,一些传统端游公司甚至其他互联网公司纷纷进入网页游戏市场。
5、hSn中国行业征询网_行业报告_行业分析_市场调研_第三方市场数据提供商hSn中国行业征询网_行业报告_行业分析_市场调研_第三方市场数据提供商 在移动游戏方面,由于行业进入门槛较低,移动游戏生命周期较短,这就为许多创业型中小公司快速壮大提供了广阔的前景和机遇。随着,移动端游戏质量品质的不断提高,移动端游戏市场的成长即将进入快速上升通道。未来,页游和端游的细分市场份额占比将逐年扩大。hSn中国行业征询网_行业报告_行业分析_市场调研_第三方市场数据提供商 hSn中国行业征询网_行业报告_行业分析_市场调研_第三方市场数据提供商 2023年第一季度中国移动游戏市场规模达成24.3亿元,环比增长率
6、为9.3%;其中智能机移动游戏市场规模为7.9亿元,环比增长率为20.9%。在移动单机游戏方面,市场上重要还是以休闲类、棋牌类的游戏为主,游戏的画面质量在不断提高,未来将会有更多制作精良的单机大作出现;在移动网络游戏方面,我叫MT Online、大掌门等卡牌类移动网络游戏受到市场高度关注,社交竞技元素吸引了大批用户,智能机移动网游在2023年也许迎来大爆发。hSn中国行业征询网_行业报告_行业分析_市场调研_第三方市场数据提供商以下为记录数据: 图1 同类游戏下载量 图2 上半年销售额增长率 图3游戏行业细分段 图4游戏行业规模增长数据 图5 玩家群 图6 同类游戏下载量2四、设计思想4.1程
7、序面向对象设计马里奥对象,敌人对象,障碍物对象,场景对象,窗体对象,图片以及音乐对象如下: 图7 完整马里奥图重要类: 图8 重要设计类重要完毕功能: 图9 重要功能模块4.2 窗体的设计窗体是马里奥游戏的重要界面,其设计重要涉及重要界面的大小,及位置选择。标题,布局等界面属性方面的内容。其中窗体设计中有一个重要的静态属性的设计,即把游戏中的图片进行静态的初始化,其设计类为:(MyFrame)。将游戏中的主角:马里奥图片,场景以及背景图片,敌人食人花,敌人三角怪,障碍物,等需要的图片进行属性的保存,通过io流保存到集合中。以方便取出来,保存到类中(staticValue)。 图10 初始窗体图
8、4.3开发游戏场景 场景是马里奥游戏之中最难控制的一块内容,由于一个马里奥游戏里面有多个通关,并且每一次的通过,里面的敌人和障碍物等的位置都是不同样的。游戏设计越复杂,那么场景的控制就越难。本次场景的通过一个场景类(background)完毕,设计重要涉及:属性的设计:1) 背景图片的设计,即每一个场景的背景图片2) int类型保存场景所在位置(场景的顺序)3) Boolean类型判断当前场景是否为最后一个场景,假如是最后一个场景,那么结束后游戏结束4) 场景中的障碍物和敌人,使用两个集合来进行保存。一个集合保存已经消灭的敌人和障碍物,另一个集合保存未被消灭的敌人和障碍物行为的设计:1) 将所
9、有的属性进行初始化,涉及背景图片,场景顺序,标志。(构造方法中初始化)2) 敌人和障碍物根据游戏的状态(是人物完全死亡,还是暂时死亡)操作死亡集合或者生存集合(新建立一个重置方法)4.4 障碍物的开发 障碍物是游戏中的问号,砖块,绿色框部分,其为马里奥游戏中的重要组成部分包含的属性: 1)障碍物在场景中的坐标(x,y) 2)显示的图片 3)类型(不同的障碍物)4) 初始类型(即障碍物初始的状态,与碰到马里奥之后的状态相对)行为方法:1) 重置障碍物的方法(即当马里奥死亡之后,但生命次数尚未完全用完,那么当马里奥重生的时候,需要要将障碍物和敌人重置)2) 当障碍物碰到马里奥时,改变相应的图片3)
10、 初始化障碍物信息的构造方法4.5将障碍物添加到场景中去障碍物类(obstruction)中拥有障碍物的属性,而场景(background)中的障碍物和敌人,使用两个集合来进行保存。因此可以通过集合来保存各个障碍物在场景中的位置和状态。比如:添加一张北京图片到场景之中,将砖块,问号,绿皮按照障碍物的位置放到相应的位置中去。当然,场景类应当判断当前的场景是属于第一个场景还是其他场景,而初始化不同的障碍物位置。绘图类(Maframe)重要用于图像的显示,将场景中的一切障碍物绘制到界面上去。因此保存有一个场景(background)类的一个对象。通过这个对象通过paint方法绘制到窗口中去。其中:背
11、景图片从坐标(0,0)开始绘制并充满整个屏幕,而其他障碍物通过取得北京中的坐标(x,y)来获得绘制的位置。如下图(红色部分均为障碍物) 图11:障碍物添加到场景图4.6马里奥主角的开发1) 马里奥主角的开发,事实上与障碍物的开发类似,也是创建一个对象(mario)作为操作马里奥的对象,并且马里奥与图片同样也有相应的一些属性和方法。最基本的有2)属性: 坐标(X,Y) 移动速度(xmove,ymove) 跳跃速度(jump,down) 跳跃时间 马里奥人物图片 马里奥状态(这个指马里奥处在向左,向右或者是跳跃状态) 马里奥移动速度的属性(默认为0,当移动的时候改变速度) 马里奥生命次数 分数3)
12、方法: 移动(向左,向右) 停止(向左,向右) 跳跃(在地面或者障碍物上面可以跳跃,否则不能跳跃)4)跳跃的马里奥状态解决:马里奥跳跃的时候分为两种情况,一种是点击跳跃键在空中,一种是离开障碍物掉落到空中。在这里考虑的因素很多,在跳跃的时候可以进行向左或者向右方向的控制,但是当已经在空中的时候却不能再进行控制跳跃问题了,并且在跳跃过程中尚有相关的马里奥图片的切换。 4) 其他解决: 马里奥是一个动态的角色,因此在他移动或者停止的时候,都应当有不同的状态,即有不同的图片与之相应。并且要区分是向左还是向右。 图12 马里奥状态图4.7 将马里奥对象加入到窗体之中 1)和障碍物添加类似,将马里奥绘制
13、到窗体之中,但是由于马里奥是动态的,因此需要添加两个线程,如下: 2)添加线程一:由于马里奥移动的时候也许是一直进行的,(mario)类必须实现一个线程专门为马里奥这个角色服务,一直改变马里奥的坐标。 3)添加线程二:马里奥角色的状态在一直改变,因此需要同步的刷新,即同步的改变马里奥在窗体中的图片。 图13 怪物与障碍物4.8 将马里奥角色与障碍物进行设立 1)障碍物(obstruction)与马里奥(mario)的关系是,都是在场景之中的,因此要设立马里奥与障碍物之间的联系与冲突就必须使用场景来作为中间桥梁。因此,在马里奥(mario)对象之中创建一个场景属性,以便于操作场景中的障碍物与马里
14、奥之间的关系。2)横向阻挡:障碍物与马里奥之间的冲突和联系重要是使用坐标来进行设立,解释为:当马里奥处在哪个区域可以活动,处在哪个区域不可以活动。(碰到障碍物和在边界时移动都会受到限制)3)纵向阻挡: 在地面或者障碍物上面可以跳跃,否则不能跳跃。因此在纵向马里奥仍然有一个活动范围。4)当马里奥越到障碍物的时候,障碍物响应状态的改变问题。比如:当从下往上撞到问号时,那么问号则变为铁块,而以这种方式撞到砖块的时候,砖块消失。这里也涉及到障碍物与马里奥活动范围的问题。4.9 切换场景: 当马里奥移动到屏幕的最右端,需要将当前场景,切换为下一个场景。绘制各个场景。当马里奥移动到最右端的时候,就立即进行
15、场景的切换。4.10 敌人的开发:1)马里奥游戏中有各种不同的敌人,并且各种敌人的移动方式和移动范围都有不同,因此在定义敌人类的时候也需要一定的属性和方法,如下:2)属性:坐标:(x ,y)初始坐标:(x,y)类型:即敌人类型显示的图片:敌人类的图片移动方向:不同的敌人有不同的移动方向最大移动坐标:敌人的移动范围3) 行为:重置方法:当重置场景的时候。(就是对场景中的两种结合的删除,添加操作)死亡:地人类被消灭线程:同马里奥同样,也需要实现一个单独的线程来实现敌人类的行为。但是与马里奥不同的是敌人的移动是在固定的位置进行的移动,不需要添加 上下左右的行为,而是自动的进行的移动操作。 图14 马
16、里奥与敌人4.11 敌人放到场景之中: 1)将敌人类添加到相应的场景(background)之中,即将各种敌人放到(background)的敌人类集合之中。同时在(mainframe)中通过敌人类不同的坐标绘制图像。 2)与马里奥同样,敌人类也有自己的移动状态,因此需要根据敌人的行为进行图片的切换。并且在mframe中进行不断刷新,与敌人的移动速度一致。 图15 敌人三角怪 图16 敌人食人花 4.12敌人与马里奥: 敌人类与马里奥的关系就是一个互相袭击的关系。对于不同的敌人,马里奥也会有不同的状态。对于三角怪,当马里奥与三角怪横向碰撞的时候,马里奥必然会失去一条生命,但是当在纵向碰撞的时候敌
17、人会死亡。而对于食人花,不管马里奥与食人花以如何的形式碰撞都会失望。 敌人与马里奥的判断,跟障碍物与马里奥判断类似。而不同的是敌人是移动的。因此通过(mario)类中的场景对象,可以对敌人的状态进行控制,判断敌人当前的与马里奥的相对情况。而做出不同的结果判断。4.13马里奥死亡的解释: 马里奥的死亡也许是由于与三角怪横向碰撞,也也许是与食人花纵向碰撞,也也许是走进了地面的漏洞之中。 4.14其他游戏相关: 分数的属性是放在(mario)类中的,因此通过马里奥杀的敌人数和顶的问号或者砖块数进行分数的增长或者不变,跟着马里奥主角的变化而变化。而当马里奥死亡之后,分数需要重置。 马里奥的声明次数只有
18、三次,因此,可以通过马里奥的属性进行记录。当马里奥死亡一次之后,敌人和砖块都需要重置,分数也需要重置 时间是由马里奥属性控制,一直跟着玛丽奥的开始,当声明结束一次的时候,重置。当一关花了太多的时间的时候,那么就结束或者当闯关完全就结束。而结束的时候仅仅设立一个标志。当到达这个标志的时候就结束后。 图17分数 时间 生命图 图18 马里奥开始五、 具体实现5.1马里奥类的具体实现 马里奥主角的开发,事实上与障碍物的开发类似,也是创建一个对象(mario)作为操作马里奥的对象,并且马里奥与图片同样也有相应的一些 属性和方法。public class Mario implements Runnabl
19、e private int x = 0; /移动坐标private int y = 490;private int width = 60; /马里奥占用范围private int height = 60;private BufferedImage nowImage = null; /马里奥图片集合private int xmove = 0; /移动速度private int ymove = 0;private String status = right - standing;private boolean inLand = true; /是否着陆判断private int movingImg
20、= 0; /移动标志private int upFlag = 0; /是否在空中标志private int airTime = 0; /在空中时间private Thread t = new Thread(this); /马里奥线程private boolean leftFlag = true; /向左移动标志private boolean rightFlag = true;/向右移动标志private BackGround bg = null; /当前场景private boolean deadFlag = false; /死亡标志private int score = 0; /分数priv
21、ate int life = 3; /生命private int oldLifeFlag = 0; /是否超时private boolean winFlag = false;/是否胜利.5.2 马里奥移动代码 马里奥是一个动态的角色,因此在他移动或者停止的时候,都应当有不同的状态,即有不同的图片与之相应。并且要区分是向左还是向右。下面是具体的移动代码。与以上的属性相相应public void moveLeft() /向左移动if (leftFlag) xmove = -5;if (status.indexOf(jumping) != -1) status = left - jumping; e
22、lse status = left - moving;public void moveRight() /向右移动if (rightFlag) xmove = 5;if (status.indexOf(jumping) != -1) status = right - jumping; else status = right - moving;public void stopLeft() /向左停止xmove = 0;if (status.indexOf(jumping) != -1) status = left - jumping; else status = left - standing;m
23、ovingImg = 1;public void stopRight() /向右停止xmove = 0;if (status.indexOf(jumping) != -1) status = right - jumping; else status = right - standing;movingImg = 1;public void jump() /跳跃if (status.indexOf(jumping) = -1) if (status.indexOf(right) != -1) status = right - jumping; else status = left - jumpin
24、g;this.upFlag = 1;this.inLand = false;ymove = -10;public void down() /向下移动if (status.indexOf(right) != -1) status = right - jumping; else status = left - jumping;this.upFlag = -1;ymove = 10;5.3场景类 场景是马里奥游戏之中最难控制的一块内容,由于一个马里奥游戏里面有多个通关,并且每一次的通过,里面的敌人和障碍物等的位置都是不同样的。游戏设计越复杂,那么场景的控制就越难。public class BackG
25、round private List obs = null; /包含所有的障碍物private BufferedImage nowImage = null; /包含当前场景private List removedObs = null ; /移除的障碍物private List removedEns = null;/移除的 .5.4障碍物类 障碍物类(obstruction)中拥有障碍物的属性,而场景(background)中的障碍物和敌人,使用两个集合来进行保存。因此可以通过集合来保存各个障碍物在场景中的位置和状态。比如:添加一张北京图片到场景之中,将砖块,问号,绿皮按照障碍物的位置放到相应的
26、位置中去。当然,场景类应当判断当前的场景是属于第一个场景还是其他场景,而初始化不同的障碍物位置。public class Obstruction implements Runnable /障碍物类private int x = 0;/坐标private int y = 0;private int type = 0; /障碍物类型private int startX = 0 ; /障碍物初始坐标private int startY = 0 ;private int startType = 0 ; /障碍物开始类型private Thread t = new Thread(this); /障碍物线
27、程private BufferedImage bf = null; /所有的障碍物图片集合.5.4敌人类 敌人类与马里奥的关系就是一个互相袭击的关系。对于不同的敌人,马里奥也会有不同的状态。对于三角怪,当马里奥与三角怪横向碰撞的时候,马里奥必然会失去一条生命,但是当在纵向碰撞的时候敌人会死亡。而对于食人花,不管马里奥与食人花以如何的形式碰撞都会失望。 敌人与马里奥的判断,跟障碍物与马里奥判断类似。而不同的是敌人是移动的。因此通过(mario)类中的场景对象,可以对敌人的状态进行控制,判断敌人当前的与马里奥的相对情况。而做出不同的结果判断。 public class Enemy implemen
28、ts Runnable /敌人类private int x; /敌人类坐标private int y;private int startX; /敌人类初始坐标private int startY;private int startType; /敌人类类型private int width; /敌人类占用范围private int height;private boolean moveLeft = true; /向左移移动判断标志private BufferedImage nowImage = null; /当前图片集合private int type = 0;private Thread t
29、= new Thread(this); /当前线程private int imageFlag = 0; private BackGround bg = null; /场景对象private boolean deadFlag = false; /死亡标志private boolean moveUp = true;/向上移动判断private int uplimit = 0;/向上移动限制private int downlimit = 0;/向下移动限制private boolean stop = true;/是否停止标志private int stopTime = 0;/时间限制private
30、boolean trutleFlag = false; /三角怪private boolean movingFlag = false; /是否可以移动 .六、 附录Backgournd: /场景类的属性和方法ens : Listflag : ObstructionnowImage : BufferedImageobs : Listposition : intremovedEns : ListremovedObs : ListstatusFlag : intBackGround(BufferedImage, int)bgRemove()enemyStartMove()getEns()getFla
31、g()getNowImage()getObs()getPosition()getRemovedEns()getRemovedObs()getStatusFlag()initobs()resetObs()setEns(List)setNowImage(BufferedImage)setObs(List)setPosition(int)setStatusFlag(int)stopGame()Enemy: /敌人类的属性和方法bg : BackGrounddeadFlag : booleandownlimit : intheight : intimageFlag : intmoveLeft : bo
32、oleanmoveUp : booleanmovingFlag : booleannowImage : BufferedImagestartType : intstartX : intstartY : intstop : booleanstopTime : intt : ThreadtrutleFlag : booleantype : intuplimit : intwidth : intx : inty : intEnemy(int, int, int, BackGround)Enemy(int, int, int, BackGround, int, int)dead()getDownlim
33、it()getHeight()getNowImage()getT()getType()getUplimit()getWidth()getX()getY()initEm()isMovingFlag()isTrutleFlag()run()setBg(BackGround)setDownlimit(int)setHeight(int)setMoveLeft(boolean)setMovingFlag(boolean)setNowImage(BufferedImage)setTrutleFlag(boolean)setType(int)setUplimit(int)setWidth(int)setX
34、(int)setY(int)Mario类的属性及方法:airTime : intbg : BackGrounddeadFlag : booleanheight : intinLand : booleanleftFlag : booleanlife : intmovingImg : intnowImage : BufferedImageoldLifeFlag : intrightFlag : booleanscore : intstatus : Stringt : ThreadupFlag : intwidth : intwinFlag : booleanx : intxmove : inty
35、: intymove : intMario(int, int)Mario(int, int, BackGround)Mario(int, int, int, int, int)checkAddLife()down()gameOver()getBg()getHeight()getLife()getNowImage()getScore()getStatus()getT()getUpFlag()getWidth()getX()getY()isDeadFlag()isInLand()isLeftFlag()isRightFlag()isWinFlag()jump()moveLeft()moveRigh
36、t()run()setBg(BackGround)setDeadFlag(boolean)setHeight(int)setInLand(boolean)setLeftFlag(boolean)setLife(int)setNowImage(BufferedImage)setRightFlag(boolean)setStatus(String)setUpFlag(int)setWidth(int)setWinFlag(boolean)setX(int)setXmove(int)setY(int)setYmove(int)stopLeft()stopRight()Mframe图形类的属性和方法a
37、llImage : BufferedImageBGIMG : BufferedImagedeadImg : BufferedImageEDIMG : BufferedImageFLAGIMG : BufferedImageFLOIMG : ListOBSIMG : ListserialVersionUID : longSTIMG : BufferedImageTRIIMG : ListTURIMG : ListallBg : Listbg : BackGroundfirst : booleanimagePath : StringisPlaying : booleanmario : Mariom
38、essage : Stringsequence : Sequencesequencer : Sequencerstartflag : booleant : ThreadtempTime : inttime : intMyFrame()changeBg()getTime()keyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)loadMidi(String)paint(Graphics)play()restartGame()run()障碍物的属性及方法:Obstruction.javabf : BufferedImagestartType : intstartX : intstartY : intt : Threadtype : intx : inty : intObstruction(int, int, int)checkEnemy(List)getBf()getType()getX()getY()initOb()run()setBf(BufferedImage)setImg()setType(int)setX(int)setY(int)