超级玛丽详细设计文档
超级玛丽详细设计文档
超级玛丽JA V A小游戏详细设计
目录
1.导言 ............................................................................................ 错误!未定义书签。
1.1编写目的 .................................................................... 错误!未定义书签。
1.2项目范围 .................................................................... 错误!未定义书签。
1.3参考资料 .................................................................... 错误!未定义书签。
1.4缩写说明 .................................................................... 错误!未定义书签。
1.5术语定义 .................................................................... 错误!未定义书签。
2.功能需求 .................................................................................... 错误!未定义书签。
2.1界面设计技术............................................................ 错误!未定义书签。
2.2游戏功能划分............................................................ 错误!未定义书签。
2.3功能划分的架构图.................................................... 错误!未定义书签。
2.4具体的功能模块........................................................ 错误!未定义书签。
2.5功能描述 .................................................................... 错误!未定义书签。
2.6程序的总体架构........................................................ 错误!未定义书签。
2.7程序的三层结构图 (6)
3.面向对象设计 (7)
3.1主要类图 (7)
3.2各个模块的方法或类名类表示 (8)
3.3地图绘制中的坐标说明 (8)
4.程序的详细设计 (9)
4.1主要人物玛丽的实现 (9)
4.2核心类 (9)
◆分离。
◆业务逻辑层。主要是游戏的人物和敌人的动作,碰撞的判断,这个与表现层
无关,需要表示层调用定义好的接口与逻辑层的通信
◆数据持久层。保存游戏中的数据,载入游戏中需要的资源,与程序逻辑层无
关,用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 stub
while(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 Obstruction ob=this.bg.getAllObstruction().get(i); //如果mario和障碍物相切则不允许mario继续向右移动 if((ob.getX()==this.x+60) &&(ob.getY()+50>this.y&&ob.getY()-50 if(ob.getType()!=3){ canRight=false; } } //不允许mario继续向左移动 if((ob.getX()==this.x-60) &&(ob.getY()+50>this.y&&ob.getY()-50 if(ob.getType()!=3){ canLeft=false; } } //如果符合条件则表明mario当前处在障碍物上面 if(ob.getY()==this.y+60 &&(ob.getX()+60>this.x&&ob.getX()-60 if(ob.getType()!=3){ onLand=true; } } //判断当前mario在跳跃过程中是否顶到了障碍物 if(upTime>0){ if(ob.getY()==this.y-60&&(ob.getX()+50>this.x&&ob.getX()-50 //对于砖块处理 if(ob.getType()==0){ //将该砖块从场景中移除 this.bg.getAllObstruction().remove(ob); //将被移除的砖块保存到一个集合中 this.bg.getRemovedObstruction().add(ob); //将分数加10 this.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 Enemy e=this.bg.getAllEnemy().get(i); if((e.getX()+50>this.x)&&(e.getX()-50 //mario死亡 this.dead(); } if(e.getY()==this.y+60&&(e.getX()+50>this.x&&e.getX()-50 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; } }