我的Java实验报告_第1页
我的Java实验报告_第2页
我的Java实验报告_第3页
我的Java实验报告_第4页
我的Java实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、我的java实验报告 刘方然 学号:200103100311本实验报告分为以下部分:1:项目目标:2:名词与概念:3:系统总体分析。3:类的功能划分及相互关系:4:技术重点攻关几主要算法分析:5:部分类的具体实现:6:拓展:1:项目目标:这次我要实现的是一个游戏界面的框架及简单的游戏操作。游戏界面大体上有一个观察窗,一张小地图(minimap),两个按钮与相邻帧的间隔时间组成。在大地图上有一些可控制的单位(unit)。完成的效果如下:单位 unit观察窗小地图minimap退出按钮作者信息按钮观察窗在小地图中的视野框单位在小地图中的微缩代表玩家可进行地图视野移动,视野选定,单位选定,选定单位移

2、动目的地,查寻作者信息,退出游戏等操作。2:名词与概念:1)游戏界面框架元素:观察窗:显示单位及其他框架元素的载体。 小地图:微缩显示地图。 退出按钮:点击退出。 作者信息按钮:点击显示作者信息。 单位:操作的对象,可移动。 单位在小地图中的微缩代表:指示单位在地图中的相对位置。观察窗在小地图中的视野框:指示观察窗在地图中的相对位置。2) 简单的游戏操作:选定单位:a.集体选定:单击鼠标左键,拖动鼠标产生一个选择框,释放鼠标,则在选择框内的单位就被集体选定。b.单个选定:单击某一单位,则该单位就被选中。当该位置有多个单位时,随机选定其中一单位。选定目的地:c.在观察窗中选定:在选定单位后,在观

3、察窗中单击鼠标右键于目的地,则目的地被选定。d.在小地图中选定:在选定单位后,在小地图中单击鼠标右键于目的地,则目的地被选定。3改变视野:a.移动视野:将鼠标移至观察窗边界,则视野会向相应方向移动,直至视野到达地图边界。b.直接选定视野:鼠标左键单击小地图,视野直接移至相应位置。4显示作者信息:鼠标左键单击作者信息按钮,则跳出作者信息。5退出游戏:鼠标左键单击退出按钮。3: 系统总体分析。1)组成要素:1单位:a.单位运动(movement)b.单位管理(management)c.单位控制(control)d.单位显示(show)2界面:a.界面显示管理b.界面鼠标响应管理c.按钮响应3视频:

4、a.分辨率调整b.全屏显示c.重绘管理(repaint management)2)要素关系:由于关系复杂,用下图表示: 界面控制重绘管理视频全屏设置分辨率调整界面界面鼠标响应管理按钮响应单位单位运动界面 通过 控制 界面 管理 显示 单位3)运行框架设置视频1. 取得视频环境2. 取得视频设备3. 保存原有视频模式界面初始化1. 添加单位满足退出条件结束1. 恢复视频模式2. 推出全屏显示主过程1. 单位管理更新2. 视野坐标更新3. 取得绘图区4. 绘制绘图区鼠标响应 yes 影响 主过程 no 4:技术重点攻关及主要算法分析:1)关于视频1如何实现全屏:使用如下框架:graphicsenv

5、ironment graphicsenvironment = graphicsenvironment.getlocalgraphicsenvironment ();graphicsdevicegraphics device = graphicsenvironment.getdefaultscreendevice();displaymode originaldisplaymode = graphicsdevice.getdisplaymode();try graphicsdevice.setfullscreenwindow(helk); / set the full screen/: anyth

6、ing i want to do is written here. finally graphicsdevice.setdisplaymode(originaldisplaymode); graphicsdevice.setfullscreenwindow(null); / set off. system.exit(0); 2如何改变分辨率 if(graphicsdevice.isdisplaychangesupported() graphicsdevice.setdisplaymode(displaymode);在本程序中分辨率为 640 * 480。2)关于单位1 单位如何运动:a.在本项

7、目中使用了基于浮点的体系(区别与基于网格的体系)。基于浮点的体系位置(position)p(1.234, 5.678)方向(direction)all direction位移(displacement)d(0.0343, 0.5443) 基于浮点的体系 基于网格的体系位置(position)p(2,4)方向(dirction)four or eight directions位移(displacement)d(1,0)b.如何运动原有位置 (curposx, curposy)目标位置 (desposx, desposy)运动速率 (vel);有了以上参数就可以实现对下一位置的计算 double

8、sclx, scly; double distance = distancebetween(curpos, despos); sclx = (despos.x - curpos.x) / distance; scly = (despos.y - curpos.y) / distance; curpos.x += vel * sclx; curpos.y += vel * scly;c. 如何确定已到达目标如果只使用以上代码则会出现无法停止或distance = 0造成除零的危险。解决的方法是在距离目标位置很短的范围内(rngstop)停下来。即当distance rngstop时停下。而且速率

