您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页基于JAVA的游戏设计

基于JAVA的游戏设计

来源:尚车旅游网
辽宁科技大学毕业设计(论文) 第I页

基于JAVA的游戏设计

摘要

J2SE(Java 2 Simple Edition) 定位在客户端,主要用于桌面应用软件的编程,J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类。因其拥有“Write Once, run anywhere”的Java特性而提高开发的效率。

随着JAVA应用的日益普及、Java在各种平台上的的实现,Java应用程序一次编译到处运行的特点逐渐体现出其影响力,对减少重复编程、提供快捷的跨平台应用起着不可忽视的作用。本论文着眼于JAVA技术的应用,开发一款可用于各种平台之上的游戏程序——坦克大战。本程序的思路来自于日本任天堂公司在20世纪80年代开发的Battle City游戏,将老少皆宜的经典作品重新用JAVA进行了呈现,为更流行的硬件平台提供应用软件。

关键词 JAVA;J2SE;游戏;坦克大战

辽宁科技大学毕业设计(论文) 第II页

Abstract

J2SE is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It focuses on application for consumptive electronic products, providing revolutionary solution to the intelligentization and diversification of the equipment. It improve the efficiency of the development process thanks to its “Write Once, run anywhere” nature.

When cell phone is getting ever more popular nowadays, with the implementation of Java technology on mobile equipment, increment of capital on communication service exhibits its force on people’s everyday life, providing them ever fast information just in hand. This dissertation focuses on implementation of J2SE technology and has developed a commercial game suite run on mobile phones—Tank. This application inherits many characters of the old fashioned game Battle City which developed by Nintendo in 1980s. It transports the classical product to mobile phones, offering corresponding software for such more popular hardware platform.

Keywords Java;J2SE;Game;TankWord

辽宁科技大学毕业设计(论文) 第III页

目录

摘要 ............................................................................................................................... I

Abstract ......................................................................................................................... II

第1章 绪论 ............................................................................................................. 1 第2章 开发环境及相关技术的介绍 ............................................................... 3

2.1开发环境 ........................................................................................................... 3 2.2 Java语言的特点 ............................................................................................... 3 2.3关于ECLIPSE .................................................................................................. 4

第3章 程序结构、思想和相关技术 ............................................................... 5

3.1 本程序需解决的有关技术问题 ...................................................................... 5 3.2 程序截图 .......................................................................................................... 7 3.3 程序流程 .......................................................................................................... 8 3.4 相关技术 .......................................................................................................... 8 3.4.1 多态 ........................................................................................................... 8 3.4.2 单例模式 ................................................................................................... 9 3.4.3 责任链模式 ............................................................................................... 9 3.4.4 工厂模式 ................................................................................................... 9 3.4.5 简单工厂模式 ......................................................................................... 10 3.4.6 抽象工厂模式 ......................................................................................... 10 3.4.7 策略模式 ................................................................................................. 11 3.4.8 调停者模式 ............................................................................................. 11 3.4.9 门面模式 ................................................................................................. 11 3.4.10 PNG格式 ................................................................................................. 11 3.4.11 AWT绘制的基本原理 .......................................................................... 12 3.4.12 双缓冲 ................................................................................................... 12 3.5 程序思路 ........................................................................................................ 13

辽宁科技大学毕业设计(论文) 第IV页

3.5.1 坦克的控制和敌方的智能运行 ............................................................. 13 3.5.2 子弹的运行和控制 ................................................................................. 14

第4章 程序分析和具体实现 ........................................................................... 16

4.1 主游戏逻辑及其涉及到的若干类 ................................................................ 16 4.2 坦克的共同行为 ............................................................................................ 19 4.3 玩家坦克的功能属性 .................................................................................... 19 4.4 敌人坦克的功能属性 .................................................................................... 20 4.5 子弹的运行和控制 ........................................................................................ 24

结论 ............................................................................................................................ 26 致谢 ............................................................................................................................ 28 参考文献 .................................................................................................................. 29 附录A ....................................................................................................................... 30 附录B ........................................................................................................................ 34

辽宁科技大学毕业设计(论文) 第1页

第1章 绪论

现在流行的游戏似乎都是用C或C++来开发的。在Java平台上几乎没有很大型及可玩的流行游戏。由于Java是个新生语言,他的许多特性还有待大家的发掘,但是我们不能否认Java在游戏编程方面的强大性。本文将带领大家一步一步学习编写Java游戏。最终打造属于自己的Java游戏。

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。

Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.4,最近版本为Java1.7(本文应用的JDK1.7版本)。

虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、

J2ME以及Java Card(其结构示意图见图1.1)。

图1.1 Java结构图

J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

Standard Edition(标准版) J2SE 包含那些构成Java语言核心的类。比如:数据库

辽宁科技大学毕业设计(论文) 第2页

连接、接口定义、输入/输出、网络编程。

Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。比如:EJB、Servlet、JSP、XML、事务控制。

Micro Edition(微缩版) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。比如:呼机、智能卡、手机、PDA、机顶盒。

通过本次设计可以综合运用J2SE所拥有的API,初步掌握面向对象编程的基本思想,掌握Eclipse开发J2SE程序的基本方法。掌握Eclipse调试程序的方法。简单的应用了设计模式等概念。

辽宁科技大学毕业设计(论文) 第3页

第2章 开发环境及相关技术的介绍

2.1开发环境

操作系统:Microsoft Windows XP 程序语言:Java 2

开发包: Java(TM) 2 Standard Edition (build 1.7.1)Sun Micro. IDE: Eclipse -SDK-3.4.1

2.2 Java语言的特点

1、 平台无关性

Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关。 2、 安全性

Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。 3、 面向对象

Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。 4、 分布式

Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。 5、 健壮性

Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。

辽宁科技大学毕业设计(论文) 第4页

2.3 关于ECLIPSE

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。

这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建。

辽宁科技大学毕业设计(论文) 第5页

第3章 程序结构、思想和相关技术

3.1 本程序需解决的有关技术问题

1、 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。

2、 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。

3、 己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Java的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。

4、 对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。这需要对所有的对象有较好的控制。另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。如此过多的线程同时在本来效率就不高的KVM虚拟机上运行,也许会导致程序的缓慢。

5、 双方的坦克在前进时也需要考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要将所有的周围环境都进行扫描。

6、 游戏的结束、开始、动态信息画面作为构成一个完美程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图也需要有一定的考虑。

辽宁科技大学毕业设计(论文) 第6页

7、 游戏的地图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去程序的原则和Java的优势。同时,地图关卡不宜保存占用过多的内存,而最好采取外部文件的读入读出方法。

