java毕业论文之J2ME手机游戏开发毕业设计1.doc_第1页
java毕业论文之J2ME手机游戏开发毕业设计1.doc_第2页
java毕业论文之J2ME手机游戏开发毕业设计1.doc_第3页
java毕业论文之J2ME手机游戏开发毕业设计1.doc_第4页
java毕业论文之J2ME手机游戏开发毕业设计1.doc_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

毕业论文 (设计 )用纸 佳木斯大学教务处 第 1 页 1 绪论 1.1 手机软件现状 在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着 信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下 弊端: 1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不 能更新、修改,若要增加新功能必须另换一部手机。 2. 传统手机访问互联网是通过 wap(wireless application protocal),所有网络 资源必须接通网络才能在线访问,非常耗时、费用亦很高。 而 java 技术在无线应用方面的优势非常明显: 1. 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。 2. java 技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户 界面(gui); 3. java 技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在 本地运行,仅仅是在连接到服务器时才会占用网络带宽。 基于以上分析,java 手机将是未来手机的发展方向,是业界的热点。 1.21.2 j2mej2me 介绍介绍 虽然 java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌 入式系统之中。java 平台演进到 java2 后,java 平台分别针对不同领域的需求被分成四 个版本,亦即 j2ee、j2se、j2me 以及 javacard。其中 j2me 定位在消费性电子产品的应 用上。这个版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的 架构让不同类型产品能够随时增加支持的能力。这个版本的应用层面相当广泛,会是未 来 java 平台发展的重点项目。 j2me 在 1999 年的 javaone 开发人员大会上初次亮相,它的目标是面向智能无线设备 和小型计算机设备的开发人员。j2me 的一个关键优点是,j2me 与所有支持 java 的设备 都是兼容的。支持 java 的设备就是任何运行 java 虚拟机器的计算机。motorola、nokia 等生产厂商都生产支持 java 的设备。、 j2me 平台是由配置(configuration)和简表(profile)构成的。配置是提供给最 毕业论文 (设计 )用纸 佳木斯大学教务处 第 2 页 大范围设备使用的最小类库集合,在配置中同时包含 java 虚拟机。简表是针对一系列设 备 提供的开发包集合。在 j2me 中还有一个重要的概念是可选包(optional package),它 是针对特定设备提供的类库,比如某些设备是支持蓝牙的,针对此功能 j2me 中制定了 jsr82(bluetooth api)提供了对蓝牙的支持。 目前,j2me 中有两个最主要的配置,分别是 connected limited devices configuration(cldc)和 connected devices configuration(cdc)。 作为第一个面对小型设备的 java 应用开发规范,cldc 是由包括 nokia,motorola 和 siemens 在内的 18 家全球知名公司共同协商完成的。cldc 是 j2me 核心配置中的一个, 可以支持一个或多个 profile。其目标主要面向小型的、网络连接速度慢、能源有限(主 要是电池供电)且资源有限的设备,如手机、pda 等。 而 cdc 则是主要用于运算能力相对较佳、在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机机顶盒 (set-top box) 1.31.3 手机游戏应具有的特征手机游戏应具有的特征 一个手机游戏应该具有以下特征: 易于学习: 既然手机游戏面向的是普通消费者而不是计算机专家,那么他们不可能 深入的学习游戏技巧。消费者不会花几个小时去研究一个 3 元的手动操作的游戏。保持 游戏的简单是最基本的要求。 可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一 个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使 用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户 在游戏和工作模式之间顺利切换。 基于订阅:手机游戏的盈利成功取决于他们巨大的使用量。一开始开发和设计每个 游戏都是昂贵的。如果一个手机游戏开发者要赢利的话,重要的是:同一个游戏引擎, 多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。 丰富的社会交互: 不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩 完了所有的游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别 的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富 社会交互的游戏证明是成功的。 毕业论文 (设计 )用纸 佳木斯大学教务处 第 3 页 利用手机技术的优点: 巨额的手机技术研发费用都花在提高设备和网络的可用性和 可靠性上面。因此,手机设备硬件和网络协议与桌面/控制台世界(如全球定位系统(gps)扩 展、条形码扫描仪、和短消息服务(sms)/多媒体信息服务(mms)通讯)有着非常大的差别。 好的手机游戏应该利用那些更新的设备特征和网络基础设备的优点。 1.41.4 本游戏背景介绍本游戏背景介绍 在抗战中,由国民政府领导的中国空军是所有国民党军队中抗战最为彻底,也最为 英勇的部队,虽然开战之初力量悬殊,但是面对穷凶极恶的日本侵略者,他们毫不畏惧, 视死如归,全力以赴投身到民族救亡的伟业中去,用自己的鲜血和生命谱写了中华民族 最为豪迈的诗篇。自一九三二年二月五日“一二八”事件始,至一九四五年八月十四 日止,抗战期间,共出动飞机一千一百二十八批,八千八百四十七架次,击落敌机五百 二十九架,击伤敌机一百一十架,炸毁敌机二百二十七架。同时,中国空军空战中一共 牺牲空勤人员六百六十一名。 我至今仍然清楚的记得,在抗日战争即世界反法西斯战争胜利 50 周年的时候,我在 一本描述抗战空军的书里第一次看到阎海文烈士那年青的面孔时所带来的震撼,第一次 看到高志航、沈崇海等空军烈士的事迹时所带来的感动,第一次听说碧山空战时的无奈。 时至今日,已经很少有人能够记得在中国的天空献身的抗日英雄们,我只能引用下 面这句话来表达我的心情:“你们的名字无人知晓,你们的业绩与世长存! ” 我的这款游戏取名为览桥风光,以纪念从览桥中央航校走出的英雄们。 1.51.5 本章小结本章小结 引言和第一章中介绍了手机在无线应用方向的当今概况,j2me 的相关内容,分析了 j2me 在手机软件开发中起的重要作用,描述了本论文的相关背景。 2 2 开发环境及相关技术的介绍开发环境及相关技术的介绍 2.12.1 开发环境开发环境 操作系统:microsoft windows xp 程序语言:java 2 开 发 包:java(tm) 2 standard edition (5.0) sun micro. j2me wireless tool kit 2.2 毕业论文 (设计 )用纸 佳木斯大学教务处 第 4 页 ide: eclipse 3.01 2.22.2 javajava 语言特点语言特点 1. 平台无关性 java 引进虚拟机原理,并运行于虚拟机,实现不同平台之间的 java 接口。java 的 数据类型与机器无关。 2. 安全性 java 的编程类似 c+,但舍弃了 c+的指针对存储器地址的直接操作,程序运行时, 内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防 止程序的非法访问。 3. 面向对象 java 吸收了 c+面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于 维护性,使程序代码可以只需一次编译就可反复利用。 4. 分布式 java 建立在 tcp/ip 网络平台上,提供了用 http 和 ftp 协议传送和接收信息的库函 数,使用其相关技术可以十分方便的构建分布式应用系统。 5. 健壮性 java 致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的 可能性。java 取消了 c 语言的结构、指针、#define 语句、多重继承、goto 语句、操作 符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。 2.32.3 关于关于 eclipseeclipse eclipse 是一个开放源代码的、基于 java 的可扩展开发平台。就其本身而言,它 只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,eclipse 附带 了一个标准的插件集,包括 java 开发工具(java development tools,jdt)。 虽然大多数用户很乐于将 eclipse 当作 java ide 来使用,但 eclipse 的目标不 仅限于此。eclipse 还包括插件开发环境(plug-in development environment,pde), 这个组件主要针对希望扩展 eclipse 的软件开发人员,因为它允许他们构建与 eclipse 环境无缝集成的工具。由于 eclipse 中的每样东西都是插件,对于给 eclipse 提供插 件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的 毕业论文 (设计 )用纸 佳木斯大学教务处 第 5 页 发挥场所。 这种平等和一致性并不仅限于 java 开发工具。尽管 eclipse 是使用 java 语言开 发的,但它的用途并不限于 java 语言;例如,支持诸如 c/c+、cobol 和 eiffel 等 编程语言的插件已经可用,或预计会推出。eclipse 框架还可用来作为与软件开发无关 的其他应用程序类型的基础,比如内容管理系统。eclipse 是一个开放源代码的、基于 java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组 件构建开发环境。 2.42.4 关于关于 wirelesswireless tooltool kitkit wtk(wireless tool kit)是 sun 公司针对 j2me 推出的用于手机和 palm 等移动设备 的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发 出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽 然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他 ide 需集成采用的必备元素。 2.52.5 javajava appicationappication managermanager 手机中负责调配程序运行资源的管理后台是 java application manager。它所使用 的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。java application manager 会从网络上下载代表该 application suite 的 jar 档,接着在手机上安裝此 midlet suite,然后在手机开始执行该应用程序。 2.62.6 本章小结:本章小结: 第二章介绍了 java 语言的特点、本程序的开发环境及其相关工具的原理和使用。 3 3 程序结构、思想和相关技术程序结构、思想和相关技术 3.13.1 本程序需要解决的主要技术问题本程序需要解决的主要技术问题 1. 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时 运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频 率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错 误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情 况考虑在设计中。 毕业论文 (设计 )用纸 佳木斯大学教务处 第 6 页 2. 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴 图,在 midp2.0 中提供了用于增强游戏功能的 game 包,使得解决静态或动态、画面背景、 屏幕刷新的双缓冲等都有较好的解决方案。 3. 玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要 有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。 4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹 不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。 5. 双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许 多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要进行相关的 碰撞检测。 6.为了增加界面的美观,在程序中添加了白云。由于手机屏幕大小有限,所以白云 的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。 7. 游戏的地图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素, 也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和 java 的优势。 8. java 是基于虚拟机的半解释型编译系统,其执行效率较 c+等完全编译后的程 序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对 结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(obfuscator)进 行程序打包后的优化。 9. 游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。 良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的 考虑。 以上相关技术细节和整体流程将分别在以下小节阐述。 3.23.2 程序流程程序流程 midlet suite 是 midp 应用程序 的最小单位,jam 负责将手机内的 midlet suite 以图形化的方式呈现, 让用户能够选取欲执行的 midlet suite,一旦选取了某个 midlet suite,操作系统就会激活 kvm 执行 消减状态 (destroyed) 停止状态 (paused) 运行状态 (active) startapp() destroyapp( ) 呼叫 midlet 的构 造函数 destroyapp() pauseapp() 图 3-1 midlet 的流程 毕业论文 (设计 )用纸 佳木斯大学教务处 第 7 页 里面的 midlet。midlet 及相关的支持类组成了 midp 应用程序的实际内容。而 每个 midlet 都必须继承 javax.microedition.midlet.midlet 这个抽象类。在 midp 规范中定义了 midlet 的生命周期,以及可以存在的三种状态,包括 paused、active 以 及 destroyed,每一个 midlet 在任何时刻只可能处于其中的一个状态。这三种状态的转 换关系如图 3-1 所示:midlet 有三个状态,分别是 pause、active 和 destroyed。在启 动一个 midlet 的时 候,应用管理软件会首先创建一个 midlet 实例并使得他处于 pause 状态,当 startapp() 方法被调用的时候 midlet 进入 active 状态,也就是所说的运行状态。在 active 状态调 用 destroyapp(boolean unconditional)或者 pauseapp()方法可以使得 midlet 进入 destroyed 或者 pause 状态。值得一提的是 destroyapp(boolean unconditional)方法, 事实上,当 destroyapp()方法被调用的时候,ams 通知 midlet 进入 destroyed 状态。在 destroyed 状态的 midlet 必须释放了所有的资源,并且保存了数据。如果 unconditional 为 false 的时候,midlet 可以在接到通知后抛出 midletstatechangeexception 而保持在当前状态,如果设置为 true 的话,则必须立即进 入 destroyed 状态。 本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运 行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对 背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓 冲技术对屏幕重绘,实时反映整个游戏的进行状态。 游戏开始后先绘制地图,并将各个对象实例化。在主程序运行的线程中,游戏中所 有的对象都应该运行在同一个线程下。当敌人或者用户的子弹达到射程范围后,并不删 除子弹对象,而是使用 setvisable(false)使其不能显示,当用户或敌人在次发射子弹时, 只需使用 setvisable(true)设置成可以显示即可。在屏幕重绘的主程序中,将在每次的 循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。如:玩家剩余飞 机数是为 0、敌人、玩家飞机是否被击中、屏幕上相关信息的绘制等。 程序为需要完成独立功能的模块设置了单独的类。lzhhdm 类继承自 midlet,gamescrenn 类、menuscreen 类继承自 gamecanvas,mybullets 继承自 sprite 类。载入程序后首先启动的是程序介绍的信息画面。点击 ok 后调用 menuscreen 类实现 菜单。 毕业论文 (设计 )用纸 佳木斯大学教务处 第 8 页 如果选择进入游戏,则调用 gamescreen 类,并且中止 menuscreen 类中的线程运行,已 提高运行速度。 mybullets 类为玩家子弹类。 3.33.3 canvascanvas 类类 为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类, 尤其在游戏程序中,几乎完全依赖的就是 canvas 抽象类进行绘图。从程序开发的观点看, canvas 类可与高级 screen 类交互,程序可在需要时在 canvas 中掺入高级类的组件。 canvas 提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射 为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并 不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便 硬件开发商能定义他们自己的游戏键布局。 3.43.4 graphicsgraphics 类类 graphics 类提供了简单的 2d 绘图功能。它具有 24 位深度色彩的绘制能力,以三原 色分别各占一个字节表示其颜色。程序只能在 paint()函数中使用 graphics 绘制, gamecanvas 可调用 getgraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输 到前台。其对象会被传给 canvas 的 paint()函数,以便最终显示。 3.53.5 midp1.0midp1.0 技术下的绘制背景技术技术下的绘制背景技术 在没有 midp2.0 前,进行游戏绘图一般需要手动编程使用双缓冲。需要在 paint()方 法内将所想要画的图形画在一张预先准备好的背景上,等所有绘图操作都完成后再将背 景的数据拷贝到实际的屏幕上。image 类提供了一个建立背景的静态方法 createimage(int width, int height),再利用 getgraphics()方法取得属于这个背景的 graphics 对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再 调用 drawimage()方法将背景的数据复制到实际显示的屏幕上。 这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新 画面的操作就是先将屏幕以 fillrect()的方式清除,再将下一张图片画在屏幕上,然而 反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在 背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除 的操作,因此就不会出现闪烁的现象了。不过在某些 midp 的实现上已经加上了双重缓冲 毕业论文 (设计 )用纸 佳木斯大学教务处 第 9 页 的支持,因此在处理前应先利用 canvas 类的 isdoublebuffer()方法来判断。 3.63.6 midp2.0midp2.0 新增的新增的 gamecanvasgamecanvas 包包 j2me 的流行促进几个运营商和制造商开发了一些支持游戏的类,但是,这却造成了 游戏缺乏可移植性的问题,例如,很难将使用 siemens 的 sprite 类的游戏移植到 nokia 上。 在 midp2.0 版本发布后,这些游戏移植性问题初步得到了解决。midp2.0 新加入了 gamecanvas、sprite、layer、layermanager、tiledlayer 五个与游戏开发相关的类。其 中 layer 类一般不会直接用到。 game 类的出现不仅降低了错误出现的几率,也使游戏代码变的更小,因为开发者不 需要自己编写象 sprite 这种例子。下面将简要介绍 game 类。 gamecanvas 类继承自 canvas,所以具有 canvas 所具有的功能,还额外增加了一些 便于游戏设计的功能。比如: gamecanvas 类直接提供了 getkeystates(),使程序员可以 在同一个线程自己侦测按键的状态。gamecanvas 类提供了 flushgraphics()的功能,实 现了双缓冲技术。 所谓的 sprite,就是画面上独立移动的图形。 sprite 类是继承自 layer 的用于存储多桢的基本可视元素。不同的 frame 可交相显 示,构成动态的效果。图片可翻转、颠倒、由一个主角图片就可以方便的得到所有方向 的显示状态,相比原先只能使用 canvas 绘图,需要将所有方向的主角图象都绘制在 png 图象中简化了许多。sprite 也可以从整合的图象中读图,读图时将把大图分解为若干等 宽等高的小图。每个小图按照其排列顺序有相应的序号,在程序中调用其序号,就可以 绘制出相应的图片。本程序中的双方飞机、子弹、白云都由 sprite 继承得到。 layermanager 提供控制整体画面层的控制。它包括了一系列自动获取了代号和位置的层, 简化了各层加入游戏画面的过程,提供了自动排序和绘制的能力。 layermanager 存储了一个层的列表,新的层可以用函数附加、删除和插入。层的序 号相当于坐标的 z 轴,0 层表示最接近用户视觉,层数越高,离用户越远。层号总是连续 的,即使有中间的层被移除,其他层的序号会作相应的调整以保持整体的完整性。lm 中 的 view window 控制着与 lm 相对坐标的可视区域。改变 view window 的位置可以制造出 滚动屏幕的效果。 tiledlayer 是有一组图象格元素组成的整块虚拟图象。该类使不需要高分辨率的图 毕业论文 (设计 )用纸 佳木斯大学教务处 第 10 页 象就能创建大幅图面成为可能。这项技术通常应用在 2d 游戏平台的滚动背景的绘图。一 块整图可被分割成等大小的图象格,每块格有其对应的序号,按照行列递增。多块小格 可由大块同时替换组合而模拟动态的背景,这不需要逐块替换所有的静态图象格而显得 非常方便。 3.73.7 pngpng 图片格式图片格式 png(portable network graphics)格式是 midlet 唯一支持的图象格式,png 具体格 式由 png specification,version 1.0 定义的。png 格式提供透明背景的图象,这对绘制 游戏画面和被操纵主角极有帮助。飞机之间或与白云碰撞时就不会因为背景有特定的颜 色,显示出的效果像贴上的图片而缺乏真实感,物体之间轻微重叠时最上层图片也不会 覆盖超过其有效象素外的部分。 png 格式图片中包含许多定义其图片特性的冗余部分(chunks)。这些代码包含在每一 个单独的 png 格式图象中,然而如果将多个 png 图象合并在一张幅面稍大一些的整图中, 多个 chunks 就可以得到精简,图片的大小可以得到控制。使用 image 类中的 createimage 函数可从整图中分割出所需要的元素。在 game 包中的 tiledlayer 和 sprite 类都整合了这样的功能。本程序中的地图元素都集成在一张 beijing.png 图片中, 实现了方便的管理和程序体积的精简。 3.83.8 玩家飞机的控制方式和敌人方的智能运行玩家飞机的控制方式和敌人方的智能运行 gamecanvas 提供 getkeystates 函数可获取当前键盘上的信息。将以位的形式返回 键盘上所有键的按与释放的状态,当 bit 为 1 时,按键就是被按下的状态,为 0 时则为 释放状态。只需要此一个函数的返回值就可以返回所有键的状态。这保证了快速的按键 和释放也会被循环所捕捉。同时,这样的机制也可检测到几个键同时按下的状态,从而 提供斜向运行等相应功能(本程序没有实现斜上运行功能)。 程序运行时应该对玩家飞机是否飞出屏幕的范围进行检测,如果飞出屏幕,就应该 重新设定玩家飞机的位置。 玩家飞机被击中后,为了平衡游戏的可玩性,玩家飞机将有短暂时间无敌,即不进 行碰撞检测,同时在屏幕右上角显示无敌时间。 根据游戏设定,敌人飞机。不能与玩家飞机重合,则他每走一步都需要检测一下是 否与玩家飞机碰撞。sprite 类中提供了 collideswith 函数,用于判断是否与某个 毕业论文 (设计 )用纸 佳木斯大学教务处 第 11 页 sprite、tiledlayer、image 的对象有图象上的重合(即游戏中的碰撞)。同理,还需 要检测玩家子弹与敌机、敌机与玩家子弹是否碰撞。如果发生碰撞,将相关精灵图片替 换为爆炸图片。 敌人飞机需要具有一定的智能性,以便对玩家攻击,使游戏具有一定的可玩性。敌 人可以在适当时候转向或者开炮火,同时,程序应该检测敌机是否飞出了界外。 在普通敌机中,有一组敌机的其中一架具有跟踪功能,其原理为:当其进入屏幕后, 根据玩家飞机的 x、y 坐标不断调整自己的 x、y 坐标,已达成跟踪的效果。由于线程的 关系,敌机器的改变方向有时并不是实时的,这就可以使玩家有躲开撞击的可能,增强 了游戏的可玩性。 在游戏进行中出现的大型飞机,由于其不可能立即被击落,所以应该设置其的运行 方法,理论上讲还是根据玩家飞机的坐标,但是,在此设置一个标志位,使得敌人在取 的玩家位置后即开始玩家方向运动,这期间,将不执行取得玩家飞机位置重设飞行方向 的步骤。这样做,即防止了大飞机变成跟踪飞机,又使得大飞机的运行具有不确定性。 在关尾出现的 boss,其在屏幕上方左右移动并发射子弹。实际上,此时 boss 应该 通过玩家在游戏运行中的习惯性的运行方向,使用遗传算法,来动态判断玩家下一步的 运行方向,并且指挥普通飞机出现在预测的位置上。可惜由于时间关系没有实现。 3.93.9 子弹的运行和控制子弹的运行和控制 玩家的子弹是个精灵数组,有 9 个元素,表示玩家一次最多可以发射 3 组 9 发子弹, 对于一个完整的游戏来讲,应该根据关卡的不同而给予玩家不同的飞机,飞机性能的差 别在于子弹的射程不同。由于本游戏仅有一关,所以子弹速度设定的差别没有体现出来。 当玩家一次发射了 3 组子弹,而这 3 组子弹并没有消失时,玩家将无法发射子弹。 使用每组子弹的第一发作为与敌人进行碰撞检测的精灵,同时相关的标志位也设在 第一发子弹中。如果玩家子弹与敌机相撞,则敌机消失时,子弹精灵的图片替换为爆炸 图片,直到第二次发射该组子弹时,才将图片替换为子弹图片。 3.103.10 内存的优化内存的优化 手机内存空间小,所以在程序设计时应该注意以下几点,以尽量减少内存的使用: (1)尽量缩短命名的长度。在应用程序内,对于所建立的类、接口、方法及变量名而 毕业论文 (设计 )用纸 佳木斯大学教务处 第 12 页 言,都需要赋予一个识别的名称,所命名的名称每多一个字符就会在类文件内多产生一 个字节,对于一个较复杂的应用程序而言就会增加为数不小的数据量。所有这些可以借 助混淆器来帮助实现 (2)所有代码写为一个类。 (3)只使用一个线程。 (4)尽量不使用静态变量。 (5)将 png 图片合并成一张,减少图形数据的大小。 将 png 格式的小分辨率图象合并在一张大的高分辨率图象中,由于减少了头文件的 大小,将比合并前的总大小减少许多。 3.113.11 内存检测器内存检测器 wireless tool kit 提供了许多在运行时监视运行状态的工具。 包括内存状况的检 测(手机上的内存空间十分有限,必须时刻关注机载内存是否大于程序所能使用到的最 大可能的内存空间),网络状况的检测,运行函数的跟踪等。 内存检测器是内存跟踪测 试随时间变化的调试器。其中,允许强制垃圾回收(garbage collection)。由于 java 语 言中,不像许多其他的如 c+语言,不需要指定回收函数中特定不使用的资源,资源回收 机制将自动清空无效变量占用的空间。在程序运行中也可以调用 system 类的 gc()函数手 动收回废弃的内存。 3.123.12 关于混淆器关于混淆器 java 语言并没有完全编译成二进制可执行文件,编译出的.class 文件是一种介于源 程序和二进制之间的一中基于半解释的字节码,需要虚拟机来执行。它包括了所有的信 息。然而这样会导致.class 很容易被反编译为源代码,从而不能保护作者的知识成果。 目前流行的如 decode,jad 等反编译工具可以以很快的速度生成源文件。如果不加以施行 有效的措施,将造成严重的后果。 由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的 英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。 混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介 绍的减少变量、函数的命名长度的关系,编译后也会从.class 文件中减少这些冗余的信 毕业论文 (设计 )用纸 佳木斯大学教务处 第 13 页 息。混淆后,体积大约能减少 25%,这对当前费用较贵的无线网络传输是有一定意义的。 3.133.13 本章小结本章小结 第三章中介绍了程序的流程、相关技术的思想及其在本程序中的应用。对游戏基本 算法等做了详细叙述。具体算法的代码实现和详细流程将在下章介绍。 4 4 程序分析和具体实现程序分析和具体实现 4.14.1 游戏进入前的选择游戏进入前的选择 毕业论文 (设计 )用纸 佳木斯大学教务处 第 14 页 每个 midlet 程序都必须有一个主类,该类必须继承自 midlet。它控制着整个程序的 运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理 程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进 入暂停状态。)、结束的函数。本程序主类为 lzhhdm,并实现接口 commandlistener。 首先显示的是游戏的背景介绍(图 4-1),为此,在类 lzhhdm 定义 form 类对象 a,在 startapp()函数中判断 issplash 是否为真,如果为真的话,将创建 form 类的实例 a,并且调用 append()方法在表单上放置 stringitem 类的实 例以显示游戏背景信息。使用语句 ok=new command(“ok“,command.ok,1);实例化 command 类对象 ok。调 用 addcommand()命令建立 ok 命令与 form 之间的关联,调用 setcommandlistener()命令使 form 与 commandlistener 建立 关联。调用 displayable 的 seturrent()函数显示背景介绍窗口。 图 4-1 游戏背景介绍 当玩家点击 ok 后将调用 display.setcurrent(menuscreen) 以显示游戏菜单 menuscreen(图 4-2)。 类 menuscreen 继承自 canvas 类,并实现接口 runnable 和 commandlistener。在类 menuscreen 中定义了 lowcolor 和 highcolor、highbgcolor 三个整型变量及布尔型变量 co。其 中 lowcolor 赋值为 0x000000ff,代表兰色,higcolor 赋值为 0x00ff0000,代表红色,highbgcolor 赋值为 0x00cccccc,代表 兰灰色,即背景条。当玩家按住上或下键时,在函数 keypressed (int code)中的整型变量 menuindex 相应的减 1 或加 1,相应的,在 paint()函数中会 根据 menuindex 绘制选项是否被选中。在函数 run()中,如果 co 为真,则不停的 repaint(),设置 co 的意义在于,当进入游戏主画面后,co 赋值为 false,以终止绘制选 项的 repaint(),提高游戏速度。 当移动选项条到某项,并点击 ok 时,在 commandaction()方法中根据 menuindex 图 4-2 游戏的菜单 毕业论文 (设计 )用纸 佳木斯大学教务处 第 15 页 的值判断选择了哪个选项,列如当选择“关于”时,将调用 lzhhdm 类中的 renwushow() 方法以显示”关于”界面(图 4-3),在 renwushow()方法中,form 类对象 a=null,表示 清空 form,并重新调用用 append()方法在表单上放置 stringitem 类的实例以显示游戏关 于信息,“帮助“界面的显示与”关于“界 面相同,只不过调用的是 helpshow()方法。 4.24.2 mybulletsmybullets 类类 在介绍游戏主类 gamescreen 类之前, 应该先简要说明一下玩家子弹类 mybullets 类,实际上,mybullets 类是应该删除的,其 要实现的功能应该放在 gamescreen 类中, 但是由于设计游戏的过程也是一个学习的过 程,而在当时,我并没有意识到这一点。 mybullets 类继承自 sprite 类,以实 现玩家子弹的相关功能。首先,创建子弹状 态数组 private int bullets,其中,i 0代表子弹的 x 坐标,i1代表子弹的 y 坐标,i2代表子弹 y 方向速度,i3代表子弹存活状态(由于此类是在早期设计 的,而之后子弹存活状态使用了子弹射程作为标志位,所以其并没有起到作用)。类中定 义的方法 setfirstposition()起到定义玩家子弹发射坐标的作用(此方法在设计时起到的 作用是消除每按一次开火玩家子弹位置就重新定位这个 bug,但是,这个 bug 完全可以用 图 4-3 关于界面 进入游戏 y1-1550 pzbzover=0 显示敌人 玩家被击落 了吗 ? 玩家是否还有 机会? 继续游戏 是否过关 返回主界面 y y n y y n 图 4-4 gamescreen 类主要关系流程图 n 毕业论文 (设计 )用纸 佳木斯大学教务处 第 16 页 设置标志位的方法消除)。方法 newposition()实现的功能为更新玩家的子弹位置,并且 检测玩家子弹与普通敌人的碰撞及记录玩家战果(更新子弹位置的功能可以由使用 move() 加设置标志位的方法取代;由于设计这个类的时候并没有考虑到添加 boss 等,所以在此 检测碰撞,但添加 boos 等功能后,此处的检测完全可以和飞机对飞机等的碰撞检测封装 在同一个方法中)。 mybullets 类在 gamescreen 中建立了对象数组 huokebullet9,代表玩家所能发射 的 9 发子弹。 4.34.3 游戏逻辑及游戏逻辑及 gamescreengamescreen 类类 gamescreen 类是游戏的主类,决定着敌人何时出现,控制着敌人出现的方法,判断 敌人及玩家是否被击中等。它运行在独立的线程中,以恒定的频率刷新画面。本程序设 置为 1/20 秒。其主逻辑如图 4-4 所示。 .1 gamescreengamescreen 类所实现的功能类所实现的功能 gamescreen 类要实现地图的滚动、敌人飞机的相关属性、玩家的相关属性等功能。 gamescreen 类包括了 layermanager,这样所有静态和动态的图象都不需要手动刷新, 只需要在 layermanager 中加入所有的需要控制的精灵,在统一由 layermanager 刷新即可, 因此,在 gamescreen 中创建 layermanager 的对象 lm,并在构造函数中实例子化。 其他精灵类的对象如敌人飞机、玩家飞机、玩家飞机的子弹、敌人的子弹、boss 及 boss 所属的子弹都需在 gamescreen()类中建立相应的对象,并在构造喊数中实例化,且 由 lm.appned()方法添加到 layermanager 类对象 lm 中。 .2 地图的创建地图的创建 由于手机存储空间的限制,不可能将整张地图完整地存储在手机中,为了节约空间, 往往提出地图中相同的图片组成一张 png 格式的图片,然后象拼图一样拼出地图来,专 业的游戏设计者往往自己写一个地图编辑器,以使拼图过程不是那么痛苦。 创建地图就需要使用 tiledlayer。tiledlayer 指的是由一块一块类似用瓷砖拼凑起 来的画面。地图实际即为 tiledlayer 的一个对象。先利用 tiledlayer 的构造函数建立 tiledlayer,根据构造函数的参数可以给定 cell 数组 的大小,并且地图图片切割成等尺 寸的画面,并调用 setcell()设置具体的图象格内容。地图 图片如图 4-5 所示。 图 4-5 地图 毕业论文 (设计 )用纸 佳木斯大学教务处 第 17 页 (0,y1) y1=y1+1; view window 向下移动 (0,0) 图 4-6 图 4-6 因此,创建一个返回 ttiledlayer 的方法 createbackground(),以便在 gamescreen()的构造函数中调用。在方法中,定义整型数组 map1以存储 cell 的索引值。 并使用 tiledlayer.setcell(column,row,map1i)设定 ttiledlayer 的内容,以形成地 图。其中 i 的值由循环 for(int i=0;i0 时,碰撞后,将变量 planert 赋值为 1,在之后的 if(planert=1)判 断语句中,重新设定玩家飞机的图片和可视状态,同时使用 setposition()函数设定玩家 非的位置在屏幕下方。设定 pzbz=1,即不检测碰撞,玩家有短暂时间无敌,无敌时间由屏 幕右上角进度条表示。设定 inputno=1,即飞入屏幕的过程中手机键盘是不可以用的。设 置 planert=2,即以上这些设置只执行一便。 在 if(planert=2)判断语句中,使用语句 move( 0,-2)使飞机自己向上运动,使用 if(c1.gety()(getwidth()-c1.getwidth() 语句判断(getwith()为屏幕的宽度,c1.getwidth()为玩家飞机 c1 的宽度),如果条件为 真,则使用 c1.setposition(getwidth()-c1.getwidth(),c1.gety()语句将飞机设置 在紧靠屏幕右边的位置。上、下、左的设置原理同上。 语句 if(keystateipalnepo,通过改变标志位的值使得 drawsteing()不在执行,四字消失。 如果玩家被击落后并没有点“返回“,而此时,背景会一直运动到关尾,考虑到其 图 4-9 毕业论文 (设计 )用纸 佳木斯大学教务处 第 23 页 与关尾 boss 共用 3 发子弹,如 sboos 不消失,将会出现子弹乱飞的情况。所以,如果判 断语句 if(sboss.gety()=getheight()为真,则表示离地图的终点只有一个屏幕的距 离时,sbz 赋值为-1、sbpzbz 赋值为 1(含义上面已经说明)。同时调用 sboss.move(0,-3), 使 sboos 快速飞出屏幕,直到判断语句 if(sboss.gety()0 时,飞机向左下方运行,使用语句 setframe(0)、move(-3,3)达成向左下方运动 的效果。当 aippc1.getx()判断 j1 在 c1 的左或右侧,并且实时根据判断情况使用 setframe()和 move()改变飞机的形态,使 用语句 if(j1.getx()c1.getx() cloud1.setposition(80,planepoup-(140); cloud2.setposition(112,planepoup-(90); 毕业论文 (设计 )用纸 佳木斯大学教务处 第 25 页 cloud3.setposition(175,planepoup-(200); cloud4.setposition(223,planepoup-(70); 其原理为:将屏幕的 x 数轴和 y 数轴各分成 5 份,即在 x 轴的 5 个范围内每个范围 出现一朵白云,y 轴的每个范围内也只能出现一朵。所以的白云的起始位置在每次游戏开 始时是固定的。 白云位置设定后,使用 move(0,1)使白云移动,由于白云初始位置设定在屏幕的不同 区域内,故其移动出屏幕的先后顺序是不同的,使用 if(cloud.gety()planepo)判断 白云是否飞出屏幕。如果为真则使用 cloud.

温馨提示

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

评论

0/150

提交评论