Java课程设计报告-超级马里奥游戏的设计与开发_第1页
Java课程设计报告-超级马里奥游戏的设计与开发_第2页
Java课程设计报告-超级马里奥游戏的设计与开发_第3页
Java课程设计报告-超级马里奥游戏的设计与开发_第4页
Java课程设计报告-超级马里奥游戏的设计与开发_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java课程设计报告PAGE19-超级马里奥游戏的设计与开发

目录TOC\t"大标题2,2,大,1,三级,3"1.课程设计要求 -1-1.1课设题目 -1-1.2课设目的 -1-1.3开发环境 -1-1.4课设内容 -1-1.4.1游戏介绍 -1-1.4.2开发流程 -3-2.设计过程 -4-2.1总体设计 -4-2.1.1所用类的设计 -4-2.1.2功能设计 -4-2.2详细设计 -4-2.2.1窗体的设计 -5-2.2.2游戏场景的开发 -5-2.2.3障碍物的开发 -5-2.2.4将障碍物添加到场景中去 -6-2.2.5马里奥的开发 -6-2.2.6将马里奥对象加入到窗体中 -7-2.2.7将马里奥与障碍物进行设置 -7-2.2.8敌人的开发 -8-2.2.9敌人放到场景中 -8-2.2.10其他游戏相关 -9-3.具体实现 -9-3.1窗体类 -9-3.2马里奥类 -10-3.3场景类 -13-3.4障碍物类 -14-3.5敌人类 -14-4.调试过程 -16-4.1系统测试 -16-4.2出现的问题和解决的方法 -18-5.小结 -18-6.参考资料 -19-

1.课程设计要求1.1课设题目超级马里奥游戏的设计与开发1.2课设目的《Java程序设计》课程是网络工程专业的一门专业必修课程,特针课程进行为期两周的实践教学,旨在提升本专业学生对此课程中的理论知识的综合应用能力、提高学生的逻辑思维能力、软件开发能力。本次课程设计要求学生用Java技术在Windows平台下开发超级马里奥游戏。通过马里奥程序能够切实提高学生的程序设计水平,从实践中认识使用面向对象程序设计的开发思想。1.3开发环境WindowsXP+Eclipse3.41.4课设内容1.4.1游戏介绍在很多年以前,红白机FC的超级马里奥兄弟是当时的游戏中的颠峰之作,套用当时最流行的一句话就是操作感和平衡性几乎完美无暇。这里即将要完成的马里奥游戏可以参考这款游戏的设定,对游戏的背景、人物、敌人等重新绘制。游戏参考效果如图1-1所示。图1-1完整马里奥图(1)游戏操作游戏通过键盘操作,键盘上的箭头“”和“”分别控制Mario的移动,空格键控制Mario的跳跃,通过以上的简洁的操作完成整个游戏。(2)游戏设定开始游戏时,Mario会有3条生命,消灭敌人或顶一些物品可以得到分数,每到500分会增加一条生命,如果Mario被敌人杀死或是掉下悬崖,会失去一条生命,并从该版面重新开始游戏,如果Mario的生命数为0,则游戏结束,返回标题画面重新开始游戏。(3)游戏中的物品砖块:被Mario顶到会消失,Mario可以获得10分的分数,其中有些砖块在Mario从上边经过的时候会消失,如图1-2所示。图1-2砖块水管:在水管中一般会有食人花,如果Mario被花碰到会损失生命,如图1-3所示。图1-3水管问号:

被Mario顶到会变成无法破坏的铁块,同时Mario可以获得50分的分数,如图1-4所示。图1-4问号铁块:一般是从问号变化过来的,不会被Mario破坏,如图1-5所示。图1-5铁块透明问号:在游戏中,某些地方会有隐藏的问号,顶到会变成无法破坏的铁块,同时Mario可以获得50分的分数。