8、 用户运行游戏时需要有分数记录的可能。如何采用合理的记分标准,需要进行适当的设计。记录分数的存储方式也需要有较好的解决方案。手机中由于处理器和内存空间、存储空间都十分有限,其数据库系统与普通PC大相径庭。其数据库结构较为简单,被称之为RMS系统。

9、 本程序应用的技术

多态Polymorphism;单例模式Singleton;责任链模式Chain of Responsibility;工厂模式Factory Method;简单工厂模式Simple Factory;抽象工厂模式Abstract Factory;策略模式Strategy;调停者模式Mediator;门面模式Facade等概念与技术并将一些属性信息抽象了除了以配置文件的方式出现,从而方便用户更改。以上相关技术细节和整体流程将分别在以下小节阐述。

辽宁科技大学毕业设计(论文) 第7页

3.2 程序截图

开始界面 游戏界面 坦克混战 图3.1 程序截图

狂轰滥炸

辽宁科技大学毕业设计(论文) 第8页

3.3 程序流程

本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定

敌方需的频率采用双缓冲技术对屏幕重绘,实时要出坦克时,生成坦克 Logo 画面 A选项画面 开始 主程序 初始化参数人数用光 反映整个游戏的进行状态。用户控制的坦克运行在主线程中,随屏幕刷新的频率而步进。敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方对象就新增加一条线程,一旦线程数满到最大值,就不允许敌人再继续出现。用户坦克自诞生之时起将拥有一发子弹,子弹虽然开在单独的线程中,但运行结束后(比如撞到相关物体或敌方坦克时)并不结束子弹对象,只是

屏幕绘图 符合结束显示GameOver 记分统计 图3.2 本程序的主流程图

将其线程终止。用户再次发射子弹时只是将终止的线程再次激活。在屏幕重绘的主程序中,将在每次的循环中判断若干事件。如:用户坦克的生命是否已完全用尽,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。以便程序进入相关的分支执行相关的反应代码,结束游戏或统计分数等。主程序流程如图3.2所示。

3.4 相关技术

3.4.1 多态

多态性是继数据抽象和继承后,面向对象语言的第三个特征。Java的多态性它的突出优点是使程序具有良好的扩展性。它通过继承,可以派生出任意多个新类型,

辽宁科技大学毕业设计(论文) 第9页

或向基类增加更多方法时,无须修改原有对基础类进行处理的相关程序。就是扩展性好。

3.4.2 单例模式

作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

图3.3 单例模式图

显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个\"单例对象\",而\"客户甲\"、\"客户乙\" 和\"客户丙\"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。如图3.3所示。

3.4.3 责任链模式

多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用范围:

1、 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 2、 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、 可处理一个请求的对象集合应被动态指定。com.cz.tank包下的ColliderChain类用责任链模式遍历所有游戏物体 做碰撞检测。

3.4.4 工厂模式

工厂模式为系统结构提供了灵活的动态扩展机制,减少工作量方便维护,方便维

辽宁科技大学毕业设计(论文) 第10页

护。com.cz.tank 类 GameFactoryMgr应用了工厂模式。

3.4.5 简单工厂模式

专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。简单工厂模式的UML类图如图3.4所示:

图3.4 简单工厂模式

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

3.4.6 抽象工厂模式

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。

辽宁科技大学毕业设计(论文) 第11页

每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。

3.4.7 策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。本程序的坦克外观使用了策略模式。com.cz.tank.strategies的DrawTankStrategy类。

3.4.8 调停者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。com.cz.tank 类 Game Mediator使用了调停者模式。

3.4.9 门面模式

外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。

3.4.10 PNG格式

PNG具体格式由PNG Specification Version 1.0定义的。PNG格式提供透明背景的图像,这对绘制游戏画面和被操纵主角极有帮助。坦克之间或与障碍物碰撞时就不会因为背景有特定的颜色,显示出的效果像贴上的图片而缺乏真实感,物体之间轻微重叠时最上层图片也不会覆盖超过其有效象素外的部分。

PNG格式图片中包含许多定义其图片特性的冗余部分(Chunks)。这些代码包含在每一个单独的PNG格式图像中,然而如果将多个PNG图像合并在一张幅面稍大一些的整图中,多个chunks就可以得到精简,图片的大小可以得到控制。使用Image类中的create Image函数可从整图中分割出所需要的元素。在Game包中的Tiled Layer和Sprite类都整合了这样的功能。本程序中的地图元素都集成在一张MAP.png图片

辽宁科技大学毕业设计(论文) 第12页

中,实现了方便的管理和程序体积的精简。

3.4.11 AWT绘制的基本原理

AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程。paint、repaint、update 三个方法关系如图3.5所示 :

图3.5 双缓冲原理示意图

3.4.12 双缓冲

进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内所想要画的图形画在一张预先准备好的背景,等所有绘图操作都完成后再将背景的数据拷贝到实际

辽宁科技大学毕业设计(论文) 第13页

的屏幕上。Image类提供了一个建立背景的静态方法createImage(int width, int height),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的

绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用paint()方法将背景的数据复制到实际显示的屏幕上。

这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。

3.5 程序思路

3.5.1 坦克的控制和敌方的智能运行

GameCanvas中提供了与以往不同的键盘采样功能。GameMediator类中采取响应键盘事件的方法,每次执行周期时会读取keyPressed函数中需执行的代码。这样的机制并不适合某些游戏场合。在某些不支持keyRepeat功能的设备上,反复执行的按键,比如发射子弹,将不能因为长时间按压而自动重复,这样就需要用户高频率的手动击键,这在操纵空间非常有限的移动设备上是非常困难的。同时,事件的执行周期也并不一定适合游戏的场合,也许需要更高频率执行的按键却只能在指定的周期内规律的响应。对此,针对游戏的开发,Game包提供的键盘状态功能将显得十分有效。

GameCanvas提供getKeyStates函数可获取当前键盘上的信息。将以位的形式返回键盘上所有键的按与释放的状态,当bit为1时,键就是被按下的状态,为0时则为释放状态。只需要此一个函数的返回值就可以返回所有键的状态。这保证了快速的按键和释放也会被循环所捕捉。同时,这样的机制也可检测到几个键同时按下的状态,从而提供斜向运行等相应功能。

敌方按照规则不能和用户坦克重合,则它每行走一步就需要把用户坦克扫描一次,判断其是否碰撞到了用户的坦克。Sprite类中提供了collidesWith函数,用于判断是否与某个TiledLayer、Sprite、Image的对象有图象上的重合(即游戏中的碰撞)。然而不能仅仅将用户坦克作为其Sprite参数传递给敌人的类进行判断。因为如果发

