![【基于Java的超级玛丽游戏设计与实现8600字(论文)】_第1页](http://file4.renrendoc.com/view2/M00/39/04/wKhkFmaajySAA5yUAAI49iVpCuY558.jpg)
![【基于Java的超级玛丽游戏设计与实现8600字(论文)】_第2页](http://file4.renrendoc.com/view2/M00/39/04/wKhkFmaajySAA5yUAAI49iVpCuY5582.jpg)
![【基于Java的超级玛丽游戏设计与实现8600字(论文)】_第3页](http://file4.renrendoc.com/view2/M00/39/04/wKhkFmaajySAA5yUAAI49iVpCuY5583.jpg)
![【基于Java的超级玛丽游戏设计与实现8600字(论文)】_第4页](http://file4.renrendoc.com/view2/M00/39/04/wKhkFmaajySAA5yUAAI49iVpCuY5584.jpg)
![【基于Java的超级玛丽游戏设计与实现8600字(论文)】_第5页](http://file4.renrendoc.com/view2/M00/39/04/wKhkFmaajySAA5yUAAI49iVpCuY5585.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
绪论1.1课题背景随着互联网在当今全球互联网产业中的快速发展,越来越多的用户和设备连接到网络,并且在网络上有着多种使用方式,游戏娱乐便是其中的一种,游戏作为缓解人们生活压力与节奏的一种崭新方式受到越来越多包括不同年龄层人们的欢迎。计算机技术为我们的娱乐创造了崭新的窗口。java最初的目的并不是用于开发游戏,在过去,运行环境,java类和浏览器等决定了java应用程序的类型,但随着时代和技术的发展,用JAVA开发游戏已经成为一种可能。1.2目的和意义随着经济社会的更新和计算机信息技术的不断提高,计算机进行科学日渐成熟。该项目开发的意义在于当今日益变化的社会形势中面对越来越多亚文化与新事物对传统娱乐行业的冲击。使用高级程序语言去编写游戏已经成为当代社会的刚需1.3java语言的特点1)平台无关性
用Java编写的程序不仅在国内也可以在其他国家使用并且分享。Java可以不受计算机网络硬件和操作管理系统的约束而在任意计算机技术环境下正常工作运行。Java语言可以在虚拟机上运行,利用虚拟机的原理实现各平台之间的接口。2.)安全性
如果从java的数据来看,它的安全性是非常高的,因为它是一个完整的数据结构,java的安全性毋庸置疑。编译时,检查Java语言和语义以与相应的值相对应,并编译和生成Java类。在运行时,必须在类加载器中加载Java类。当您在网络上使用Java类时,权限设置是为了确保被访问用户的安全性。2可行性分析可行性研究的目的是确定能否在最短时间内以最低成本解决问题。为了实现此目标,分析一些可能的主要解决方案的优缺点是十分必要的,并投资于原始系统的大小和目标以及系统完成后的收益。需要确定是否值得。开发该系统。因此,可行性研究基本上是一个显著压缩和简化了系统的分析和设计过程。这是系统分析和设计过程,以更高的层次和更抽象的方式执行。2.1技术可行性本游戏的对开发的环境配置开发要求极低,在WIN7以上的任意版本,一般的电脑配置即可满足,对电脑本身没有什么需求,当前时代使用的主流办公电脑或者学校电脑即可满足需求,java作为现在使用最多的开发工具,庞大并且完善的类库是java的一大优势,
eclipse最初是由IBM公司进行开发的替代传统商业管理软件VisualAgeforJava的下一代IDE开发软件,在目前得到了广泛的应用2.2操作可行性整个操作系统用java编程语言开发,拥有良好的人机交互界面,界面布局以及设计充满人性化,充分考虑玩家体验以及用户交互,以用户需求为着手点进行的开发使得操作简单明了。3系统分析所谓系统分析,系统分析旨在研究特定系统结构中各个部分(子系统)的交互作用,系统的外部接口和接口以及系统的整体行为,功能和局限性,以便为将来的更改及相关内容提供参考。系统的决策和依据。系统分析的常见目标之一是改善决策过程和系统性能,以实现整体最优系统。3.1用户需求分析随着社会不断变迁发展,电子游戏已经成为人们日常生活娱乐的一大重要形式,超级玛丽,想必很多人都玩过至少听闻过,受到各个年龄段人们的喜爱,随着生活节奏的越来越快,我们不能让过去的存在停留在过去,而应该让它用新的技术面貌在新时代复生,因此使用java开发语言去开发超级玛丽游戏是符合时代的3.2操作功能需求分析本系统主要是通过完成一个超级玛丽游戏的基本信息操作。系统需要满足以下要求:(1)在游戏初始界面按space键进入游戏。(2)利用键盘上下左右方向键来操作游戏人物的运动。(3)碰撞检测:A.游戏人物在移动中如果碰到砖块则进入停止状态,在移动到悬崖上方会判定摔下,生命减一。B.对于有些enemy,如果游戏人物跳到enemy的头顶上,则判定enemy从游戏界面消失(死亡),否则游戏人物生命减一。游戏人物向上跳跃触碰金币会增加point,当游戏人物的生命为0时判定游戏结束。3.3游戏界面设计需求分析1)选择高清真彩色Q版图片,使得游戏画面平易近人。3)使用900*600分辨率显示游戏初始界面,使用60*60像素的矩形表示游戏人物以及障碍物,使用多个60*60的矩形图片来表示巨大的障碍物和敌人2)游戏初始界面大小与初始显示位置为固定值
4系统设计本系统是使用java开发的游戏,首先游戏界面需要创建一个窗口类,在对游戏内容进行分析,游戏还需要敌人类,障碍物类,马里奥类等本游戏主要利用键盘上下左右方向键来操作游戏人物的运动,以及碰撞检测来进行游戏4.1系统流程设计结构图系统流程设计结构图中,游戏流程被分为多个更细化的子模块,其中一个是判断碰撞,在此子模块中主要实现判断是否碰撞场景物体;另一个是是否为砖块,在这个子模块中它主要实现判断障碍物类型,另一个是生命判断模块,这个子模块用来判断是否丢失生命。图4-1游戏流程功能图大概地描述了系统流程设计结构图的构成。
按住space键进入游戏按住space键进入游戏使用上下左右控制人物移动使用上下左右控制人物移动碰撞检测碰撞检测是否扣血是否为砖块是否扣血是否为砖块是否否是阻止移动阻止移动砖块消失消灭敌人继续游戏是否死亡阻止移动消灭敌人继续游戏是否死亡阻止移动继续游戏失去一条生命,重置游戏是否继续游戏失去一条生命,重置游戏GGameover图4-1游戏流程功能图4.2系统模块设计本游戏一共包括6个模块即:窗体类,初始化类,障碍物类,敌人类,背景类,马里奥类。4.2.1窗体类游戏的背景图片以及其他各类都在窗口类里得到体现,通过撰写KeyListener接口,可以获得输入设备的信息。创建该类的目的是为了使用集合来存放场景,以及一些在游戏中的事实场景NB,以及游戏中的标记字符。并且解决了游戏里屏幕会突然消失的问题,运用了随着计算机发展在JAVA中的doublecache技术。(1)首先我们创建一个类命名为Myframe,并且在该类中创建2个接口,一个为runnable接口另一个为keylisten接口。publicclassMyFrameextendsJFrameimplementsKeyListener,Runnable{ }(2)接着我们再定义一个集合名字取为list,List的作用是用于存放背景图片,因此在list里设置一个类叫background。接下来我们需要定义游戏人物类,取名mario类,就是我们的游戏人物。此外游戏里的背景是动态变化的,因此我们还需要设置一个类叫background用来保存当前场景,它默认应该是个空值。为了游戏的流畅,我们还应该注意游戏线程的问题,因此我们还要创建一个类取名为Thread。privateList<BackGround>allBG=newArrayList<BackGround>(); privateMariomario=null; privateBackGroundnowBG=null; privateThreadt=null; privatebooleanisStart=false; publicstaticvoidmain(String[]args){ newMyFrame();(3)在进行窗口类的编程中,窗体类首先应该完成它标题的制作,并且要根据屏幕设置其大小,并且窗口化运行的时候必须要考虑人的视觉感官,应当让窗口类处于屏幕的居中位置这样符合人的感官,在运行的时候更需有艺术感。其次,应对不同人的需求还要设置一个拉伸窗口,这样玩家可以随意拉伸到自己喜爱的大小,开发者通过具体分析,深思熟虑而写出的界面,应该设置界面不可被随意拉伸,如果设计可随意拉伸,则可能使游戏画面扁平不宜观看。(1)标题设置title标题为玛丽奥(2)窗口大小设置setsize为900,600为窗口大小并设置Toolkit.getdefaultTookkit().getScreenSize()方法获取显示器屏幕大小并使Myframe窗口居中显示设置setResizable方法使窗口大小不可改变(4)图片和闪屏问题解决之后,我们就应该开始游戏操作方面的设置了,我们使用keylistener接口去解决这个问题,我们操控马里奥使用的是上下左右四个方向键,38对应了pageup,37对应了左,右使用38来对应,并且我们之前系统流程中还提到了游戏开始需要space键因此需要设置打开界面后游戏不会直接运行需要按space键才能运行(1)游戏人物的移动控制 if(e.getKeyCode()==39){ this.mario.rightMove(); } if(e.getKeyCode()==37){ this.mario.leftMove(); } (2)游戏人物的跳跃控制 if(e.getKeyCode()==38){ this.mario.jump(); }还需要对马里奥的停止就行设置(1)控制玛丽奥的停止if(e.getKeyCode()==39){ this.mario.rightStop();; }if(e.getKeyCode()==37){ this.mario.leftStop();; }(5)在上面的工作结束后,我们需要对逻辑模块进行设计了,我们需要重写RUN方法,判定游戏人物死亡时应该用窗口来判定 或者游戏结束时也应该通过窗口宣布结束if(this.mario.isDead()){JOptionPane.showMessageDialog(this,"游戏结束");System.exit(0); }if(this.mario.isClear()){JOptionPane.showMessageDialog(this,"恭喜游戏通关!");System.exit(0); }4.2.2初始化类(1)游戏属于软件的一种,要发生硬盘和内存的读写,因此我们创建了一个初始化类用来缓存游戏需要的图片等文件,将敌人,游戏人物,背景等所有图片加入缓存中,这样可以使游戏顺畅,在游戏开始时就不会再卡顿了。我们首先要在类里定义一个集合用来存放游戏人物的图片,包括游戏人物的所有动作等,我们将它命名为BufferedImage,这样程序就可以调用人物移动图片从而形成一个动作效果。接着我们需要再类里存放敌人的图片,障碍物的图片,以及背景的图片,如上面描述的一样,通过遍历这些图片,敌人,背景等也可以形成一个动态的效果,注意的是他们的默认值都必须为null。定义BufferedImage变量startImage,endImage,bgImage为空值.在完成图片存放的设定后,我们要开始下一步初始化了。我们要创建一个init方法,它的作用就是将所有图片导入到之前我们设定的那些类里,我们可以使用多个循环语句去将图片放入。4.2.3背景类(1)背景类,故名思意就是用来存放背景的一类,它包括了游戏人物,敌人,将上述的元素融入背景之中,我们要在背景类里定义一个集合用来加载游戏中的障碍方块以及敌人,还要创建一个集合用来存放已经被游戏人物打败的敌人和通过的障碍图片。并且还定义了一个方法用来控制敌人行动,还设置了第六关一个隐藏砖块。 (1)当前场景图片定义被缓存图片bgimage为空值,存放当前场景图片 (2)场景顺序 定义int值sort用来表示场景顺序 (3)是否为最后的场景 定义布尔值flag用来判定场景 (4)游戏结束标记 定义布尔值isover判断游戏是否结束 (5)定义降旗结束 定义布尔值isDown判断降旗是否结束(2)为了顺利进行游戏,不使得游戏场景错乱,我们还要给背景设定编号,游戏背景需要按照编号进行变换,并且我还在游戏里设定了当玩家通关时,人物将自己走到城堡中。所以在这里用布尔变量设置了用来判断此时的场景是否和最后一个场景一致的代码,为了判定游戏人物死亡或者游戏已经通关,还要设置一个布尔变量用来判断。当玩家通关时,人物将自己走到城堡中,在这个过程中是不受到玩家操控的,同时会播放旗子的动画,在动画结束后,你才可以继续操控你的游戏人物,因此我们还需要定义一个bool变量用来判断人物的移动时机在游戏人物只是失去生命值而不是死亡时,应当让游戏变回一开始的初始界面,reset所有的人物,障碍物因此我们既要设置一个集合用来保存当前场景的物体,也要设定一个集合来保存已经经过的场景和打败的敌人。(1)用集合保存敌人定义一个动态数组集合Enemy保存敌人(2)用集合保存障碍物定义一个动态数组集合Obstruction保存敌人(3)被消灭的敌人定义一个动态数组集合removeEnemy保存被消灭的敌人(3)在进入游戏界面时,我们不能操控人物,并且敌人应该处于static状态,当我们按住space键开始之后才会使游戏开始,因此我们需要定义一个操控敌人行动的方法enemyStartMove()来实现我们的目的。publicvoidenemyStartMove(){for(inti=0;i<this.allEnemy.size();i++){this.allEnemy.get(i).startMove(); }(4)前面提到,应当让游戏变回一开始的初始界面,reset所有的人物,充值所有的一切,包括游戏人物,障碍物以及敌人。为了实现这个目的,那我们需要再创建一个方法名为resetOver()用来使所用的场景和人物重置,并且我们之前设置了一个方法用来存放已经经过的障碍和打败的敌人,我们就可以把这个方法调入原来的集合,就可以完成重置的目的 (1)重置方法,重置障碍物和敌人 publicvoidresetOver(){ (2)将移除的障碍物和敌人还原 this.allEnemy_1.addAll(this.removeEnemy); this.allObstruction_1.addAll(this.removeObstruction); (3)调用障碍物和敌人的重置方法 for(inti=0;i<this.allEnemy_1.size();i++){ this.allEnemy_1.get(i).reset(); } for(inti=0;i<this.allObstruction_1.size();i++){ this.allObstruction_1.get(i).reset(); } }4.2.4马里奥类(1)马里奥类,也就是我们用来控制游戏人物的类,需要完成一个逻辑检测判断人物到底是否和敌人或者障碍物完成了互动,该类中的属性主要定义了游戏人物当前所处场景,游戏人物动作的速度,以及游戏人物的动作图片。另外该类中还定义了人物的生命值和现在的的point。并且在run方法中还定义了人物将自己走到城堡中,在这个过程中是不受到玩家操控的,同时会播放旗子的动画,结束后游戏结束。进行游戏时,我们需要使用键盘操控人物的移动,跳跃等等,为了完成这些动作我们要定义两个int值来表示二维坐标,实现runnable接口,并且还要用方法描述动作。(1)坐标定义int值x表示X轴坐标定义int值y表示Y轴坐标(2)定义游戏人物的所在场景定义Background值bg为场景变量(3)线程定义线程t为空线程(2)在游戏进行的过程中为了用户的正常操作,我们要对游戏人物的动作速度进行设置,其实就是人物移动时对其二维坐标产生的函数作用,它的初始值也要设置初始为0,并且还要定义方法来实现游戏point的加减和人物的生命值。(1)移动速度定义int值xmove初始值为0表示X轴的移动速度(2)跳跃速度定义int值ymove初始值为0表示Y轴的移动速度(3)状态定义字符变量status表示人物状态(4)生命和分数定义int值score表示分数定义int值life表示生命值(3)在人物运动的过程中,假设人物按住上方向键跳跃到空中,我们还需要判断游戏人物现在是在什么状态下。 publicvoidjumpover(){ if(this.status.indexOf("jumping_1")==-1){ if(this.status.indexOf("left_1")!=-1){ this.status="left-jumpingover"; }else{ this.status="right-jumpingover"; } Ymove_over=-10; upTime_over=18; } }(4)接着我们需要对碰撞逻辑检测进行编写,也就是重写run方法,首先我们用当前背景的下标来判断是否处于最后,如果游戏人物符合此情况并且X轴大于520时,说明游戏人物已到最后关卡。这个时候人物将自己走到城堡中,在这个过程中是不受到玩家操控的,同时会播放旗子的动画,当人物X轴大于780的时候,即可判定游戏结束。 在游戏人物和障碍物完成交互的瞬间,要根据障碍物的类型给出瞬时的反馈,倘若障碍物的类型为砖块,那么显示障碍物消失,游戏人物回到之前的位置,倘若障碍物的类型为问号,那么显示障碍物消失,游戏人物回到之前的位置,并且人物的状态发生改变,并且将由于动作交互消失的障碍物放入之前专门定义的集合中去。倘若障碍物的类型为其他,那么显示障碍物不变,游戏人物回到之前的位置(5)在游戏里的敌人第一种为蘑菇怪,这种怪物会左右移动,当我们操控人物跳到蘑菇怪的头顶上时判定它死亡并且将它的图片放入我们之前设置的集合之中,等到reset时就可以重新使用,第二种敌人是食人花,这种敌人不会主动攻击游戏人物只有游戏人物主动碰到它时,直接算游戏人物死亡游戏人物在碰到蘑菇怪时没有跳起而是直接碰到时算死亡,食人花碰到就算死亡。 if(e.getY()==this.y+60&&(e.getX()+60>this.x&&e.getX()-60<this.x)){ if(e.getType()==1){ e.dead(); this.upTime=5; this.ymove=-10; 敌人死亡,增加分数 score+=10; }elseif(e.getType()==2){ this.dead(); } 4.2.5障碍物类(1)障碍物类里面包括了存放障碍物所需要的图片,并且将人物死亡,reset时所有的障碍物也会跟着重置,也就是说要给障碍物也设置一个reset方法。同时和人物一样障碍物也有其二维坐标下面是对障碍物二维坐标的定义以及用runnable接口实现旗子的运动,以及线程。当游戏人物触碰到障碍物时会发生交互动作根据障碍物的类型发生不同的交互,因此要给障碍物设置其类型,方便调用,可以用下标来表示,这样游戏充重置后,发生了互动的障碍物模块也会通过下标复原。(1)构造方法 publicObstruction(intx,inty,inttype,BackGroundbg){ this.x=x; this.y=y; this.type=type; this.starttype=type; this.bg=bg; setImage(); if(this.type==11){ t.start(); } } (2)重置方法 publicvoidreset(){ this.type=starttype; this.setImage(); }(2)然后我们还要设置一个run方法用来操控旗子,当旗子的坐标达到420时就判定结束之后就可以操控人物了 publicvoidrun(){ while(true){ if(this.bg.isOver()){ if(this.y<420){ this.y+=5; }else{ this.bg.setDown(true); } }4.2.6敌人类(1)游戏里设定的怪物蘑菇怪是可以通过操控人物跳跃到其上方将它击杀的,还有一种不能击杀的是食人花,在敌人类中详细设定了敌人的属性包括其移动,二位坐标图片等等以及当游戏重置之后的还原方法。在敌人类里我们要设置二维坐标还要设置其线程,还要写入方法控制蘑菇怪的移动(1)初始坐标定义int值startx表示初始X坐标定义int值starty表示初始Y坐标(2)当人物的生命值变为0时,初始化游戏,障碍物和敌人都会初始化,定义初始二位坐标便于复原。根据敌人类型不同,设定showimage方法来现实不同的图片,不同的怪物和游戏人物进行交互产生不同的结果,有的怪物可以被游戏人物消灭,有的则不可以(1)怪物类型 定义一个int值type为怪物类型(2)显示图片定义一个被缓存图像值showimage显示图片(3)食人花属于只能在一定范围内上下移动的怪物因此必须设定他的移动上限和移动下限。(1)移动上限与移动下限定义int值upMax与downMax为0表示食人花的移动上限与下限(4)在敌人类里,要对蘑菇怪写一种构造方法,对食人花写另一种构造方法,因为他们的属性各不相同,为了游戏开始之前怪物不能移动,还要设置线程来控制(1)蘑菇怪的构造方法publicEnemy(intx,inty,booleanisLeft,inttype,BackGroundbg){......this.t=newThread(this);t.start();t.suspend();}(5)在游戏人物死亡进行reset时,不仅要对障碍物,人物进行重置,怪物也不例外,通过重置方法将敌人的二维坐标,以及状态等等进行还原,同时怪物的图片必须和类型一致(1)还原坐标this.x=this.startx;this.y=this.starty;(2)还原图片if(this.type==1){this.showImage=StaticValue.allTriangleImage.get(0);}elseif(this.type==2){this.showImage=StaticValue.allFlowerImage.get(0);}}(6)最后,我们还需要定义一个方法,当人物完成对怪物的击杀时应该显示怪物死亡的图片,同时还需要将死亡的敌人加入我们之前设定的集合里(1)死亡图片this.showImage=StaticValue.allTriangleImage.get(2);this.bg.getAllEnemy().remove(this);this.bg.getRemoveEnemy().add(this);5系统运行5.1游戏开发所需要的图片下面的图片包括了人物以及障碍物等A.游戏人物向左移动的图片,如图5-1所示。
图5-1游戏人物向左移动的图片B.游戏人物向左跳跃的图片,如图5-2所示图5-2游戏人物向左跳跃的图片C.游戏人物向右移动的图片,如图5-3所示图5-3游戏人物向右移动的图片D.游戏人物向右跳跃的图片,如图5-4所示图5-4游戏人物向右跳跃的图片E.游戏人物死亡的图片,如图5-5所示图5-5游戏人物死亡的图片地面及普通障碍物图片,如图5-6所示图5-6地面及普通障碍物图片C.水管类图片,如图5-7所示图5-7水管类图片5.2.1游戏逻辑展示下面的图片是游戏进程的图片,(1)包括了人物移动,跳跃等动作,以及人物和砖块进行互动产生的结果,如图5-9(2)在初始界面需要按住space键才能正式开始,当游戏人物的生命值为0时游戏判断结束,如图5-10(3)如果马里奥顺利通过所有关卡,那么游戏同样结束,如图5-11图5-9人物移动,跳跃等动作图片图5-10初始界面图片图5-11通关图片6系统测试6.1系统测试目的本章系统测试着重讲述了游戏系统整体是否完整,各个模块是否正常运行,在美观上有没有缺陷以及是否还需要添加些东西来使这个游戏系统更加完善。这样就可以保证用户的使用满意度。在此,我们需要测试游戏来查看游戏系统是否出现bug,然后我们以系统出现的bug信息来调试我们的系统,让它得到进一步的完善。换句话说,就是系统结构设计完成了,不代表你所设计的系统没有一丁点问题。在设计系统的时候,我们常常会因为粗心大意造成游戏系统出现不起眼的小问题,然而当时系统并没有报错,这类细小问题就需要我们来测试,以保证游戏系统的可靠性。我们也需要确任游戏系统的质量,也需要在整个系统测试的过程中看到自己预期的结果,系统出现的不足,我们就可以及时改正它,而且还可以将系统出现的这些和那些的问题反馈给开发者或经理。系统测试不仅测试的游戏系统的本身,而且是测试我们的开发系统的过程,这可以让我们更加直观的认识游戏系统所存在的不足。我们主要测试的是游戏系统的的逻辑以及画面等等。6.2测试过程(1)制定测试计划。在制定测试计划时,我们必须统筹全局对各个因素都要考虑周全,不仅限于主观客观因素以及环境等等。测试计划的内容进行主要问题包括系统测试的内容,时间表,测试所需的环境和条件发展以及测试技术培训的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论