(4)游戏中的敌人三角(蘑菇):会缓慢的左右移动,可以被Mario踩死,每消灭一个Mario可以获得50分的分数,如图1-6所示。图4-6三角蘑菇乌龟:比三角的移动速度稍快,可以被Mario踩死,每消灭一个Mario可以获得100分的分数,如图1-7所示。图1-7乌龟食人花:在水管中出现,无法被Mario消灭,如图1-8所示。图1-8食人花1.4.2开发流程(1)首先由java代码编写人员设计并提出编写方案,依据具体设计向图片美工提出所需要的图片格式、类型、数量、大小等要求。(2)美工依照提出的设计绘制并编辑图片,同时程序员进行各个类的功能设计,搭建工程总体框架。(3)美工将图片完成后,程序员通过IO操作将图片导入程序完成游戏界面。(4)程序员分别完成Mario的控制,敌人、Mario和物品的显示。(5)程序员完成Mario与敌人及物品的碰撞的判断。(6)美工提供游戏的背景音乐,程序员将音乐导入到程序中。(7)对完成的游戏进行测试并修改bug。(8)对游戏进行优化,提高性能。2.设计过程2.1总体设计2.1.1所用类的设计使用Java的面向对象的设计思路来完成游戏程序需要用到的对象分别是Mario对象,敌人对象,障碍物对象,场景对象,窗体对象,图片及背景音乐,类的设计如图2-1所示。图2-1主要的设计类2.1.2功能设计马里奥游戏主要包括:马里奥移动、马里奥与敌人和障碍物碰撞、通关进入下一关等功能,功能模块如图2-2所示。马里奥游戏马里奥游戏过关进入下一关移动马里奥按空格键开始游戏选择攻击方式攻击过关进入下一关移动马里奥按空格键开始游戏选择攻击方式攻击退出游戏游戏退出游戏游戏失败重新开始图2-2主要功能模块2.2详细设计2.2.1窗体的设计窗体是马里奥游戏的主要界面,其设计主要包括界面的大小,位置的选择,标题,布局等界面属性方面的内容。其中窗体设计中有一个重要的静态属性的设计,即把游戏中的图片进行静态的初始化,其设计类为MyFrame。将游戏中所用到的图片通过IO流保存到类StaticValue中的集合里。初始窗体如图2-3所示。图2-3初始窗体2.2.2游戏场景的开发场景中的敌人被消灭的时候,从场景中消失。当马里奥死亡,游戏重新开始的时候,消失的敌人又重新出现。这时就通过一个集合对象来保存,所以在每个场景都应该定义两个集合对象,来保存已经被消灭的敌人和障碍物。当再重新初始化时,把这些消灭的敌人和障碍物再加回场景中保存的对象中。本次场景通过建立一个BackGround类来完成。场景中需要加入前两步定义好的属性。2.2.3障碍物的开发障碍物包括问号,砖块,水管,是游戏中的马里奥游戏中重要的组成部分。障碍物包含的属性:(1)障碍物在场景中的坐标(x,y)(2)显示的图片(3)类型(4)初始类型关于障碍物的行为方法:(1)重置障碍物的方法(2)当障碍物遇到马里奥时,改变相应的图片(3)初始化障碍物信息的构造方法2.2.4将障碍物添加到场景中去障碍物类(Obstruction)中拥有障碍物的属性,所以可以通过集合来保存各个障碍物在场景中的位置和状态。当然,场景类应该判断当前的场景是属于第一个场景还是其他场景,不同的场景要初始化不同的障碍物位置。框架类(MyFrame)主要用于图像的显示,将场景中的一切障碍物绘制到界面上去。其中,背景图片从坐标(0,0)开始绘制到整个屏幕中,而其他障碍物通过取得背景中的坐标(x,y)来获得绘制的位置。如图2-4所示。图2-4添加障碍物2.2.5马里奥的开发马里奥的开发与障碍物的开发类似,也是创建一个Mario类作为操作马里奥的对象,而且马里奥的图片也有相应的属性和方法。马里奥的属性:(1)坐标(x,y)(2)显示的图片(3)使用一个String类型的变量来描述mario当前的状态关于马里奥的行为方法:(1)移动(向左、向右)(2)停止(向左、向右)(3)跳跃马里奥跳跃的状态的处理:马里奥跳跃的时候分为两种情况,一种是点击跳跃键在空中,一种是离开障碍物掉落到空中。在跳跃的时候可以进行向左、向右的控制,但当已经在空中的时候却不能再进行控制跳跃的问题了,并且在跳跃的过程中还有相关的马里奥图片的切换。2.2.6将马里奥对象加入到窗体中和障碍物添加类似,将马里奥绘制到窗体中,但是马里奥是动态的,因此需要添加两个线程。添加线程一:因为马里奥移动的时候可能是一直进行的,Mario类必须实现一个线程用来控制马里奥,一直改变马里奥的坐标,此时需要引入Runnable接口。添加线程二:马里奥的状态一直在改变,因此需要同步的刷新,即同步的改变马里奥在窗体中的图片,为窗体类加入线程。如图2-5所示。图2-5添加马里奥2.2.7将马里奥与障碍物进行设置(1)横向阻挡:障碍物与马里奥之间的冲突和联系主要是使用坐标来进行设置的,使马里奥处于哪个区域可以活动,处于哪个区域不可以活动,即当遇到障碍物和在边界时移动都会受到限制。(2)纵向阻挡:在地面或障碍物上可以跳跃,否则不能跳跃,即在纵向方向上马里奥也有一个活动范围。(3)障碍物响应状态的改变:当马里奥碰到障碍物的时候,障碍物会响应并改变当前状态,例如,当从下往上撞到问号时,问号就会变为铁块,而撞到砖块的时候,砖块会消失,如图2-6所示。图2-6障碍物响应后的状态2.2.8敌人的开发马里奥游戏中有各种不同的敌人,并且各种敌人的移动方式和移动范围都有不同,因此在定义敌人类的时候也需要一定的属性和方法,建立一个Enemy类。敌人的属性:(1)坐标(x,y)(2)初始坐标(3)显示的图片(4)移动方向:不同的敌人有不同的移动方向。(5)最大移动坐标:敌人的移动范围关于敌人的行为:(1)重置方法(2)死亡(3)线程:同马里奥一样,也需要实现一个单独的线程来实现敌人的行为。但是与马里奥不同的是敌人是在固定的位置进行移动的,不需要添加上下左右的行为,而是自动的进行移动。2.2.9敌人放到场景中将敌人添加到对应的场景类(BackGround)中的敌人集合里,同时在窗体类(MyFrame)中通过敌人类不同的坐标绘制图像。与马里奥一样,敌人也有自己的移动状态,因此需要根据敌人的行为进行图片的切换。并在MyFrame中进行不断的刷新,与敌人的移动速度一致。如图2-7所示。图2-7马里奥与敌人2.2.10其他游戏相关分数的属性是放在Mario类中的,因此通过马里奥杀的敌人数和顶的问号或者砖块数进行分数的增加或者不变,跟着马里奥主角的变化而变化。而当马里奥死亡之后,分数需要重置。马里奥的生命次数只有三次,因此可以通过马里奥的属性进行记录。当马里奥死亡一次后,敌人和砖块都需要重置,分数也需要重置。3.具体实现3.1窗体类(1)窗体属性的代码如下:publicMyFrame(){ this.setTitle("MyMario"); this.setSize(900,600); //得到屏幕大小,设置开始出现位置 intwidth=Toolkit.getDefaultToolkit().getScreenSize().width; intheight=Toolkit.getDefaultToolkit().getScreenSize().height; this.setLocation((width-900)/2,(height-600)/2); StaticValue.init();//初始化图片 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭后结束 t.start(); this.setVisible(true); //不可改变屏幕大小 this.setResizable(false); //创建全部场景 for(inti=1;i<=3;i++){ this.allBG.add(newBackGround(i,i==3?true:false)); } //将1个场景设置为当前场景 this.nowBG=this.allBG.get(0); this.mario=newMario(0,480); this.mario.setBg(nowBG); this.repaint(); this.addKeyListener(this);}(2)在窗体类中获得键位编码的代码如下:this.addKeyListener(this); publicvoidkeyPressed(KeyEventarg0){ System.out.println(arg0.getKeyCode());//取得所用键的具体编码 }获得键位码的结果如下:空格:32左箭头:37右箭头:393.2马里奥类马里奥是一个动态的角色,因此在他移动或者停止的时候,都应该有不同的状态,即有不同的图片与之对应,并且区分是向左还是向右。马里奥与图片一样也有相应的一些属性和方法。(1)Mario属性代码如下:publicclassMarioimplementsRunnable{ privateintx; privateinty; privateThreadt=null;//加入线程 privateintxmove=0; privateStringstatus; privateBufferedImageshowIamge; privateintscore; privateintlife; publicMario(intx,inty){//构造方法 this.x=x; this.y=y; this.showIamge=StaticValue.allMarioImage.get(0); //初始化Mario this.life=3; this.score=0; t=newThread(this); t.start(); this.status="right-standing";//当前状态的保存形式 }(2)在窗体中实现Mario的移动及跳跃的功能,代码如下所示:publicvoidleftMove(){ xmove=-5; if(this.status.indexOf("jumping")!=-1){ this.status="left--jumping"; }else{ this.status="left--moving"; } } publicvoidrightMove(){ xmove=5; if(this.status.indexOf("jumping")!=-1){ this.status="right--jumping"; }else{ this.status="right--moving"; } } publicvoidleftStop(){ xmove=0; if(this.status.indexOf("jumping")!=-1){ this.status="left--jumping"; }else{ this.status="left--standing"; } } publicvoidrightStop(){ xmove=0; if(this.status.indexOf("jumping")!=-1){ this.status="right--jumping"; }else{ this.status="right--standing"; } } publicvoidjump(){ if(this.status.indexOf("jumping")==-1){ if(this.status.indexOf("left")!=-1){ this.status="left--jumping"; }else{ this.status="right--jumping"; } ymove=-5; upTime=38; } } publicbooleanisDead(){ returnisDead; } publicvoiddead(){ this.life--; if(this.life==0){ this.isDead=true; }else{ this.bg.reset(); this.x=0; this.y=480; }(3)完成Mario与障碍物的坐标判断在Mario类中定义一个场景对象,来保存当前Mario所在场景,在MyFrame类中将场景放入mario对象的属性中,代码如下所示:privateBackGroundbg; this.mario.setBg(nowBG);publicvoidrun(){ while(true){//判断当前Mario是否与障碍物碰撞 booleancanLeft=true; booleancanRight=true; for(inti=0;i<this.bg.getAllObstruction().size();i++){ Obstructionob=this.bg.getAllObstruction().get(i); //不允许继续向右移动 if(ob.getX()==this.x+60&&(ob.getY()+60>this.y&&ob.getY()-60<this.y)){ canRight=false; } //不允许继续向左移动 if(ob.getY()==this.x-60&&(ob.getY()+60>this.y&&ob.getY()-60<this.y)){ canLeft=false; } } if(canLeft&&xmove<0||(canRight&&xmove>0)){ x+=xmove; }3.3场景类场景是马里奥游戏中最难控制的一块内容,因为马里奥游戏里面有多个通关,而且每一次通过,里面的敌人障碍物等的位置都是不一样的。游戏设计越复杂,场景的控制就越难。场景属性的代码如下:publicclassBackGround{ privateBufferedImagebgImage=null;//当前场景的显示图片 privateintsort;//场景的顺序 privatebooleanflag; //当前是否为最后一个场景 //通过集合来保存 ListallEnemy=newArrayList();//全部的敌人 ListallObstruction=newArrayList();//全部障碍物 ListremovedEnery=newArrayList();//被消灭的敌人 ListremovedObstruction=newArrayList();//被消灭的障碍物}3.4障碍物类障碍物类(Obstruction)中拥有障碍物的属性,而场景(BackGround)中的障碍物和敌人使用两个集合来进行保存。因此可以通过集合来保存各个障碍物在场景中的位置和状态。障碍物属性的代码如下:publicclassObstructionimplementsRunnable{ privateintx;//坐标 privateinty; privateinttype;//类型 privateintstartType;//初始类型 privateBufferedImageshowImage=null;//显示图片 //构造方法publicObstruction(intx,inty,inttype){ this.x=x; this.y=y; this.type=type; setImage(); }publicvoidreset(){//重置方法 this.type=startType;//将类型改为原始类型 this.setImage();//重新显示图片 } publicvoidsetImage(){ showImage=StaticValue.allObstructionImage.get(type); }3.5敌人类敌人与马里奥的判断跟障碍物与马里奥判断类似。而不同的是敌人是一直移动的。因此通过Mario类中的场景对象,可以对敌人的状态进行控制,判断敌人当前的与马里奥的相对情况,而做出不同的结果判断。敌人属性的代码如下:publicclassEnemyimplementsRunnable{ privateintx; privateinty; privateintstartX; privateintstartY; privateinttype; privateBufferedImageshowImage; privateBackGroundbg; privatebooleanisLeftOrUP=true;//移动方向 privateintupMax;//移动范围 privateintdownMax; privateThreadt=newThread(this); privateintimageType=0;//图片状态 publicvoidsetBg(BackGroundbg){ this.bg=bg; } //普通敌人 publicEnemy(intx,inty,booleanisLeft,inttype,BackGroundbg){ this.x=x; this.y=y; this.startX=x; this.startY=y; this.isLeftOrUP=isLeft; this.type=type; this.bg=bg; if(type==1){ this.showImage=StaticValue.allTriangleImage.get(0); } t.start(); } publicEnemy(intx,inty,booleanisUp,inttype,intupMax,intdownMax,BackGroundbg){ this.x=x; this.y=y; this.startX=x; this.startY=y; this.isLeftOrUP=isUp; this.type=type; this.upMax=upMax; this.downMax=downMax; this.bg=bg; if(type==2){ this.showImage=StaticValue.allFlowerImage.get(0); } t.start(); }4.调试过程4.1系统测试开始窗体按空格键进入马里奥游戏,总共有三个场景,每个场景中有不同的障碍物和敌人,如果马里奥

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论