1、基于 J2ME 的手机游戏开发摘要:随着通信技术的发展和手机的普及,手机游戏的开发技术越来越为人们所关注。以J2ME 为开发平台,利用 Java 提供强大工具,不但可以在手机上实现静态 HTML 技术所无法实现的计算处理、数据存储、与服务器的通信等功能,而且能够开发各种手机游戏。本文在介绍 J2ME 及其体系结构的基础上,以贪吃蛇游戏为实例,描述了借助 J2ME 的MIDlet 类库开发手机游戏的过程。关键词:手机游戏; MIDP 应用程序; 永久性数据Develops based on the J2ME handset gameAbstract: Along with communicati
2、on development and handset popularization, people more and more pay attention to the handset game development technology. Develops the platform take J2ME, provides the powerful tool using Java, not only may realize the handset functions that static HTML technology be unable to realize, such as compu
3、tation processing, data storage, and communication with server, but also can develop all kinds of handset games. On the basis of the technology and architecture of J2ME being introduced, the gluttonous snake game was taken as a example, the development process of handset game with the aid of the J2M
4、E MIDlet class library is described in this article.Key Words: Handset game; MIDP application pragram; Permanent data目 录第一章 绪论 .11.1 研究背景 .11.2 研究内容 .1第二章 J2ME 及其体系结构概述 .22.1 J2ME 简介 .22.2 J2ME 体系结构 .22.3 移动信息设备简表概述 .32.3.1 MIDP 的目标硬件环境 .32.3.2 MIDP 应用程序 .32.3.3 CLDC 和 MIDP 库中的类 .32.4 J2ME API 简介 .4
5、2.4.1 MIDP API 概述 .42.4.2 MIDlet 应用程序 .42.4.3 使用定时器 .52.4.4 网络 .62.4.5 使用 Connector .72.4.6 使用 HttpConnection .82.4.7 永久性数据(RMS) .92.4.8 存储集(Record Store) .102.4.9 记录 .112.4.10 枚举 .122.4.11 异常 .132.5 用户界面(LCDUI .132.5.1 UI 基础 .132.5.2 高级 UI .142.5.3 低级 UI .15第三章 手机游戏开发过程 .163.1 贪吃蛇游戏的规则简介以及开发环境 .163
6、.1.1 贪吃蛇游戏的规则简介 .163.1.2 开发环境 .163.2 详细设计 .163.2.1 代码设计 .17第四章 程序的调试与运行 .224.1 游戏的调试 .224.2 游戏的运行环境 .23第五章 总结 .24致 谢 .25参考文献 .251第一章 绪论1.1 研究背景JAVA 自从 20 世纪 90 年代早期诞生以来,以其强大的功能迅速为广大程序员们所接受。从 2001 年开始,日本的国内的移动电话开始搭载 Java。使用本来就是一种程序语言的 Java 之后,就可以在移动电话上完成以往静态的 HTML内容所无法达成的计算处理、数据存储、与服务器的通信等等。如果能利用Java
7、 上其他丰富功能,那么就可以实现更多的功能。随着手机游戏的发展,国内外各大开发商纷纷运用 Java 进行手机游戏开发。 J2ME 作为一种基于 Java 的便携设备开发平台,在各大手机开发公司得到了广泛应用。1.2 研究内容本课题拟研究基于 J2ME 的手机游戏开发技术以及其特点,具体研究内容如下:1、手机游戏开发以及 J2ME 的基本理论和 J2ME 类库的使用;2、J2ME 体系结构的研究;3、MIDP 移动信息设备简表的研究;(1) 、MIDP 的目标硬件环境;(2) 、MIDP 应用程序;(3) 、CLDC 和 MIDP 库中的类。4、J2ME API 的研究;(1)MIDlet 应用
8、程序的研究;(2)MIDlet 的类库研究;(3)各事件发生器的应用。5、开发工具的应用和开发环境的设置。其中 MIDP 移动信息设备简表的研究和 J2ME API 的研究为重点,本课题将通过一个具体的手机游戏的开发来研究以上内容。2第二章 J2ME 及其体系结构概述2.1 J2ME 简介现在 JAVA-JAVA2 Platform 大致可分为 J2SE、J2EE、J2ME 三类。J2SE为 JAVA-JAVA2 Platform 的标准版,通常在 PC 上使用的 JAVA。J2EE 是在J2SE 的 API 上,扩展了给企业使用 EJB 与 Servlet 等主要使用在服务器上的功能。而 J
9、2ME 则是面向家电和通信工具等微小设备。J2ME 的目标是微小设备,这类设备有许多种类,在这些设备的 J2ME 当中,定义了 CDC( Connected Device Configuration),CLDC(Connected Limited Device Configuration)这两个 Configuration。CDC 是以能用在个人网关、下一代移动电话、PDA(个人数字助理) 、家电设备、POS 终端、车辆导航系统等上运行为前提设计出来的。CLDC,是以能使用在移动电话、PDA(个人数字助理) 、家电设备、 POS 终端等上面为前提设计出来的。2.2 J2ME 体系结构配置和简表
10、:配置定义了一个设计在一系列类似硬件上运行的 Java 平台的能力。J2me 的目标是家电与嵌入式设备,这类设备有很多种类,对应这些设备的 J2me 当中,定义了 CDC(连接设备配置)和 CLDC(受限接设备配置)两个配置,配置所提供的类函数只有 Java.lang, Java.io,Java.util 包等 J2SE 等核心类的子集。CLDC 是与手机相关的,它实际是定义一个设备制造商用来实现Java 运行环境的标准,第三方开发者只需要遵循这个标准。CLDC 主要影响Java 开发和软件发布的以下方面:1)目标设备的特性;2)安全模型:安全模型有两个部分,虚拟机和应用程序安全。虚拟机安全层
11、的目的是保护下面的设备不受任何执行代码可能引起的损害。32.3 移动信息设备简表概述2.3.1 MIDP 的目标硬件环境1)显示 :96*54 象素,1 位颜色,大约 1:1 比例;2)输入: (a)单手键盘或者小键盘;(b)双手的 QWERTV 键盘;(c)触摸屏。 3)内存: (a)128KB 非易失性内存,供 MIDP 组件使用;(b)8KB 的非易失性内存,供应用程序生成的永久数据使用;(c)32KB 的易失性内存,供 Java 堆使用。4)网络: (a)双响无线网络,可间歇性连接;(b)通常是很有限的带宽。2.3.2 MIDP 应用程序在 MIDP 上运行的 Java 程序被称为 M
12、IDlet。MIDlet 是服从一些关于它运行环境和程序打包的一些规则。其运行环境是启动 MIDlet,这是设备内置应用管理器的任务。应用程序能访问到下面的一些资源:(1)震动文件中的所有文件。 (2)MIDlet 描叙文件的内容( JAD) 。2.3.3 CLDC 和 MIDP 库中的类打包:MIDlet 应用一般采用震动文件的形式。这个文件应该包含运行应用程序需要的类和所有的资源文件,它也应该包含一个叫 manifest.mf 的清单文件。保存在震动文件中的清单文件是一个简单的文本文件,包含属性值。应用程序描叙(JADs)在移动电话网络上传送大量的数据,需要有一个描叙文件让用户在没有下载整
13、个包之前来查看一下 MIDlet 震动的细节。42.4 J2ME API 简介2.4.1 MIDP API 概述MIDP API 包含以下五个部分,如表 2-1 所示:表 2-1 MIDP API类 别 描 述Application 包括 MIDlet 类。Timers 主要包括 Timers 和 Timers Task 类。Networking 提供访问设备通信能力的接口。Persistence 通过记录管理系统(RMS)API 访问用户永久存储。User Interface 包括 MIDP LCDUI(液晶显示器用户界面)类。2.4.2 MIDlet 应用程序MIDlet 即 MIDP 的
14、应用程序, MIDlet 应用程序的核心是 MIDlet 类。为了创建一个 MIDlet,必须从这个虚基类派生出自己的类。表 2-2 提供了从 MIDlet类继承的方法。表 2-2 MIDlet 类方 法 描 述访问 JAR 和 JAD 文件中的属性String gerAppProperty(string key)返回 JAR 和 JAD 中与 key 相对应的属性的值。Abstract void destoryApp (boolean unconditinal)应用程序管理器在应用程序关闭前,调用这个方法来给我们做一些事情的机会(例如保存状态和释放资源) 。Abstract void pau
15、seApp() 在用户暂停游戏时,应用程序管理器调用 MIDlet 的类方法。Abstract void startApp() 应用程序管理器调用 MIDlet 的这个方法,来告诉用户再次开启游戏。5Abstract void notifyDestroyed() 如果游戏者决定退出游戏,可以调用这个方法来通知应用程序管理器。续表 2-2 MIDlet 类方 法 描 述Abstract void notifyPausrd() 调用这个方法来通知应用程序管理器游戏者已经暂停游戏。Abstract void notifyRequest() 调用这个方法来告诉应用程序管理器 MIDlet 要重新开始。
16、应用程序管理器(Application Manager ,AM)的作用就是管理 MIDlet 。本质上来说,MIDlet 应用程序只存在两种状态 暂停和运行。MIDlet 被创建后默认为暂停状态,当应用程序管理器认为它准备完毕,它会调用 startApp 方法来通知 MIDlet 进入运行状态。2.4.3 使用定时器 MIDP API 包括两个关于定时器的类 Java.util.Timer 和 Java.util.Timer Tast 类 (如表 2-3 和 2-4 所示 ):表 2-3 Java.util .Timer 类方 法 描 述Timer() 构造一个新的 Timer 对象。Void
17、 cancel() 停止 Timer。Void schedule(TimeTask task,Dare d) 把一个任务定时在时间 d 运行。Void schedule(TimeTask task, Data firstTime, long period )让一个任务第一次在一个指定的时间运行,然后每隔 period 毫秒运行一次。Void schedule(TimeTask task,long delay) 指定一个任务在 delay 毫秒后运行一次。Void schedule(TimeTask task,long delay,long period)指定一个任务从 delay 毫秒连续运行
18、,然后每隔 period 毫秒运行一次。6Void scheduleAtFixedRate(timeTask task,Date firstTime,long period)指定一个任务从 firstTime 连续运行,然后以固定间隔 period 毫秒连续运行。Void scheduleAtFixedRate(TimeTask task,long delay,long period)指定一个任务在 delay 毫秒后运行,然后以固定间隔 period 毫秒连续运行。表 2-4 Java.util.Timer Tast 类方 法 描 述Timer Task() 构造一个新的 Timer Tas
19、k 对象。Boolean cancel() 结束该任务。Abstract void run() 这个方法必须被一个包含 Timer 时间执行的代码的方法重载。Long scheduledExecution Time() 返回任务上一次执行的确切时间。我们可以通过不同 schedule 的方法来确定什么时候执行任务,包括在一个指定的时间执行一次和那个时间后按照一个固定的时间间隔连续执行。也可以在一段延迟(单位是毫秒)后执行任务,还可以选择以固定的时间间隔连续执行。2.4.4 网络 MIDP 包含对 CLDC 中的 GCF(Generic Connection Framework),即通用连接框架
20、的支持,MIDP 规范只是要区分必须实现 HTTP 的连接。如果想开发的是基于无线网络的高性能的多人联网游戏,这非常值得考虑应用。目前的情况是,无线网络的传输情况是高延迟以及高丢失率,所以响应时间在 50ms 的游戏很难实现。通用连接框架使用静态工厂类 Connector 去创建和返回一个连接。如图 2-1所示是所有类型的类层次图。7Connector.openConnectionInputConnection OutputConnectionStreamConnectionContentConnectionHttpConnectionStreamConnectionNotifer Datag
21、ramConnection图 2-1 类层次图图 2-1 通用连接框架包含丰富的多功能的通信类;但是 MIDP 只确保支持HttpConnection。2.4.5 使用 Connector通用连接框架设计包括一个超级 Connector 的概念,这个 Connector 作为一个支持任何连接类型的工厂,基本上来说,调用 Connector 类的静态方法 open即可,把需要连接的资源的名字作为参数传递过去,这个名字应该采用“协议: 地址: 参数” 的格式。在代码里将采用 HttpConnection 类,如表 2-5 所示:表 2-5 HttpConnection 类方 法 描 述Static
22、 Connection open (String name) 构造,打开和返回一个指向一个指定URL 的连接。8续表 2-5 HttpConnection 类Static Connection open(String name , int mode)构造,打开和返回一个连接,连接一个指定资源 URL 和打开的模式都需要设定。Static Connection open(String name , int mode , Boolean timeouts)构造,打开和返回一个连接,连接一个指定资源 URL 和打开的模式都需要设定,同时也有一个参数指定是否需要超时异常。static Connecti
23、on openDataInputStream(String name)打开一个连接,然后构造和返回一个数据输入流。static Connection openDataOutputStream(string name)打开一个连接,然后构造和返回一个数据输出流。static Connection openinputStream(String name)打开一个连接,然后构造和返回一个输入流。static Connection openOutStream(String name)打开一个连接,然后构造和返回一个输出流。2.4.6 使用 HttpConnectionHttpConnection 类是
24、一个全功能的 HTTP 客户端,实用于大多数的网络任务(低延迟) 。对于游戏而言,可以用它来按需下载内容(如新的关卡) ,更新得分,或者实现游戏者之间的通信。表 2-6 是所有 HttpConnection 类的可用方法。表 2-6 javx.microedition.io.HttpConnection 类方 法 描 述long getData() 获取头中的日期值。Long getExpiration() 获取头中的过期时间。String getHeaderFieldkey(int n) 根据索引获取头中的键名。String getHeaderField(int n) 根据索引获取头中的键值。String getHeaderField(String name) 获取指定的头文字段的值。