辽宁科技大学毕业设计(论文) 第14页

生碰撞,collidesWith成立,则两辆坦克已经发生了图象重合,违反了规则,甚至若再进行collidesWith判断的话,其结果将永为真。为了提前预知碰撞,可以将所有坦克的碰撞范围设定为一个比坦克图片稍大一些的矩形,此矩形仅在坦克前方比坦克图形多出一个象素。在多出的11个象素中,按照每个象素依次检查此象素是否于外界发生碰撞,如果不是按照象素检查,则当坦克与障碍物错位并同时与两种物体接触时将有可能忽略检测其中的一样物体。这样,就可以提前一步判断。如果发生碰撞,则坦克应当选择掉转方向,此时,两辆碰撞的坦克又因为其矩形区域不重合而不符合collidesWith的条件,就可以继续正常运行了。

敌方坦克由于需要具有一定的智能性,以便对玩家攻击,使之具有一定的可玩性。敌人可以自动行走,但是应当在以下适当的情况下转向:首先是是否超出界面的边界,其次是是否与地图障碍物发生了碰撞,再次是是否与用户坦克发生了碰撞。需要指出的是,当发生阻碍不能在不变方向的情况下继续行走时,并不一定立即需要采取转向的对策。如果一定发生转向,试想,当敌方碰到玩家时,如果它立即转向,将不会对玩家发射射向他的子弹,就不构成任何威胁,当然,也不能永远不转向。本程序设置为:当碰撞到障碍物或边界时立即转向,但碰到玩家坦克时需要有一个等待的时间,这个时间由碰撞前随机取得的在某方向上的持续行走步数决定,当发生坦克间碰撞时,此随机数将在下一次循环前减少为原来的2/3,这样就实现了加快转向的时间,避免死锁在一个方向上静止的停留过长的时间。另外,坦克的发炮间隔和转后的具体方向都由随机数决定。坦克之间由以上道理也不会发生重叠,但当某坦克正从上方生成而正巧有另一辆阻碍在其生成点处,这将导致不可避免的重合。这是允许的,但需要对他们标注状态,即当坦克刚出现时暂时允许重合,一旦在某个时间他们脱离了重合状态,就不能在允许重合,如果不设置这样的判断,刚出现的坦克将会因为受到阻塞而永远不能前进,坦克将混成一团。本程序中并未使用过多复杂的人工智能算法,如有时间,将可能再此方面加以完善。

3.5.2 子弹的运行和控制

每一个坦克都有他自己的一颗子弹,这颗子弹在任何一辆坦克被构造时就一直存在,直至此坦克生命的结束,子弹的再次只是将屏幕上暂时掩盖的图象重新置于坦克炮筒才恰当位置,并使其显示出来,这与现实中每个子弹都是单独的个体有所不同。

辽宁科技大学毕业设计(论文) 第15页

子弹所需要完成的任务有:

它是一个继承了Runnable虚类的可运行单独线程的对象。在其出现在屏幕上的运行周期中,每一步都需要循环检测以下条件:

是否与某坦克发生了碰撞,即击中了这辆坦克。子弹使用的是象素级的碰撞检测,因为子弹的图片形状不规则,如果使用矩形碰撞检测,将有可能在子弹尚未接触到物体时就已返回碰撞的真值。分为两种情况,如果此子弹来自于敌方,将只检测玩家坦克,因为敌方之间的子弹必须允许可以透明的穿过,以保证不会在敌人之间发生子弹的消减。如果来自玩家,则每一步需扫描所有的敌方坦克,检查是否发生碰撞,这可能会花费不少的CPU时间。

其次,子弹之间需要检测是否碰撞。敌人之间显然,如上已经提过,不需要检测,但敌人与玩家之间应当可以互相消除子弹,以便在狭窄的路口中仍有存活的机会。玩家的子弹需要在每一步检测所有敌人的子弹的运行状态。这样较多的运算也将不可避免的耗费大量CPU时间。

子弹对不同障碍物将有不同的反映。对砖墙将有能力将其击毁,使之在画面上消失;对水泥钢筋将不能发生作用,子弹也不能通过;对于河流,坦克不可以通过,但子弹可以;对于草丛,子弹和坦克都可以通过。

辽宁科技大学毕业设计(论文) 第16页

第4章 程序分析和具体实现

4.1 主游戏逻辑及其涉及到的若干类

TankClient主管着所有类之间的协调,决定何时死亡,何时分配新的敌人,及控制敌人出现处的闪光图标、游戏结束后的动态Game over字样。它运行在独立的线程中,以恒定的频率刷新画面。刷新速度需大于30/秒才能使画面显示因人眼的暂时停留效应流畅运行。本程序设置为20毫秒。其主逻辑如图4.1所示。

程序中建立了另外的两个包,分别表述了敌人坦克和玩家坦克的功能。它们分别为:EnemySprite和UserSprite。这两个类均在TankClient中建立了对象,以便进行统一调度。BattleCanvas包括了LayerManager,这样所有静态和动态的图象都不需要手动刷新,只需要在LayerManager中加入所有的需控制的元素,再统一由LayerManager刷新即可。因此,有必要在其中创立一个LayerManager的对象。

其他,如Sprite类的gameover字样、记分统计画面也都需在此主逻辑中建立相应对象。还需保存的变量有,游戏开始时间、结束时间(用于统计分数)、敌人的总数、屏幕上敌人的数量、下一个敌人需要出现的位置(总共允许在三个不同的位置出现,分别位于屏幕的左、中、右方)、游戏是否已成功结束或是否已死亡。

构造函数中,需初始化地图。地图实际即为TiledLayer的一个对象,可调用setCell设置其具体的图象格内容。地图由外部文件读入。外部文件分别命名为level*.png,利用MIDP中唯一获取外部文件为程序内资源的getResourceAsStream()函数将地图文件读入程序。在创建了InputStream类的map对象后,使用read()函数可将流中的下一个字节读出,并返回此字节代表的整数。每个整数代表一种障碍物。用二维循环将读出的每个整数,通过setCell()将整幅地图画出即可。地图文件可用十六进制的文本编辑器生成,如本程序使用的Ultraedit。

绘出地图后,可用LayerManager的append()将地图放置在第一层。这是很有必要的。因为地图上的障碍物之一——草,在坦克运行中时是必须处于坦克的上层的,否则将失去真实性。为此,地图必须首先载入。

辽宁科技大学毕业设计(论文) 第17页

开始 敌人数量小于0y Nn 显示记分画面 Y最后一关或死亡了y n 进入下一关 敌人数量大于屏幕上的Nn 增加一敌人 y N玩家是否死亡 n 显示gameOver 重绘屏内存回收 结束 y 图4.1 BattleCanvas类主要关系流

辽宁科技大学毕业设计(论文) 第18页

由于敌人将依次出现在屏幕上,同时出现的数量应当受到控制。本程序设置为6。所以在构造函数中,也应当分配6个EnemySprite对象的内存空间。构造坦克时,将把坦克的png图片作为参数传递给EnemySprite和UserSprite,BattleCanvas中创建坦克仅调用createEnemy()和createUser()实现。

在构造函数自己调用了线程的start后,程序将开始循环运行,直至跳出while的循环。每次循环中将检测是否死亡,屏幕上坦克的数量,是否该过关统计分数,检测用户输入的按键、重绘整个屏幕及回收垃圾内存(Garbage Collection)。

当敌人坦克完全死亡时(enemyNum为0),需调用System类的currentTimeMillis()赋值给结果的时间。接着调用setCurrent()显示统计分数的画面,为了进入下一关,统计画面只是停留四秒,就重新转回BattleCanvas画面。当然,如果当前已是最后一关,就不会再转回。进入下一关时,许多变量需要重新被初始化,如地图的绘制、敌人出现位置的重置、敌人的数量、玩家坦克的当前位置。

如果游戏未结束,则需判断屏上坦克是否已小于还剩坦克的总数,如果是这样,就需要再提供一辆坦克。提供新坦克之前,在屏幕上设置了一个专用指示的闪光符号,它继承了Sprite,运行在单独的线程中。以在两秒钟内反复闪现两次为一个生命周期。当它闪光完毕后,敌人就会从闪光位置出现。这样可提示玩家具体敌人将在什么时刻出现,以便做好准备。闪光位置设置了三处坐标,由于敌人不能同时出现,便设置了enemyOutDelay的倒数计时,每次屏幕刷新会减少一次计数,直到为0时就准备一辆坦克。本程序设置的两次坦克出现的最小间隔为2秒。

如果玩家已经死亡,就需要使用LayerManager的insert()将gameover字样插入到最上层,以免被其他物体覆盖。

在检测用户输入的input()函数中,当按方向键时,玩家坦克就将向不同的方向运行,这调用了UserSprite的go()函数;当开炮时,就调用其fire()函数,作出相应的行为。

在出现正式画面前设置了一个loading state*字样的单独屏幕,调用了loadinglevel()函数,并停滞了1500毫秒,提示用户做好准备。

在绘图的render()过程中,除了要重绘坦克、地图、子弹外,还会在右边空白处绘出一个生命统计栏。并反复使用Graphics的drawLine()、drawImage()绘画出一个三

辽宁科技大学毕业设计(论文) 第19页

维的效果,增强视觉感。该三维栏的上方为白色,下方为黑色,就创造了立体感。在每次刷新绘图页面时,应使用GameCanvas的flushGraphics()将屏幕后台的缓冲区内的图象刷新到前台来。

在允许敌人出现前,需要检测给即将出现的敌人分配一个数组序号。在程序中调用了getNullEnemyIndex()进行测试,当返回为-1时说明没有序号可以分配,否则,将返回空的序号。

4.2 坦克的共同行为

在TankSprite中定义了所有坦克(包括敌方坦克和玩家坦克)的共同行为和属性。EnemeySprite和UserSprite都继承了该类以简化结构。在transformDirection[]中定义了坦克四个方向分别应将原始图片旋转的角度,分别为

TRANS_NONE,TRANS_ROT90,TRANS_ROT180,TRANS_ROT270,以便在后来的setTransform()中将这些常量代入。构造函数中创建了每个坦克必须拥有的一颗子弹,这些子弹就将只跟随自己的坦克调动。

为了能提前预测碰撞,调用了defineCollisionRectangle(0,-1,11,12)将碰撞矩形向前设置了一个象素,具体原理见第二章。

在setBulletDirection()中,将根据坦克当前的方向确定子弹出膛后的方向,其中setRefPixelPosition()将子弹的参考点设置在其未变形状态的底部,setXY()将其放置到炮口的位置,setTransform()将其图片方向转到需要使用的位置。

canPass()函数将返回坦克是否能够向前前进,考虑到的因素有边界、障碍物。它返回一个boolean值,提供给go()函数,做进一步的判断。getTileIndex()将检测传递来的象素处是什么类型的障碍物,它将象素除以8(即障碍物的象素宽度),取整,再通过getCell()得到。在得到障碍物属性后,判断其序号是否与草相同,或是否为空(序号为0)。因为所有的障碍物中只有草不会阻碍坦克的向前运行。

4.3 玩家坦克的功能属性

构造函数中需要将坦克方向设置为向上,因为刚出现时就是这样的状态。当开炮时,调用BulletSprite的setLayerManager()将子弹与layerManager联系起来。需要联

辽宁科技大学毕业设计(论文) 第20页

系的还有自身坦克、地图。这些都由坦克传递给子弹。因为子弹是属于坦克的,它的属性需要跟当前的坦克保持一致。接着使用append()将子弹贴到layerManager上显示出来。最终调用其start()开始子弹自己的线程。子弹一旦开始运行,就脱离了当前坦克的控制,直到其生命周期终止。

无论子弹是属于敌人还是玩家的,它都必须记录自己的来源和攻击的对象。在玩家坦克发射的子弹中,就必须将攻击对象设置为所有的敌人。这样,它才能有扫描的目标。在setShootCheck()的参数中,传给子弹的是敌人的数组,子弹的对象就被确定了。

die()、resetPosition()、getLife()都是很简短的函数,但却提供必不可少的功能。他们可被外部调用,以取得生命值、死亡记数、重置位置。

在go()函数,每个方向在走前都须用if (canPass(UP)&&!collidesEnemy()) 检测是否可以行走。canPass()检测是否有障碍物及是否到边界。collidesEnenmy检测是否前方有坦克阻碍行动。当可以行走时,就在当前方向的坐标上增加或减少一个象素。

在collidesEnemy()函数中,将有一个for循环按照敌人数组的序号依次检测6次。有一点非常重要:在检测前,需要将敌人的检测矩形区域设置为与原来图片一样大小。否则,当玩家向上走,而有敌人从左方向右走,并且已经碰撞到玩家坦克时,玩家坦克会因为被判定已与敌人发生碰撞而不允许前进。事实上,敌人坦克此时并没有阻碍玩家前进。这样的判断必须排除在考虑范围外。当然,在设置完成后,必须将将检测区域设置回原先的状态,否则敌人在往后自己的检测中将发生错误。

4.4 敌人坦克的功能属性

由于和UserSrite同属于一个TankSprite的继承类,其功能就与UserSprite有很大的相似之处,但也有其自身的特别属性。其主要功能流程图如图4.2所示。

首先,EnemySprite继承了Runable接口。因为敌人的运行是自动的,需要有设定的程序让它可自己控制,而不像UserSprite完全通过每次输入的键盘信号来做出反映。因此,它可以运行在单独的线程中。

辽宁科技大学毕业设计(论文) 第21页

开始 是否已死亡 y Yn Ny 是否刚出现 Nn 前进 是否碰撞 n Y可否开炮 Nn 开炮 N可否前进 y 换向、取随机移动步数、随机开炮倒数记步数 结束 图4.2 敌方坦克运行流程图

辽宁科技大学毕业设计(论文) 第22页

setEnemyShootCheck()函数与UserSprite中的一样,设置了攻击的对象,并且此函数将继续把参数传递给自身的子弹,以便子弹可以识别攻击对象。此函数由BattleCanvas调用。

getRandomDirection()以当前系统时间作为种子,调用了Random类的nextInt()产生一个随机的整数,此整数取除4的余数的绝对值作为随机的方向。

Random random=new Random(System.currentTimeMillis()); return Math.abs(random.nextInt())%4+1;

此时返回的值的范围就确定在1~4之间,正好对应四个方向。将他们代入需要使用方向的函数中就可以使用了。

getRandomStep()的原理类似:

Random random=new Random(System.currentTimeMillis()); return (Math.abs(random.nextInt())%4)*50;

只是需要乘以每秒会刷新的屏幕的次数。这样就相当于允许在某一个方向运行0~3秒钟的时间。

每个敌人还需要拥有一个内部的所有敌人的数组元素。这样,它们才可以自动检测自己是否与同伴发生了碰撞,以便采取躲避、转向等行动。

collidesWithOtherTank()将检测是否与其他坦克(包括敌人和玩家)。一个循环将依据敌人的序号查找5次。if(i==number)break ;语句将避免检测到自己,永远返回真。

collidesInOtherTank()虽与上面的函数很相似,但仍有一些细微不同,那就是不需要在检测前设置被检测方的矩形区域。因为不需要进行预先检测。此函数用来检测是否在刚出现时就与其他坦克发生碰撞的。如果一出现,出口就被堵死,显然,不能永远不出现,那就应采取其他的办法,否则两辆坦克将因为都处在碰撞状态中而无法移出。

在运行的线程中,需在每前进的一步骤中循环做下列事件: 如果坦克已死亡,立刻退出。(由boolean值destroyed决定)。

如果不是刚出现(由isBeginner决定),判断是否与将其他坦克发生碰撞,就向当前方向前进一步骤,否则,将需要循环检测的当前随机步数减少为原先的2/3(为了加速离开的时间)。如果刚出现,就直接走一步,具体如何行走将在go()函数中决定,并且此go()与UserSprite中的有所区别。

辽宁科技大学毕业设计(论文) 第23页

开始 y 是否出界 Yn y 将可以消除的障碍物消除 N玩家的子弹是否击中物n y 是否与任何敌人的子弹碰撞 Y子弹抵消 y n NY是否击中任何敌人 消除敌人 Ny n 敌人的子弹吗? 是否与玩家的子弹碰撞 子弹抵消 y n 是否击中玩家 n N消除玩家 y 结束 图4.3子弹运行的主要功能流程图

当随机发炮数减少到0时,就进行发炮的动作。发炮后应立即重新赋值给随机发炮数,以便重新倒数计算。

辽宁科技大学毕业设计(论文) 第24页

当所有的步骤走完后,因为需要转动方向,于是,调用一次随机取得方向的函数再次获值。其他的随机值也应当重置。

在go()函数中首先检测是否正处于碰撞状态中,如果不是,就需要取消Beginner的状态,因为不需要Beginner这样的特殊身份,让别的坦克不检测了。

在运行在某个方向上,当确定为canPass时,应再检测是否为Beginner。如果是,就不应该受到其他坦克的影响而直接改变坐标,但若不是,就应当远地不动。

4.5 子弹的运行和控制

子弹继承了Runnable,运行在独立的线程中。它拥有一个很重要的变量,isFromEnemy。它标识了该子弹是属于玩家的,还是敌人的,这样可以控制子弹在脱离坦克管束后的运行状态中的行为。其主要功能流程图如图4.3所示。

checkHit(int x,int y)调用了getTileIndex(x,y)获取当前子弹击中的是什么障碍物,如果返回了false就表示没有击中任何东西。当击中了需要作出反映的物体时,就分别采取措施:击中草时,由于没有定义相关函数,就不会有任何反映,会重合在草上正常通过;击中砖块时,将产生爆炸,调用setCell将当前块置为空,并产生爆炸效果。爆炸效果由tileExplode(x,y)根据需要爆炸的坐标点生成,其中将一个Sprite图片在界面上闪现150毫秒。爆炸效果需要将图片insert进第0层,这样才不至于被其他景物所覆盖,爆炸结束后layerManager会自动相应调整。击中钢筋时,将只产生爆炸效果。

setShootCheck(EnemySprite enemySprite[]);setUserSprite(UserSprite userSprite); setEnemySprite(EnemySprite enemySprite)都是将相关的坦克传入到子弹类里来,以便确认来源或攻击目标。

在线程的循环中while ( (x < 155) && (x >=5) && (y >=5) && (y < 171))作为循环的条件可以控制子弹出界的范围。这几项参数在编写时很容易出错。它们反映了象素级处理的技巧。如果程序在子弹已经到达X轴的155坐标时仍允许子弹继续运行,子弹将一次性向右运行2个象素,到达157点。在随后的checkHit(RIGHT)调用中,它将检测它是否在x+3点,即160点击中了某个障碍物,但是160/8=20。地图的tiledLayer对象中并不存在序号为20的块,最大只为19。此时ArrayOutOfBoundException异常就会抛出,程序终止运行。

辽宁科技大学毕业设计(论文) 第25页

子弹运行中,将用collidesWith(tiledLayer,true)测试是否碰撞上了地图。如果为真,就继续检测碰撞上了什么样的物体。这将针对四个不同的方向分别以象素级检测。如果击中了某样物体,那么checkHit自然会处理,子弹的生命周期结束,以break退出循环。

如果没有击中物体,就继续检测是否击中了某辆坦克。这根据子弹的来源分为两种情况。当来自玩家时,将首先检测所有的敌人发出的子弹,当发生子弹间的碰撞时,用户的子弹将被移除,虽然按照道理敌人的子弹同时也应被移除,但敌人子弹是运行在另一线程中的,应当由它自己来控制为好,用户的子弹只需要管理好自己的状态就可以了。如果没有和子弹发生碰撞,就检测是否与敌人碰撞,发生碰撞时,将敌人从layerManager中移除,并置为null,产生爆炸效果,敌人数量减少一位,敌人屏幕上数量减少一位。

如果是来自敌人的子弹,将同样检测与玩家子弹的碰撞,及与玩家坦克的碰撞如有碰撞,玩家生命数减少一位,位置重置。如果玩家生命已死亡殆尽,就需要在进行以上操作的同时将玩家坦克的位置放置到屏幕外的部分。因为layerManager的remove函数并不会真正将层移除。只是用户看不见而已。如果不放置到屏外,敌人坦克仍会被阻挡,子弹仍会再次击中用户坦克。这将会是很荒唐的场面。

为了能控制一辆坦克在同一时间只能发射一发子弹,在子弹生命运行结束时候,将调用userSprite.enableShoot()恢复坦克继续发炮的能力。因为在发炮期间,坦克的再次发炮的功能是被锁定的。

辽宁科技大学毕业设计(论文) 第26页

结论

本程序设计实现使用J2SE为工具的坦克大战游戏的开发,采用从外部文件读取配置文件、自动控制敌人坦克运行的方式进行控制,具有一定的可玩性和复杂性。经过了细心的调试和排错解决了绝大部分的问题。

但几乎每一个计算机程序都会有这样那样的不足,尤其是未经过精心维护的非商业软件。即使是作为操作系统的各种版本的Windows也时常会发生许多类型的错误和漏洞。本游戏程序对于初涉此领域的毕业设计课题来说,尤其在开始初期,感觉逻辑复杂,难以控制,因此至今还有一些未能解决的bug。 目前发现的bug和未完善的功能列表如下:

1、敌人的人工智能变化较少,不够理想。

2、子弹和敌人经常会与画面的刷新的线程不同步,造成画面闪烁。

3、 由于每次子弹发射和每次坦克的移动的一个像素都会对所有坦克和所有子弹进行一次循环检查,并由于同时开的线程比较多,使得本来运行效率就不高的JVM运行异常缓慢。即使刷屏没有间隔也不会提高速度。尤其在坦克比较多,炮弹比较多情况下尤为明显。

4、有的时候开始LOGO不能正常显示。 已经解决的重要bug:

1、当发出子弹到达边界并同时还在草丛中时会抛出数组边界异常。 2、有时会莫名其妙的死机。

本科期间做过很多课程设计,大多规模很小。在各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间做过银行取款机、图书馆管理程序等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。大家作品的最终结果都离不开同一个模式。相比一些数据库软件,游戏的设计有很多人情色彩和艺术思想的发挥,正式商业的软件的人性化界面和各个游戏间迥异的结构每每会让人有去开发的冲动。

游戏程序最大限度的利用了硬件条件,因此展现出的画面往往多彩绚丽、效果惊

辽宁科技大学毕业设计(论文) 第27页

人。成功的游戏融合了三维运算、人工智能、音效处理等计算机多媒体的精华部分。本毕业设计建立在Java平台上,是本人以前未曾接触过的领域。凭着探索新知识的热情,我选择了该设计题目。

学习该平台背景和功能的时间远远超出了我想象的时间。在设计初期,为了画出一个简单的图形,需要花费一天的时间,为了使图形产生动态效果又会花费几天的努力。很多相关的技术,如需要使用到的线程、设计模式、Game包的新功能、高级、低级图形界面的使用、时钟的控制、贴图,每一项都需要花一定的时间去掌握和熟悉。更为困难的是,JAVA虽然是现在的主流技术,但是其应用主要形成在WEB开发领域,GUI的开发还是相对较少的,参考资料不是很多,在发觉中文资料的稀少后,为了进一步探索深层次的技巧,我花费了大量时间在sun的Java主页上,阅读了几十篇英文的技巧和代码样例。并经常在各大论坛出没提出遇到的问题。

在终于可以照猫画虎的写出一小段动画的代码时,已经过去了相当长的准备时间。我原以为这样的速度将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的游戏思路的设计就显得不是最大的障碍了。指导老师说Java的上手比较困难,需要配置的环境和掌握的背景比较多。现在看来的确是这样。

我在一星期内写了1500行代码,经过了几百次的调试,终于完成了现在的程序。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。

本程序打包后体积6M多,运行时如进行gc()内存回收可将运行时堆内存控制在50K以内,然而,回首80年代的红白机上的坦克大战原始游戏,将惊叹那样的商业软件的巧夺天工。华丽的界面,出色的人工智能,流畅的运行效果、多音效、双人操作控制,其二进制程序体积仅仅为24K。运行在12MHz,8K内存的硬件机器上仍不失流畅性和可玩性。而许多游戏程序需要大量的运行内存空间、1GMHz以上的处理器,仍运行不够流畅。机器代码级和基于虚拟机的半解释性处理的程序在这里得到了最大的对比。

辽宁科技大学毕业设计(论文) 第28页

致谢

首先感谢我的指导老师吴涛,他在我的毕业设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新兴的技术。并且经常联系我给我的设计提出了许多宝贵的意见。此外还要感谢刘健老师,她在我设计末期给我提出了许多宝贵的建议,为我完善本次设计起到了非常关键的作用。

感谢答辩组对本毕业设计的考核,如果可以得到专家的认可将对我的学习和工作给予极大的鼓励。你们客观的评价和建议我将牢记在心,在今后的发展中扬长避短,更加努力的严格要求自己。

感谢父亲在设计中对我的督促、鼓励和母亲为我创造的安静环境,家人的支持永远是个人发展的基石。

本科学习中的各科老师对提高我的编程素质有很大的帮助,我的同学在设计完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。

辽宁科技大学毕业设计(论文) 第29页

参考文献

[1] Joshua Bloce著. 潘爱民译. Effective Java中文版[M].机械工业出版社.2004年7月第4版. 220~276页.

[2] 耿祥义,张跃平.Java2实用教程(第三版)[M]. 清华大学出版社.2006年.368~390页.

[3] Bruce Eckel.侯捷译.Java编程思想[M].机械工业出版社出版社.2005年3月第1版.86~194页.

[4] 阎宏. Java与模式.电子工业出版社[M].2008年.64-88页.127~234页 [5] Bryan Basham,Kathy Sierrs & Bert Bates writes.Head First Servlets &

