面向对象文档
班级:01110301
学号:20030008
姓名:孙永生
源码正确编译的条件,软件运行的环境要求:
java:jdk1.5,eclipse3.0开发,开发环境:windows xp。运行需要java:jre1.5支持。
数据结构
People类的主要数据结构。
Image bigImage,bigImage1,bigImage2,bigImage3,bigImage4;
//存放四幅可以替换的人物的素材图片
int girlInMapX=1,girlInMapY=1;
//人物在地图格子上的定位
int girlEnterx=0,girlEntery=0;
//人物在大背景上的初始定位
int girlsX=0,girlsY=0,picX=0,beginPic=9,nowPic;
//人物在大背景上移动时的贴图定位
int girlsXa=20,girlsYa=0;
//辅助定位指令(看得不顺眼时对位置的调整)
MapFunc类的主要数据结构。
int enterx=200,entery=0;//地图开始的横纵坐标
int gridX=5,gridY=5;//地图格子数
int[][] maze=new int[30][30];//地图数组
int enter=300,width=20;//对2.5D斜角地图的定位
Image wall1,wall2;// 2.5dD墙的壁纸
Image wall12,wall22;//2D墙的壁纸
Graphics gw1,gw2;//2d墙画面
int w=106,h=85;//墙的大小
double wa=0.53,ha=0.175,wb=-0.49,hb=0.24;//构建单个地图坐标的加权值(辛辛苦苦的试出来的,得到教训,数学不好就是不行)
AppletMain类的主要数据结构。
MediaTracker MT;//监测图片的下载
boolean initbool=false,complete=false,mouseclick;//状态参量
MapFunc map1;//地图对象
People people1;//人物对象
Image bufferI;//利用双缓冲是的缓存图片
Graphics buffer;//对上面的缓存的操作
算法分析这个程序中主要运用到的算法就是地图的动态生成算法。
一个地图的结构,利用上墙和右墙就可以表述。也就是说,地图的就是下图的集合。
一个的:

多个的:

这样的图,只需加画左,下两边,在加开出口,在加算法就可以成为2维地图铺垫完成,言归正传。
存储地图用的是int[30][30]的数组,用第四位来表示边界(java中我没看到2进制怎么用……是1000B),用第三位表示已经设置过(0100B),用第二位表示当前位置右边的墙存在(0010B),用第二位表示当前位置上边的墙存在(0001B)。
主要思想:当我站在上图中的任意点,我都有四种方向可选,当我选定要进入的新格子,就拆除旧格子与新格子之间的墙。此算法开始于左上角点,终止于右下角点。
以图说明:

UML描述系统:UseCase描述系统功能对各用例的描述:
1.控制人物行动取得地图冲突信息
if 左键 then
人物向左移动
elseif 右键 then
人物向右移动
elseif 上键 then
人物向上移动
elseif 下键 then
人物向下移动
endif
重绘窗口内所有元素。
2.控制applet流程:
if 人点击鼠标 then
开始游戏
endif
if 到达结尾或有换人请求 then
电脑决策者控制
endif
3.对地图作用
if 用户行动 then
地图进行碰撞检测分析
反馈
endif
重绘界面上所有元素。

类图和包图

此处画出的都是人为创建的类,继承系统的类没有画出来。
AppletMain继承Japplet
序列图,交互图和活动图计划是设计一个可以点击鼠标创建不同的地图,键盘控制走地图的游戏。
序列图:对用户已开始单击鼠标引发的初始化部分进行分析。
用户,单击鼠标,作用于AppletMain,AppletMain初始化时,调用People和MapFunc初始化。

活动图:

技术要点地图算法之前介绍了,这里不再赘言
双缓冲当功能基本齐全之后,目标就变成了让运行效率增高以及让图片在刷新时不会出现闪动情况。所以应用了双缓冲。
造成闪烁的原因是,当绘制部件时,update函数内部执行的是先清空当前区域,在进行paint。在要重绘的图很多的时候,就会出现闪烁。多次重绘是没有意义的。
我改动了绘图的方法,其主要机制是new一个新的image对象,把对于绘图的改动都画在这个对象上,全部画完后,再贴到界面上去。这样就不会出现在界面上反复贴图的情况,因为每回合只贴了一次。如果此时重载类的update方法,使它只进行重绘,是十分合适的,但是我没有贸然行事,因为可能以后还要用到与之相关的东西。
2.5D贴图贴图面临的最大难关就是角度问题,创建图形时候不觉得什么,但是往上贴的时候就困难了。不得以这两个墙壁图每个用了两个辅助变量,用以调整图形的角度和位置。说不出什么算法,但却是很浪费时间。几个辅助变量花了很久才对好。
人物与地图的镶嵌人物与地图的镶嵌只重在一点,就是画上人物之后,人物会压到本身应该在上层的东西,就是说,应该覆盖人物的反而被人物覆盖了。
一开始我打算画好地图,再贴上人,再补贴被盖掉的地图。但是经过实践,发现这样不行。我的立体图片连接非常紧密,重贴一张就要重贴一排,十分得不偿失感觉。
于是,决定把人物对象在绘地图的时候传给地图对象。成功是成功了,却带来了新的烦恼。感觉上类的独立性受到了很大的损害。
貌似现在就是这样:

碰撞检测:让地图重绘的时候对人物位置作检查。
换人:
游戏中支持四个人可以换。按F3可以换人。(注明:素材是私自提取的游戏素材,不能用于商业目的)
romauge:南国的舞女。

dagllas:圣骑士

flea:酒店老板的女儿

ruven:冒险者

人物动作:(这个在正式版中没有加上,但是可行性尝试的时候实现了流畅的人物走动)。具体技术如下图:

读的时候要把一整幅图读进来。在进行左上方运动的时候,要先画第一张小图,等待125毫秒,第二张,等待,第一张,等待,第三张。周而复始,就实现了流畅动作。
开发过程外加心得这次开发,重点就在可行性分析上。因为这几乎是我第一次用java开发,基本上类库,方法都不熟悉。为什么要用java开发呢?因为我认为这样能够更深的了解面向对象的思想。开发过程中一直没有离开《java编程思想》这本书,遇到困难就去查。但是还有很多知识是在网上找到的。可能从20几号开始,我从java的helloworld开始学习,一路走得十分坎坷,就像是踩着一个个困难过来的。语法倒不是很成问题,主要是以前没有接触过的结构(applet),没有写过的内容(图片动画和游戏控制)让人感觉很困难,最困难的就是昨晚打包jar,查了很多资料,还是不行。不过反正是applet,用ie打开倒也不是很麻烦,劳烦您了。
我的可行性准备:第一步是贴图,很顺利。
第二步,试图让图片动起来,并使用了多线程,成功
第三步,写平面的迷宫,改进了书上提示的算法
第四步,写鼠标响应的程序
第五步,写键盘响应的程序,成功
第六步,滚屏,失败,而且遇到了无法刷新界面的困难,(这个问题出在我对java的按钮响应的作用范围,以及容器panel的使用在头脑中十分模糊),导致设计更改,取消了按钮和panel。于是之前想得很好的界面也实现不了了。
第七步,写立体的迷宫,主要是贴图,费老劲了。最终成功。
第八步:把人物和地图放到一个程序里。但是runnable作用下,运行失败。时间紧迫(已经29号了),忍痛舍弃了平滑的行走的能力。并且为了调节人与地图的相对移动,又加入了辅助变量。
第九步:地图对人物的选择覆盖贴图。(总是定位不准,可能因为我设了太多不必要的变量,结果导致混乱)
第十步:地图的碰撞检测。
第十一步:对程序作少许的优化,设置双缓冲。
第十二步:项目正式开始(30号上午),开始写文档,开始构建程序,时间紧迫,导致一夜没睡,醒的时候都在写程序。
运行实例:
单击鼠标开始:

键盘操作:

换人:

成功走出: