马里奥游戏设计报告.doc
综合课程设计报告题目: 马里奥游戏班级:xxxxxxxx姓名:xxxxxxxxx学号:xxxxxxxxx指导教师: xxxx完成日期: xx年 xx月 xx日 一、 设计内容 程序面向对象设计 :马里奥对象,敌人对象,障碍物对象,场景对象,窗体对象,图片以及音乐对象等等。欧阳茂: 1)游戏操作:玩家操作游戏方法 2)障碍物的开发:开发游戏中的障碍物 3)马里奥主角的开发 :开发马里奥主角 4)马里奥与障碍物 :开发马里奥遇到障碍物的不同状态 5)敌人的开发 :不同敌人类的开发,包括三角怪,食人花 6)敌人与马里奥:马里奥遇到不同敌人的状态刘金凤: 1)美工设计:图片美化,游戏体验度 2)窗体类的设计:将游戏显示到界面 3)开发游戏场景:开发游戏的背景或者游戏环境 4)通关开发:马里奥通过当前进入下一个通关 5)其他:计分,生命,音乐,时间的设定 二、设计目标开始游戏时,Mario 会有3条生命,消灭敌人或顶一些物品可以得到分数, 每到500分会增加一条生命,如果Mario 被敌人杀死或是掉下悬崖,会失去 一条生命,并从该版面重新开始游戏,如果Mario 的生命数为0,则游戏结束,返回标题画面重新开始游戏。设计中的基本要求: 1) 完成游戏人物的基本动作,上下左右,跳跃等 2) 完成障碍物和敌人类的操作以及不同的设定 3) 完成通关以及每一个关的障碍物和场景都不一样 4) 完成游戏人物的声明和加分问题 5) 完成游戏时间的设定,游戏的开始和结束设计中的更高要求: 1) 游戏运行流畅,用户体验好 2) 游戏尽量考虑内存资源合理利用 3) 游戏画面美观,不同的通关难以程度不同 4) 游戏能够具有足够的吸引力 三、需求分析游戏行业火爆近十年,尤其是网络游戏的势头非常的猛,已经成为很多年轻人不可或缺的娱乐工具。据报告指出,游戏行业市场已经是我们最有活力的行业,互联网和宽带的普及也进一步的加快了游戏行业的发展。特别是2014年,随着4g的到来,相信游戏行业将进一步的加快发展。中国网络游戏打的增势不减,市场巨大:在中国,每年新增网民超过5000w,市场巨大。专家认为,网络游戏定位于大众化娱乐,收费低廉,内容丰富,有利于缓解人们因为工作学习紧张或者经济不景气造成的心理压力。另外,我们游戏行业上市的公司或者拟上市公司,资金充足。由此来看,游戏行业必然会在未来更加的突破。预计2014年的细分市场份额占比仍将保持在70%左右,但是由于端游市场处于高位滞涨状态,增速缓慢,并且还受到页游和移动端游快速发展所带来的冲击,今后端游市场份额将进一步被缩小。而随着游戏娱乐时间碎片化价值的不断提高,一些策略、益智、休闲类的轻游戏同样吸引了大量可支配游戏时间相对较少,但付费能力较强的上班族玩家的青睐,这也为网页游戏发展提供了强劲的增长动力,一些传统端游企业甚至其他互联网企业纷纷进入网页游戏市场。hSn中国行业咨询网_行业报告_行业分析_市场调研_第三方市场数据提供商hSn中国行业咨询网_行业报告_行业分析_市场调研_第三方市场数据提供商 在移动游戏方面,由于行业进入门槛较低,移动游戏生命周期较短,这就为许多创业型中小企业快速壮大提供了广阔的前景和机遇。随着,移动端游戏质量品质的不断提高,移动端游戏市场的成长即将进入快速上升通道。未来,页游和端游的细分市场份额占比将逐年扩大。hSn中国行业咨询网_行业报告_行业分析_市场调研_第三方市场数据提供商 hSn中国行业咨询网_行业报告_行业分析_市场调研_第三方市场数据提供商 2013年第一季度中国移动游戏市场规模达到24.3亿元,环比增长率为9.3%;其中智能机移动游戏市场规模为7.9亿元,环比增长率为20.9%。在移动单机游戏方面,市场上主要还是以休闲类、棋牌类的游戏为主,游戏的画面质量在不断提高,未来将会有更多制作精良的单机大作出现;在移动网络游戏方面,我叫MT Online、大掌门等卡牌类移动网络游戏受到市场高度关注,社交竞技元素吸引了大批用户,智能机移动网游在2014年可能迎来大爆发。hSn中国行业咨询网_行业报告_行业分析_市场调研_第三方市场数据提供商以下为统计数据: 图1 同类游戏下载量 图2 上半年销售额增长率 图3游戏行业细分段 图4游戏行业规模增长数据 图5 玩家群 图6 同类游戏下载量2四、设计思想4.1程序面向对象设计马里奥对象,敌人对象,障碍物对象,场景对象,窗体对象,图片以及音乐对象如下: 图7 完整马里奥图主要类: 图8 主要设计类主要完成功能: 图9 主要功能模块4.2 窗体的设计窗体是马里奥游戏的主要界面,其设计主要包括主要界面的大小,及位置选择。标题,布局等界面属性方面的内容。其中窗体设计中有一个重要的静态属性的设计,即把游戏中的图片进行静态的初始化,其设计类为:(MyFrame)。将游戏中的主角:马里奥图片,场景以及背景图片,敌人食人花,敌人三角怪,障碍物,等需要的图片进行属性的保存,通过io流保存到集合中。以方便取出来,保存到类中(staticValue)。 图10 初始窗体图4.3开发游戏场景 场景是马里奥游戏之中最难控制的一块内容,因为一个马里奥游戏里面有多个通关,而且每一次的通过,里面的敌人和障碍物等的位置都是不一样的。游戏设计越复杂,那么场景的控制就越难。本次场景的通过一个场景类(background)完成,设计主要包括:属性的设计:1) 背景图片的设计,即每一个场景的背景图片2) int类型保存场景所在位置(场景的顺序)3) Boolean类型判断当前场景是否为最后一个场景,如果是最后一个场景,那么结束后游戏结束4) 场景中的障碍物和敌人,使用两个集合来进行保存。一个集合保存已经消灭的敌人和障碍物,另一个集合保存未被消灭的敌人和障碍物行为的设计:1) 将所有的属性进行初始化,包括背景图片,场景顺序,标志。(构造方法中初始化)2) 敌人和障碍物根据游戏的状态(是人物完全死亡,还是暂时死亡)操作死亡集合或者生存集合(新建立一个重置方法)4.4 障碍物的开发 障碍物是游戏中的问号,砖块,绿色框部分,其为马里奥游戏中的重要组成部分包含的属性: 1)障碍物在场景中的坐标(x,y) 2)显示的图片 3)类型(不同的障碍物)4) 初始类型(即障碍物初始的状态,与遇到马里奥之后的状态相对)行为方法:1) 重置障碍物的方法(即当马里奥死亡之后,但生命次数还未完全用完,那么当马里奥重生的时候,需要要将障碍物和敌人重置)2) 当障碍物遇到马里奥时,改变相应的图片3) 初始化障碍物信息的构造方法4.5将障碍物添加到场景中去障碍物类(obstruction)中拥有障碍物的属性,而场景(background)中的障碍物和敌人,使用两个集合来进行保存。因此可以通过集合来保存各个障碍物在场景中的位置和状态。比如:添加一张北京图片到场景之中,将砖块,问号,绿皮按照障碍物的位置放到对应的位置中去。当然,场景类应该判断当前的场景是属于第一个场景还是其他场景,而初始化不同的障碍物位置。绘图类(Maframe)主要用于图像的显示,将场景中的一切障碍物绘制到界面上去。因此保留有一个场景(background)类的一个对象。通过这个对象通过paint方法绘制到窗口中去。其中:背景图片从坐标(0,0)开始绘制并充满整个屏幕,而其他障碍物通过取得北京中的坐标(x,y)来获得绘制的位置。如下图(红色部分均为障碍物) 图11:障碍物添加到场景图4.6马里奥主角的开发1) 马里奥主角的开发,实际上与障碍物的开发类似,也是创建一个对象(mario)作为操作马里奥的对象,而且马里奥与图片一样也有相应的一些属性和方法。最基本的有2)属性: 坐标(X,Y) 移动速度(xmove,ymove) 跳跃速度(jump,down) 跳跃时间 马里奥人物图片 马里奥状态(这个指马里奥处于向左,向右或者是跳跃状态) 马里奥移动速度的属性(默认为0,当移动的时候改变速度) 马里奥生命次数 分数3)方法: 移动(向左,向右) 停止(向左,向右) 跳跃(在地面或者障碍物上面可以跳跃,否则不能跳跃)4)跳跃的马里奥状态处理:马里奥跳跃的时候分为两种情况,一种是点击跳跃键在空中,一种是离开障碍物掉落到空中。在这里考虑的因素很多,在跳跃的时候可以进行向左或者向右方向的控制,但是当已经在空中的时候却不能再进行控制跳跃问题了,并且在跳跃过程中还有相关的马里奥图片的切换。 4) 其他处理: 马里奥是一个动态的角色,因此在他移动或者停止的时候,都应该有不同的状态,即有不同的图片与之对应。并且要区分是向左还是向右。 图12 马里奥状态图4.7 将马里奥对象加入到窗体之中 1)和障碍物添加类似,将马里奥绘制到窗体之中,但是因为马里奥是动态的,因此需要添加两个线程,如下: 2)添加线程一:因为马里奥移动的时候可能是一直进行的,(mario)类必须实现一个线程专门为马里奥这个角色服务,一直改变马里奥的坐标。 3)添加线程二:马里奥角色的状态在一直改变,因此需要同步的刷新,即同步的改变马里奥在窗体中的图片。 图13 怪物与障碍物4.8 将马里奥角色与障碍物进行设置 1)障碍物(obstruction)与马里奥(mario)的关系是,都是在场景之中的,因此要设置马里奥与障碍物之间的联系与冲突就必须使用场景来作为中间桥梁。因此,在马里奥(mario)对象之中创建一个场景属性,以便于操作场景中的障碍物与马里奥之间的关系。2)横向阻挡:障碍物与马里奥之间的冲突和联系主要是使用坐标来进行设置,解释为:当马里奥处于哪个区域可以活动,处于哪个区域不可以活动。(遇到障碍物和在边界时移动都会受到限制)3)纵向阻挡: 在地面或者障碍物上面可以跳跃,否则不能跳跃。因此在纵向马里奥仍然有一个活动范围。4)当马里奥越到障碍物的时候,障碍物响应状态的改变问题。比如:当从下往上撞到问号时,那么问号则变为铁块,而以这种方式撞到砖块的时候,砖块消失。这里也涉及到障碍物与马里奥活动范围的问题。4.9 切换场景: 当马里奥移动到屏幕的最右端,需要将当前场景,切换为下一个场景。绘制各个场景。当马里奥移动到最右端的时候,就立即进行场景的切换。4.10 敌人的开发:1)马里奥游戏中有各种不同的敌人,并且各种敌人的移动方式和移动范围都有不同,因此在定义敌人类的时候也需要一定的属性和方法,如下:2)属性:坐标:(x ,y)初始坐标:(x,y)类型:即敌人类型显示的图片:敌人类的图片移动方向:不同的敌人有不同的移动方向最大移动坐标:敌人的移动范围3) 行为:重置方法:当重置场景的时候。(就是对场景中的两种结合的删除,添加操作)死亡:地人类被消灭线程:同马里奥一样,也需要实现一个单独的线程来实现敌人类的行为。但是与马里奥不同的是敌人的移动是在固定的位置进行的移动,不需要添加 上下左右的行为,而是自动的进行的移动操作。 图14 马里奥与敌人4.11 敌人放到场景之中: 1)将敌人类添加到对应的场景(background)之中,即将各种敌人放到(background)的敌人类集合之中。同时在(mainframe)中通过敌人类不同的坐标绘制图像。 2)与马里奥一样,敌人类也有自己的移动状态,因此需要根据敌人的行为进行图片的切换。并且在mframe中进行不断刷新,与敌人的移动速度一致。 图15 敌人三角怪 图16 敌人食人花 4.12敌人与马里奥: 敌人类与马里奥的关系就是一个相互攻击的关系。对于不同的敌人,马里奥也会有不同的状态。对于三角怪,当马里奥与三角怪横向碰撞的时候,马里奥必然会失去一条生命,但是当在纵向碰撞的时候敌人会死亡。而对于食人花,不管马里奥与食人花以怎样的形式碰撞都会失望。 敌人与马里奥的判断,跟障碍物与马里奥判断类似。而不同的是敌人是移动的。因此通过(mario)类中的场景对象,可以对敌人的状态进行控制,判断敌人当前的与马里奥的相对情况。而做出不同的结果判断。4.13马里奥死亡的解释: 马里奥的死亡可能是由于与三角怪横向碰撞,也可能是与食人花纵向碰撞,也可能是走进了地面的漏洞之中。 4.14其他游戏相关: 分数的属性是放在(mario)类中的,因此通过马里奥杀的敌人数和顶的问号或者砖块数进行分数的增加或者不变,跟着马里奥主角的变化而变化。而当马里奥死亡之后,分数需要重置。 马里奥的声明次数只有三次,因此,可以通过马里奥的属性进行记录。当马里奥死亡一次之后,敌人和砖块都需要重置,分数也需要重置 时间是由马里奥属性控制,一直跟着玛丽奥的开始,当声明结束一次的时候,重置。当一关花了太多的时间的时候,那么就结束或者当闯关完全就结束。而结束的时候仅仅设置一个标志。当到达这个标志的时候就结束后。 图17分数 时间 生命图 图18 马里奥开始五、 具体实现5.1马里奥类的具体实现 马里奥主角的开发,实际上与障碍物的开发类似,也是创建一个对象(mario)作为操作马里奥的对象,而且马里奥与图片一样也有相应的一些 属性和方法。public class Mario implements Runnable 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 = 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; /分数private 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" else 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"movingImg = 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 - jumping"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 BackGround private List<Obstruction> obs = null; /包含所有的障碍物private BufferedImage nowImage = null; /包含当前场景private List<Obstruction> removedObs = null ; /移除的障碍物private List<Enemy> removedEns = null;/移除的 .5.4障碍物类 障碍物类(obstruction)中拥有障碍物的属性,而场景(background)中的障碍物和敌人,使用两个集合来进行保存。因此可以通过集合来保存各个障碍物在场景中的位置和状态。比如:添加一张北京图片到场景之中,将砖块,问号,绿皮按照障碍物的位置放到对应的位置中去。当然,场景类应该判断当前的场景是属于第一个场景还是其他场景,而初始化不同的障碍物位置。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); /障碍物线程private BufferedImage bf = null; /所有的障碍物图片集合.5.4敌人类 敌人类与马里奥的关系就是一个相互攻击的关系。对于不同的敌人,马里奥也会有不同的状态。对于三角怪,当马里奥与三角怪横向碰撞的时候,马里奥必然会失去一条生命,但是当在纵向碰撞的时候敌人会死亡。而对于食人花,不管马里奥与食人花以怎样的形式碰撞都会失望。 敌人与马里奥的判断,跟障碍物与马里奥判断类似。而不同的是敌人是移动的。因此通过(mario)类中的场景对象,可以对敌人的状态进行控制,判断敌人当前的与马里奥的相对情况。而做出不同的结果判断。 public class Enemy implements 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 = 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 boolean trutleFlag = false; /三角怪private boolean movingFlag = false; /是否能够移动 .六、 附录Backgournd: /场景类的属性和方法ens : List<Enemy>flag : ObstructionnowImage : BufferedImageobs : List<Obstruction>position : intremovedEns : List<Enemy>removedObs : List<Obstruction>statusFlag : intBackGround(BufferedImage, int)bgRemove()enemyStartMove()getEns()getFlag()getNowImage()getObs()getPosition()getRemovedEns()getRemovedObs()getStatusFlag()initobs()resetObs()setEns(List<Enemy>)setNowImage(BufferedImage)setObs(List<Obstruction>)setPosition(int)setStatusFlag(int)stopGame()Enemy: /敌人类的属性和方法bg : BackGrounddeadFlag : booleandownlimit : intheight : intimageFlag : intmoveLeft : booleanmoveUp : 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()getDownlimit()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(int)setY(int)Mario类的属性及方法:airTime : intbg : BackGrounddeadFlag : booleanheight : intinLand : booleanleftFlag : booleanlife : intmovingImg : intnowImage : BufferedImageoldLifeFlag : intrightFlag : booleanscore : intstatus : Stringt : ThreadupFlag : intwidth : intwinFlag : booleanx : intxmove : inty : 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()moveRight()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图形类的属性和方法allImage : BufferedImageBGIMG : BufferedImagedeadImg : BufferedImageEDIMG : BufferedImageFLAGIMG : BufferedImageFLOIMG : List<BufferedImage>OBSIMG : List<BufferedImage>serialVersionUID : longSTIMG : BufferedImageTRIIMG : List<BufferedImage>TURIMG : List<BufferedImage>allBg : List<BackGround>bg : BackGroundfirst : booleanimagePath : StringisPlaying : booleanmario : Mariomessage : 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<Enemy>)getBf()getType()getX()getY()initOb()run()setBf(BufferedImage)setImg()setType(int)setX(int)setY(int)