JSP[M].O’Reilly Media,Inc,2006,30-193页.

辽宁科技大学毕业设计(论文) 第30页

附录A

What's New in the J2ME Wireless Toolkit 2.2 by Jonathan Knudsen June 2004

The award-winning J2ME Wireless Toolkit has become the de facto standard toolkit for developing applications for Java 2, Micro Edition (J2ME). Since its debut in 2000, the toolkit has evolved to keep pace with the rapidly changing face of mobile Java technology. Don't be misled by the small change in version number from 2.1. The new toolkit supports new optional APIs specified through the Java Community Process (JCP) in four vital areas: 3D graphics, multimedia messaging, Bluetooth networking, and data management. In this article I'll describe these new APIs and show you how they're implemented in the toolkit.

Before I do, take a moment to admire the updated DefaultColorPhone emulator skin. Since version 2.1, this skin has gotten a larger screen (320 x 240, or QVGA) and far more colors (4096 instead of 256).

Mobile 3D Graphics

JSR 184, the Mobile 3D Graphics API for J2ME (M3G), provides three-dimensional graphics functionality in a compact package that's appropriate for devices that support the most widely adopted J2ME software stack, the Connected, Limited Device Configuration (CLDC) and the Mobile Information Device Profile (MIDP). The API provides two APIs for displaying 3D content. The immediate mode API makes it possible for applications to create and manipulate 3D elements directly. On top of this layer is a scene graph API, also called retained mode, that makes it possible to load and display entire 3D scenes you've designed ahead of time. Applications may use whichever API is most appropriate, or a combination of retained mode and immediate mode. The JSR 184 specification also defines a file format for scene graphs, .m3g.

The toolkit's emulator fully supports JSR 184 and you'll find several MIDlets that show off the API's capabilities in the Demo3D project.

Life3D demonstrates the use of immediate mode:

辽宁科技大学毕业设计(论文) 第31页

PogoRoo is an interactive demonstration that features a bouncing kangaroo: Finally, retainedmode shows how to load and render a scene graph file: Multimedia Messaging

The J2ME Wireless Toolkit has long supported JSR 120, version 1.1 of the Wireless Messaging API (WMA); the new release supports WMA 2.0 (JSR 205), which expands WMA's capabilities to include Multimedia Messaging.

In the toolkit, messaging takes place in a simulated environment. If you run the emulator multiple times, applications on the emulators can communicate with each other, and you can use the toolkit's handy WMA Console utility to exchange messages with the applications in the same environment. Messages may conform to any of three standard protocols: Short Message Service (SMS), Cell Broadcast Service (CBS), or - new in version 2.2 of the toolkit - Multimedia Messaging Service (MMS).

You can address MMS messages and add any collection of files to the message. Furthermore, the network monitor now displays MMS messages that are sent or received by the emulator.

Bluetooth and OBEX

The J2ME Wireless Toolkit emulator supports JSR 82, the Java APIs for Bluetooth, which includes two independent APIs:

The Bluetooth API provides an interface to Bluetooth wireless networking, including device discovery and data exchange.

The OBEX API allows applications to use the Object Exchange (OBEX) protocol over Bluetooth or other communication channels.

The toolkit allows you to develop and test applications that use Bluetooth technology even if you don't have any actual Bluetooth hardware. The toolkit simulates a Bluetooth environment, in which you can run multiple emulator instances that can discover each other and exchange data using the Bluetooth API.

An example application, BluetoothDemo, shows how to transfer imagesfrom one emulator to another.

辽宁科技大学毕业设计(论文) 第32页

The J2ME Wireless Toolkit implements OBEX transfer over simulated Bluetooth and infrared connections. The simulated infrared connection

follows the IrDA standard defined by the Infrared Data Association. The toolkit simulates infrared transfers between multiple running emulators.

You can configure the Bluetooth and OBEX environment using the Bluetooth/OBEX tab in the toolkit preferences. This controls such

parameters as how long the emulator attempts to discover other devices in the simulated Bluetooth environment and the maximum packet size. See the toolkit's User's Guide for more details.

Local Files and Personal Information

The J2ME Wireless Toolkit supports JSR 75, the PDA Optional Packages for the J2ME Platform, which also includes two independent APIs:

The FileConnection API gives MIDlets access to a local file system on the device. The Personal Information Management (PIM) optional package includes APIs for manipulating contact lists, calendars, and to-do lists.

A real device may have a local file system which can be accessed using the FileConnection API. In the J2ME Wireless Toolkit emulator, a simulated file system is maintained as a directory on your hard disk.

The files your application can access using FileConnection are stored in

subdirectories of \\appdb\\\\filesystem., where is the installation directory of the J2ME Wireless Toolkit and is the name of the emulator skin. For example, the DefaultColorPhone emulator skin comes with a root directory installed called root1, which contains a file called Readme. The file's full path is \\appdb\\DefaultColorPhone\\filesystem\\root1\\Readme.

You can manage the root directories that are available by choosing MIDlet > External events from the emulator window's menu. You'll see a small utility window for adding and removing roots. These actions will also generate events for a registered listener object.

In a real device, personal information might be stored in a proprietary format in memory. The emulator uses a directory on your hard disk to

辽宁科技大学毕业设计(论文) 第33页

contain this information, accessible using the PIM API. All information is stored in \\appdb\\pim. Lists are stored in subdirectories of the contacts, events, and todo directories. For example, a contact list called Contacts is contained in \\ appdb\\ pim\\ contacts\\ Contacts.

Inside the list directory, items are stored in standard formats specified by the Internet Mail Consortium. Contacts are stored in vCard format, while calendar and to-do items are both stored in vCalendar format.

Summary

The J2ME Wireless Toolkit 2.2 is much more than an incremental update of an excellent tool. It includes support for four exciting new

specifications that together define six new APIs. As the world of wireless Java technology rapidly evolves, the J2ME Wireless Toolkit keeps pace and contains all the tools you need for

About the Author: Jonathan Knudsen [e-mail] [home page] is the author of several books, including Wireless Java (second edition), The Unofficial Guide to LEGO MINDSTORMS Robots, Learning Java (second edition), and Java 2D Graphics. Jonathan has written extensively about Java and Lego robots, including articles for JavaWorld, EXE, NZZ Folio, and the O'Reilly Network. Jonathan holds a degree in mechanical engineering from Princeton University.

辽宁科技大学毕业设计(论文) 第34页

附录B

J2ME Wireless Toolkit 2.2 新改进 作者:Jonathan Knudsen 2004 年 6 月

屡获殊荣的 J2ME Wireless Toolkit 已经成为 J2ME 开发应用程序的事实标准工具包。自从 2000 年初次亮相以来,该工具包一直在发展以赶上移动 Java 技术外观上快速改变的步伐。不要被从 2.1 版本以来的小改变所误导。新的工具包在四个重要的领域支持 Java Community Process (JCP) 所指定的新的可选 API:3D 图形、多媒体通信、蓝牙连网(Bluetooth networking)和数据管理。本文将描述这些新的 API 并且向您展示如何在工具包中实现他们。

在这之前,让我们赞美一下更新后的 DefaultColorPhone 模拟器皮肤,自从 2.1 版本以来,该皮肤已有了一个更大的屏幕(320 x 240, 或 QVGA)和更多的颜色(4096 色而不是 256 色)。

移动 3D 图形

JSR 184, 即 Mobile 3D 图形 API for J2ME (M3G) 在一个集成软件包中提供了三维图形功能,适用于支持最为广泛采用的 J2ME 软件栈、有限连接设备配置(CLDC)和移动信息设备描述(MIDP)的设备。API 为显示 3D 内容提供了两种 API。立即模式 API 使应用程序能够直接创建和操纵 3D 元素。这一层之上是一个场景图 API,也称为保留模式,能够提早加载并显示已设计的整个 3D 场景。应用程序可以采用最适合的 API,或保留模式与立即模式的组合。JSR 184 规范还为场景图定义了一种文件格式-.m3g。

该工具包的模拟器全面支持 JSR 184,并且有几个 MIDlet 展示了 API 在 Demo3D 项目中的功能。Life3D 演示了立即模式的使用。PogoRoo 是一个的交互的演示,特点是显示一只跳跃的袋鼠:

多媒体通信

J2ME Wireless Toolkit 长期支持 JSR 120、Wireless Messaging API(WMA)的1.1版本;新版本支持 WMA 2.0(JSR 205),其把 WMA 的功能扩展到包括多媒体通信。

辽宁科技大学毕业设计(论文) 第35页

在工具包中,通信发生于模拟的环境中。如果多次运行模拟器,模拟器上的应用程序能够相互通信,并且可以使用工具包方便的 WMA Console 实用程序在同一环境中与应用程序交换消息。通信可以遵照以下三种标准协议之一:短消息服务(Short Message Service,SMS)、蜂窝广播服务(Cell Broadcast Service,CBS)或工具包 2.2 版本中的新协议-多媒体通信服务(MMS)。

您可以标记 MMS 消息,并向消息添加任何文件集合。

而且,现在网络监视器能够显示模拟器发送或接收的 MMS 消息。 蓝牙和 OBEX

J2ME Wireless Toolkit 模拟器支持 JSR 82,即 Java API for Bluetooth,包括两个独立的 API:

蓝牙 API 为蓝牙无线网络提供了接口,包括设备恢复和数据交换。 OBEX API 允许应用程序在蓝牙或其他通信信道上使用对象交换(Object Exchange,OBEX)协议。

该工具包允许在即使没有实际蓝牙硬件的情况下,也可以开发和测试采用蓝牙技术的应用程序。该工具包模拟蓝牙环境,您可以在该环境中运行可相互发现的多个模拟器实例和使用蓝牙 API 交换数据。

应用程序实例 BluetoothDemo 显示了如何从一个模拟器将图像传输到另一个模拟器。

J2ME Wireless Toolkit 通过模拟的蓝牙和红外连接上实现 OBEX 传输。模拟的红外连接遵循 Infrared Data Association 定义的 IrDA 标准。工具包在多个运行的模拟器之间模拟红外传输。

您可以使用工具包参数中的 Bluetooth/OBEX 标签来配置蓝牙和 OBEX 环境。其控制了诸如模拟器在模拟的蓝牙环境中试图用多长时间去发现其他设备,以及最大数据包大小等参数。请参见工具包的用户指南获取更多的详细信息。

本地文件和个人信息

J2ME Wireless Toolkit 支持 JSR 75,即 PDA Optional Packages for the J2ME Platform,它也包括两个独立的 API:

FileConnection API 提供了 MIDlet 对设备上本地文件系统的访问。

Personal Information Management (PIM) 可选软件包包括用于操纵联系人列表、

辽宁科技大学毕业设计(论文) 第36页

日程安排和计划列表的 API。

一台真实的设备可能有一个能通过使用 FileConnection API 访问的本地文件系统。在 J2ME Wireless Toolkit 模拟器中,模拟的文件系统作为硬盘上的一个目录存在。

应用程序使用 FileConnection 可访问的文件都存放在子目录

\\appdb\\\\filesystem.中,此处 是 J2ME Wireless Toolkit 的安装目录, 是模拟器皮肤的名称。例如,DefaultColorPhone 模拟器皮肤随安装根目录 root1 而产生,包含一个 Readme 文件。文件的完整路径为\\appdb\\DefaultColorPhone\\filesystem\\root1\\Readme。

您可以从模拟器窗口的菜单种选择 MIDlet > External events 来管理可用的根目录。您将看到一个添加和删除根目录的小的实用程序窗口。这些操作也将为 registered listener 对象生成事件。

在真实的设备上,个人信息可能以专有格式存储在内存中。模拟器使用硬盘中的一个目录来存放这些信息,可使用 PIM API 来访问。所有的信息存储在

\\appdb\\pim 目录中。列表存储在联系人、事件和计划目录的子目录中。例如,联系人列表 Contacts 位于 \\appdb\\pim\\contacts\\Contacts 目录中。

在列表目录内,列表项以 Internet Mail Consortium 指定的标准格式存储。联系人以 vCard 格式存储,日历和计划项都以 vCalendar 格式存储。

结束语

J2ME Wireless Toolkit 2.2 不仅仅是一个出色工具的增量更新。它包括了对令人激动的四项新规范的支持,同时定义了六种新的 API。随着无线 Java 技术世界的快速发展,J2ME Wireless Toolkit 紧紧跟随发展的步伐并且包含您所需的全部工具。

关于作者

Jonathan Knudsen[电子邮件] [主页],有多本著作,包括:Wireless Java (second edition)、The Unofficial Guide to LEGO MINDSTORMS Robots、Learning Java (second edition) 和 Java 2D Graphics 。Jonathan 在 Java 和 Lego 机器人领域编写了大量的文章,包括 JavaWorld、 EXE、 NZZ Folio 和 the O'Reilly Network 方面的文章。作者拥有普林斯顿大学的机械工程学位。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务