9、应当略小于这个范围,既 vel rngstop,避免有除零的危险。代码修正如下: if(!ismove) return; double distance = distancebetween(curpos, despos); if(distance endx 或 starty endy 时矩形的边长是负值,不能画框,因此要稍作处理。交换startx 与 endx 或是starty 与endy。2如何实现单位集体选中拖动鼠标产生如上矩形,遍历所以单位,当单位在矩形内时将此单位设置成选中状态(isslct = true)既可3如何实现单位单个选中单击鼠标左键,遍历所以单位,当点击位置与某一单位的距离

10、小于单位的一半尺寸时,该单位便被选中。4如何实现目的地选定单击鼠标右键,点击位置即被确定为目的地位置。4)关于单位的管理与控制1单位的管理任何一个单位生成后,都应向单位管理器(unitmanager)注册,由管理器管理。管理器负责对所有单位(在视野内)进行显示,微缩显示与更新。 public void createunit(unit unit) / 单个单位向管理器注册 units.add(unit); public void addunitgroup(linkedlist list) / 单位组向管理器注册 units.addall(list); public void updateall(

11、) / 对所有单位进行更新 listiterator lit = units.listiterator(); unit u; while (lit.hasnext() (u = (unit)lit.next().update(); public int showall(graphics g, rectangle r) / 对所有单位(在视野内)进行显示 listiterator lit = units.listiterator(); unit u; int i = 0; while (lit.hasnext() u = (unit)lit.next(); if (r.contains(int)

12、(u.getx(), (int)(u.gety() u.show(g, r.getlocation(); if(u.isselected() i+; return i; public void minishowall(graphics g, point p, int scale) / 对所有单位微缩显示 listiterator lit = units.listiterator(); while (lit.hasnext() / 调用所有单位的minishow(); (unit)(lit.next().minishow(g, p, scale); 2单位的控制所有选中的单位都在单位控制器(un

13、itcontroler)中注册。实际上所有的鼠标对单位的控制都是通过单位控制器完成的。 public void addunit(unit unit) / 添加单位 units.add(unit); unit.setselected(true); public void removeunit(unit unit) / 注销单位 if(units.remove(unit) unit.setselected(false); public void removeall() / 清空控制器 listiterator lit = units.listiterator(); while(lit.hasnex

14、t() (unit)(lit.next().setselected(false); lit.remove(); public void setunitgroup(linkedlist units) / 重置控制器 removeall(); / 先清空 listiterator lit = units.listiterator(); this.units = units; lit = units.listiterator(); unit u; while(lit.hasnext() (unit)(lit.next().setselected(true); public void executec

15、ommand(command cmd) / 对选定单位发布命令 listiterator lit = units.listiterator(); while(lit.hasnext() (unit)lit.next().executecommand(cmd); 5)总体协调1刷新率(画面的更新速度)的调整我发现绘图是有很大开销的,当视野内的单位超过150 个时速度会变得很慢(500mhz,64m条件下)。我通过调整睡眠时间(sleep)来使动画平滑.在unitmanager 中 showall()不仅显示所有在视野内的单位而且还返回一个放映绘图量的整数 drawcounter;将线程的睡眠时间

16、设定为 math.max(5,100 - drawcounter / 2);则效果较好2关于最大处理能力为了使动画不致太慢,单位数应少于200(500mhz,64m条件下)。5:类的功能划分及相互关系:1)自编类一览command命令接口exitablejframe关闭后自动退出的frame类helkcraft主类minimap小地图mobileunit可移动单位movecommand移动命令position浮点型坐标类unit单位接口unitcontroler单位控制器unitlayout单位排版器unitmanager单位管理器2)相互关系jframehelkcraftminimappos

17、itionunitcontrolerunitlayoutunitmanagermovecommandcommandmobileunitunitlinkedlistexitablejframea b b使用 a a b b继承 a6: 部分类的具体实现:对于关键类unitmanager 和 unitcontroler 上面已经介绍过了,这里不在赘述。接下来讲讲unitlayout 和 主类 helkcraft.1) unitlayout为了方便单位在地图上的摆放,我设计了unitlayout 这个辅助类。实际上它只有一个square()函数。这个函数在地图某个位置摆上单位的n x n 的方阵。它

18、的返回值可以交给unitmanager来管理。具体代码如下: static public linkedlist square(int n, position p, int interval) position pos = new position(p); linkedlist list = new linkedlist(); for(int i = 0; i n; i+) pos.x = p.x; for(int j = 0; j n; j+) list.add(new mobileunit(pos); pos.x += interval; pos.y += interval; return

19、list; unitlayout 还可以有任何摆单位的函数如line(), random(), triangle() 等等。这样就能摆出各种各样的阵型。由于精力所限, 我没有去拓展。square lineramdonrriangle2) helkcraft作为主类的helkcrart在报告的一开始就已涉及到。在这里着重讲一讲它的鼠标监听部分。helkcraft 有两个监听器,一个mouselistener 一个 mousemotionlistener。它们相互配合对鼠标进行监听并做出相应反应。 mouselistener 的方法伪代码mousepressed()if(leftbuttondown) setselectedrectangleinvisibleif(pressinminimap) controlerexecutecommandinminimapway else controlerexecutecommand else if (rightbuttondown)if(pressquitbutton)

温馨提示

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

评论

0/150

提交评论