目录1.导言 (2)1.1编写目的 (2)1.2项目范围 (2)1.3参考资料 (2)1.4缩写说明 (2)1.5术语定义 (2)2.功能需求 (3)2.1界面设计技术 (3)2.2游戏功能划分 (3)2.3功能划分的架构图 (3)2.4具体的功能模块 (4)2.5功能描述 (4)2.6程序的总体架构 (4)2.7程序的三层结构图 (4)3.面向对象设计 (5)3.1主要类图 (5)3.2各个模块的方法或类名类表示 (6)3.3地图绘制中的坐标说明 (6)4.程序的详细设计 (7)4.1主要人物玛丽的实现 (7)4.2核心类 (7)1.导言1.1编写目的该文档的目的是说明超级玛丽游戏的功能和设计方向、目标等描述游戏项目的整体框架的实现。
其主要内容包括:游戏项目的功能简介,接口设计,模块设计,界面设计。
本文档预期读者包括:项目管理人员,编程人员,数据库设计人员,美工,测试人员。
1.2项目范围该文档定义了游戏的模块,结构单元,但未确定单元的实现方法,这部分内容将在具体的代码设计中实现。
1.3参考资料《java语言程序设计》清华大学出版社郎波编著1.4缩写说明UML:Unified Modeling Language(统一建模语言)的缩写,是一个标准的建模语言。
1.5术语定义MIDP 2.0 定义:MIDP 2.0 也叫MIDP_NG,它的编号是JSR 118。
MIDP2.0 与1.0相比有很大提高,增加的特性包括:提供域安全模型,以允许对应用程序进行签名和论证;提供TCP、UDP网络接口;内置OTA;更好的用户界面;基本的声音API。
2.功能需求2.1界面设计技术1)选取和谐Q版的图片,使画面色彩和谐自然,配合动听的音乐渲染游戏气氛2)采用对话框方式,多功能窗口运行,固定窗口大小便于程序编写,键盘操作游戏角色。
3)使用低级用户界面,响应低级用户事件,不使用MIDP2.0GameAPI4)地图数据采用char类型,对每一个地图块的大小为16×16像素,采用单层地图,以提高游戏的运行速度5)居于多线程,实现进度条2.2游戏功能划分游戏的基本功能应该包括菜单处理,程序逻辑处理,持久性处理和挂起恢复处理。
◆关于菜单的处理,包括可以选择的进入游戏、保存、帮助和音效开关等。
◆程序的逻辑处理就是涵盖了程序中除菜单外几乎所有的功能。
◆持久性处理就是资源的载入和游戏的进度保存。
2.3功能划分的架构图2.4具体的功能模块1)游戏控制模块2)查询记录模块3)关卡选择模块4)游戏设置模块2.5功能描述玩家打开程序,在游戏菜单页面有四个选项。
◆关卡选择:选择已玩过的关卡进行游戏;◆开始游戏:从游戏的第一关进行游戏,玩家通过按键控制主人公马里奥进行不同的操作;◆查询记录:查询五个最高游戏分数,排名由上往下递减。
◆游戏设置(包括音乐设置和按键设置):玩家可以设置游戏进行时的音乐开或关以及修改相应的控制键。
2.6程序的总体架构本程序采用3层程序架构,业务表现层,业务逻辑层和数据持久层。
◆业务表现层。
主要是游戏界面的绘制,通过指定的接口绘制,与游戏的逻辑分离。
◆业务逻辑层。
主要是游戏的人物和敌人的动作,碰撞的判断,这个与表现层无关,需要表示层调用定义好的接口与逻辑层的通信◆数据持久层。
保存游戏中的数据,载入游戏中需要的资源,与程序逻辑层无关,用XML文档存储数据2.7程序的三层结构图3.面向对象设计3.1主要类图3.2各个模块的方法或类名类表示3.3地图绘制中的坐标说明4.程序的详细设计部分源代码如下:4.1主要人物玛丽的实现package org.liky.mario;import java.awt.image.BufferedImage;public class Mario implements Runnable {//坐标private int x;private int y;//定义一个场景对象来保存mario当前所处的场景对象private BackGround bg;//加入线程private Thread t=null;//移动速度private int xmove=0;private int ymove=0;//状态private String status;//显示的图片private BufferedImage showImage;//生命数和分数private int life;private int score;//当前移动中显示的图片数private int moving=0;private int upTime=0;//标记mario是否死亡private boolean isDead=false;//标记玩家是否完成了全部的游戏private boolean isClear=false;public Mario(int x,int y){this.x=x;this.y=y;//初始化Mario图片this.showImage=StaticValue.allMarioImage.get(0);this.score=0;this.life=3;t=new Thread(this);this.status="right--standing";t.start();}public void leftMove(){//改变速度this.xmove=-30;//改变状态//如果当前已经是跳跃状态,应该保留原有状态,不应该改变状态if(this.status.indexOf("jumping")!=-1){this.status="left--jumping";}else{this.status="left--moving";}}public void rightMove(){this.xmove=30;//如果当前已经是跳跃状态,应该保留原有状态,不应该改变状态if(this.status.indexOf("jumping")!=-1){this.status="right--jumping";}else{this.status="right--moving";}}public void leftStop(){this.xmove=0;//如果当前已经是跳跃状态,应该保留原有状态,不应该改变状态if(this.status.indexOf("jumping")!=-1){this.status="left--jumping";}else{this.status="left--standing";}}public void rightStop(){this.xmove=0;//如果当前已经是跳跃状态,应该保留原有状态,不应该改变状态if(this.status.indexOf("jumping")!=-1){this.status="right--jumping";}else{this.status="right--standing";}}public void jump(){if(this.status.indexOf("jumping")==-1){if(this.status.indexOf("left")!=-1){this.status="left--jumping";}else{this.status="right--jumping";}ymove=-30;upTime=6;}}public void down(){if(this.status.indexOf("left")!=-1){this.status="left--jumping";}else{this.status="right--jumping";}ymove=30;}//mario的死亡方法public void dead(){this.life--;if(this.life==0){this.showImage=StaticValue.mariodeadImage;this.isDead=true;}else{this.bg.reset();this.x=0;this.y=480;}}public int getX() {return x;}public int getY() {return y;}public void setX(int x) {this.x = x;}public void setY(int y) {this.y = y;}public BufferedImage getShowImage() {return showImage;}public void run() {// TODO Auto-generated method stubwhile(true){if(this.bg.isFlag()&&this.x>=508){//如果为最后一个场景,同时mario的坐标到达了508,则游戏结束//自动控制游戏结束的移动this.bg.setOver(true);if(this.bg.isDown()){//降旗后,mario开始向城门移动this.status="right--moving";if(this.x<568){//mario只向右移动this.x+=30;}else{if(this.y<480){//mario向下移动this.y+=30;}this.x+=30;if(this.x>762){//游戏结束,已经完成了全部的场景this.isClear=true;}}}else{if(this.y<420){this.y+=30;}if(this.y>=420){this.y=420;this.status="right--standing";}}}else{//判断当前mario是否与障碍物碰撞//定义标记boolean canLeft=true;boolean canRight=true;//定义一个mario当前是否处于障碍物上的标记boolean onLand=false;for(int i=0;i<this.bg.getAllObstruction().size();i++){Obstruction ob=this.bg.getAllObstruction().get(i);//如果mario和障碍物相切则不允许mario继续向右移动if((ob.getX()==this.x+60)&&(ob.getY()+50>this.y&&ob.getY()-50<this.y)){if(ob.getType()!=3){canRight=false;}}//不允许mario继续向左移动if((ob.getX()==this.x-60)&&(ob.getY()+50>this.y&&ob.getY()-50<this.y)){if(ob.getType()!=3){canLeft=false;}}//如果符合条件则表明mario当前处在障碍物上面if(ob.getY()==this.y+60&&(ob.getX()+60>this.x&&ob.getX()-60<this.x)){if(ob.getType()!=3){onLand=true;}}//判断当前mario在跳跃过程中是否顶到了障碍物if(upTime>0){if(ob.getY()==this.y-60&&(ob.getX()+50>this.x&&ob.getX()-50<this. x)){//对于砖块处理if(ob.getType()==0){//将该砖块从场景中移除this.bg.getAllObstruction().remove(ob);//将被移除的砖块保存到一个集合中this.bg.getRemovedObstruction().add(ob);//将分数加10this.score+=10;}//对于问号的处理和对于隐藏的砖块的处理if(ob.getType()==4||ob.getType()==3){ob.setType(2);ob.setImage();this.score+=50;}upTime=0;}}}//加入mario对敌人的判断for(int i=0;i<this.bg.getAllEnemy().size();i++){Enemy e=this.bg.getAllEnemy().get(i);if((e.getX()+50>this.x)&&(e.getX()-50<this.x)&&(e.getY()+60>this. y&&e.getY()-60<this.y)){//mario死亡this.dead();}if(e.getY()==this.y+60&&(e.getX()+50>this.x&&e.getX()-50<this.x)) {if(e.getType()==1||e.getType()==3){e.dead();this.upTime=2;this.ymove=-30;this.score+=50;}else if(e.getType()==2){this.dead();}}}if(onLand && upTime==0){if(this.status.indexOf("left")!=-1){if(xmove==0){this.status="left--standing";}else{this.status="left--moving";}}else{if(xmove==0){this.status="right--standing";}else{this.status="right--moving";}}}else{//表示当前为上升状态if(upTime!=0){upTime--;}else{this.down();}y+=ymove;}if(this.y>600){this.dead();}if(canLeft==true && xmove<0 || (canRight==true && xmove>0)){//改变坐标x+=xmove;if(x<0){x=0;}}}//定义一个图片取得的初始索引值int temp=0;//判断mario是否面向左if(this.status.indexOf("left")!=-1){temp+=5;}//判断mario是否移动if(this.status.indexOf("moving")!=-1){temp+=this.moving;moving++;}if(moving==4){moving=0;}if(this.status.indexOf("jumping")!=-1){temp+=4;}//改变显示图片this.showImage=StaticValue.allMarioImage.get(temp);try{Thread.sleep(100);}catch(InterruptedException e){e.printStackTrace();}if(this.score==500){this.life++;this.score=0;}}}public void setBg(BackGround bg) {this.bg = bg;}public boolean isDead() {return isDead;}public int getLife() {return life;}public void setLife(int life) {this.life = life;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public boolean isClear() {return isClear;}}。