当前位置:文档之家› 计算机毕业论文 游戏

计算机毕业论文 游戏

手持设备上网络游戏“贪食蛇”的实现

摘要

J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案。Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。Java语言面向对象的优势也使得游戏开发变得更容易。

随着手机的日益普及,以及手机性能的不断攀升。移动游戏潜在的市场比其它任何游戏平台都要大。本论文着眼于J2ME技术的应用,利用MIDP 2.0提供的强大的游戏开发能力,开发一款可商用的手机游戏程序——贪食蛇。本程序通过函数重载,既实现了无线网络对战的要求也实现了进行单人游戏的功能。游戏加入了难度调整,游戏纪录的存储以及实现了游戏背景音乐的播放,大大增强了游戏的娱乐性和互动性。游戏提供了良好的界面,游戏Logo,游戏帮助,一应俱全,背景音乐可以随时暂停或开启,游戏可以随时暂停和继续,实现了更为人性化的要求。

本论文介绍了基于移动平台的Java无线网络游戏开发须具备的基础知识和高级技巧,包括无线游戏的发展前景,主要开发工具的使用,J2ME的相关技术及本程序的结构分析和具体功能的实现等。

关键词:J2ME 贪食蛇网络

Handheld devices on the realization of online

games‖GreedSnake‖

ABSTRACT

J2ME 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. Java characteristics of a good cross-platform in the development of the mobile platform to display a great power. Java language of the advantages of object-oriented development also makes the game much easier.

With the growing popularity of mobile phones, mobile phones and properties of rising. Mobile gaming market potential than any other gaming platforms to major. The papers focus on J2ME technology applications, using MIDP 2.0 provide a powerful game development capabilities, the development of a commercial mobile phone can Games - GreedSnake.Heavy function through this process, we achieved a wireless network Versus the requirements for achieving a single-player features.The difficulty of adjusting to join the game, played records storage and the realization of the game background music player, greatly increased the game's entertainment and interactive.Games provide a good interface, games Logo, to help the game, background music can be suspended at any time or open, games and continue to be suspended at any time, achieving a more humane requirements.

This paper introduced the Java platform-based mobile wireless network game development should have the basic knowledge and advanced skills, including the prospects for the development of wireless games, mainly the use of development tools, J2ME and the relevant technical analysis of the structure of the procedures and specific functions of the realization of And so on.

Key Words:J2ME GreedSnake Network

目录

第一章绪论 (1)

1.1手机游戏现状 (1)

1.2J2ME概述 (1)

1.3移动游戏开发与传统游戏开发的区别 (2)

1.4开发手机游戏的优点 (3)

1.5手机设备的缺点 (3)

1.6本课题实现的意义 (4)

第二章开发环境及相关技术的介绍 (5)

2.1系统分析概述 (5)

2.2系统初步调查 (5)

2.3系统的可行性分析 (5)

2.4J AVA语言特点 (6)

2.5系统的运行环境和开发平台 (6)

2.6.1硬件设备 (6)

2.6.2系统开发平台 (7)

2.6.3关于NetBeans (7)

2.6.4关于Wireless Toolkit (7)

2.6.5MIDP应用程序 (8)

第三章手机游戏―贪食蛇‖的功能分析和设计 (10)

3.1手机游戏“贪食蛇”的总体设计 (10)

3.1.1总体设计 (10)

3.1.2程序流程 (10)

3.2本程序需要解决的主要技术问题 (11)

3.3程序中的几项技术 (12)

3.3.1Canvas类 (12)

3.3.2 Graphics类 (12)

3.3.3使用Socket开发MIDP无线连网游戏 (13)

3.3.4 RMS数据库系统 (13)

3.4PNG图片格式 (14)

3.5内存的优化技术 (14)

3.6混淆器(O BFUSCATOR)的使用 (15)

第四章程序分析和具体实现 (16)

4.1游戏的开始菜单 (16)

4.2F OOD类 (17)

4.3主游戏逻辑及G AME类 (19)

4.3.1地图的创建 (19)

4.3.2 Game类的单人游戏构造函数 (19)

4.3.3 Game类的无线网络对战的构造函数 (21)

4.3.4游戏的碰撞检测 (21)

4.3.5游戏背景音乐的实现 (22)

4.3.6游戏计分牌的实现及游戏结束的评分 (23)

4.4无线网络对战的实现 (25)

4.5记录系统——高分榜 (28)

第五章系统测试与安装 (30)

5.1打包测试的过程 (30)

5.2游戏测试 (31)

5.2.1主菜单界面 (31)

5.2.2单人游戏 (32)

5.2.3无线网络对战 (34)

5.3帮助 (37)

结束语 (38)

参考文献 (39)

致谢 (58)

英文资料 (59)

中文译文 (65)

第一章绪论

1.1手机游戏现状

在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。

截至2007年12月,全国手机用户数达5.47286亿户,手机普及率为41.6%[1],成为世界上最大的手机使用国。通过中国庞大的手机用户群体,移动游戏在中国未来市场有着巨大的发展前景。

在国外,手机游戏正在处在一个快速发展的时期。在欧洲,已经初步形成了一个规模达数10亿美元的行业市场,在2008年,北美市场规模预期将超越10亿美元大关。

但是传统手机存在以下弊端:

传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。

而Java技术在无线应用方面的优势非常明显:

1. 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。

2. Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。

基于以上分析,Java手机将是未来手机的发展方向,是业界的热点。由Java/J2ME技术构建的可下载游戏不仅使手机游戏可以更为轻易地吸引到用户的兴趣,同时也有利于创造更为多样化的计费形式[2]。

1.2J2ME概述

Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、J2ME以及JavaCard(其结构示意图见图1.1)。越在同心圆外部的Java版本,所支持的核心类库就越完整,所支持的Java基本数据类型就越完整[3]。

其中J2ME定位在消费性电子产品的应用上。这个版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力[4]。

图1.1 Java平台的结构

J2ME平台由多种配置(Configuration)、简表(Profile)和可选包(Optional Package)组成。J2ME平台主要包含两个配置:Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。为了给目标设备提供完整的运行环境,配置必须和简表(Profile)组合。简表位于配置之上,为运行环境提供高层的API,例如应用程序模型和图形用户界面等。目前,CLDC上采用的最广泛的简表是移动信息设备简表(Mobile Information Device Profile,MIDP)。基于CLDC与MIDP的J2ME平台主要面对的目标设备是移动电话。

J2ME平台可以通过添加可选包(Optional Package)进行扩展,可选包是针对特殊的技术的实现,因此它是定位的是特定范围的设备,而不是和作为一项特定定义在MIDP中。比较常见的可选包有无线消息API(Wireless Message API,JSR120)、移动多媒体API(Mobile Media API,JSR135)和WEB服务API(Web Service API,JSR172)等等。随着移动终端设备内存和处理能力的提高,越来越多的可选包被添加到具体的J2ME平台上[5]。

1.3移动游戏开发与传统游戏开发的区别

1、开发团队的大小

传统的PC和控制台游戏一般需要12到30人的开发团队。因为大部分移动游戏规模比控制台游戏小,所以一般情况下只需要3到5人的团队开发,有的时候甚至设计者和编程者是同一个人。

2、开发周期

传统的游戏一般要开发两到三年。而大部分移动游戏几月之内就能开发完毕。换句话说,只要有一个小型开发团队和一个小的预算,你就可以开发并推广一个专业品质的移动游戏。因此,对于许多在传统游戏领域遇到挫折的开发者来说,移动游戏开发有很强的吸引力。

3、网络设备

移动游戏可能不同于我们之前看到的任何游戏:它受载体因素的限制,但是支持网络并且可多人游戏。移动电话的特性决定它是一种网络设备。即使它们的处理能力使人想起以前的老式计算机技术,但是它们的网络性能却更加出众。

4、部署

传统的游戏主要是在软件市场上购买。而移动游戏主要是由用户从移动门户网站下载并安装。在有些情况下,它们是通过无线网络下载的。有些手机允许你下载一个应用程序到计算机中,然后通过数据线传送到手机中。

1.4开发手机游戏的优点

1、庞大的潜在用户群

现在全球数十亿部移动电话正在被使用,并且这个数目正在逐渐增加。移动游戏潜在的市场比其它任何平台,比如Playstation3和XBOX360都要大。

2、便携性

NDSL比任何其他控制台游戏卖出的多的一个原因就是:便携性。人们可以随时随地玩他们选择的游戏。与现在的游戏控制台或者个人电脑相比,手机可能不是一个好的游戏设备,但是人们基本上是随时随刻都把它们带在身边。在他们离开家的时候或者想玩的时候,开发者应该为他们提供好玩的游戏。

3、支持网络

因为移动电话是网络设备,拥有无线通讯技术f,所以可以轻松实现多人游戏。满足大家共同娱乐。

1.5手机设备的缺点

1. 屏幕小

虽然手机屏幕的分辨率持续提高,并且彩屏已经成为标准,但是屏幕尺寸依然很小,毕竟我们没有人乐意拿着砖块一样大的手机。另外,不同手机的屏幕大小有差异,而用户总是希望使用自己特定的手机上所有可用的屏幕空间,这样开发者不可避免需要为不同的手机移植优化同一款游戏。

2. 应用程序大小限制

虽然在一些新款智能手机上可以运行几兆字节的应用程序,但大部分手机只有很小的内存空间供应用程序使用。此外,对可运行的应用程序的大小还有来自运营商的其他限制。

3. 等待时间长

等待时间(机器发出请求和接到响应之间所花费的时间)在计算机上是以微秒计算;在有线因特网上是以毫秒计算;而在无线网络上则要以秒计算。等待时间长是网络游戏中一直存在的一个问题。无线网络等待时间过长,就导致无法有效地开发多人快速动作游戏;然而基于回合制的多人游戏却是可行的。

还有一种特殊情况,使用蓝牙技术或其他无线局域网技术的手机可以和附近的蓝牙设备在因特网等待时间下(一般200ms~400ms)通信。这样,使用具备该功能的智能手机,用户就可以和附近的移动用户一起玩多人快速动作游戏了。

4. 可中断性是关键

当需要接听或拨打电话时,我们通常会中断进行中的游戏,游戏程序必须能够暂停和继续。这样的暂停既不能造成游戏问题(例如,游戏者在打电话的时候老怪仍然在移动,打死玩家扮演的角色,导致玩家输掉游戏),也不可以导致内存溢出。这些都是开发者需要在设计时给予充分考虑的问题。

1.6本课题实现的意义

手持设备上的游戏拥有庞大的用户群体,现在全球有十几亿部移动电话正在被使用,并且这个数目还在不断增加。在许多国家,拥有手机的人数比拥有计算机的人数更多。手持移动游戏潜在的市场比其它任何平台都要大得多。由于手机游戏良好的便携型,可以让用户在打发在旅途中和等人等车时候的无聊时间进行游戏,因此人们可以随时随地玩他们选择的游戏,不受地域限制是手机游戏相比电脑最大的优势。因此过于复杂和耗时过长的游戏并不是手持设备未来的发展方向,用户需要随时可以开始和停止游戏,简单而充满乐趣的游戏才是最受手持设备用的青睐的游戏。

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

2.1系统分析概述

系统分析是程序开发过程中的第一个重要环节,它通常是对系统的内外情况进行调查、研究、分解、剖析,以明确问题或机会所在,认识解决这些问题和把握这些机会的必要性,为确定有关活动的目标和可能的方案提供科学依据。系统分析在整个系统开发过程中,要解决“做什么”的问题,把要解决哪些问题、满足用户哪些具体的信息需求调查并分析清楚,从逻辑上,或者说从信息处理的功能需求上提出系统的逻辑模型,为下一阶段的物理方案设计、解决“怎么做”提供依据[6]。

2.2系统初步调查

本题目为手持设备上游戏“贪吃蛇”的实现,系统初步调查采取的主要方式是通过互联网,手机下载各种手机JAVA游戏,了解各个手机游戏的优缺点。根据初步调查了解到以下基本情况:

现在手机上的各种游戏非常多,其基本结构是先进入Logo界面。然后进入开始菜单让用户进行选择,开始游戏,高分榜,调整游戏难度等级,游戏帮助等等。

如今手机成为一种快捷、经济的现代通信技术手段。手机游戏又成为人们最普遍的娱乐工具。但人们迟早要打电话或者接电话,并且他们不想把所有的电量都用来玩游戏。理想的情况是每一回合游戏应该保持在五到十分钟或更短时间之内。

2.3系统的可行性分析

本题目开发的是手持设备上的无线网络游戏“贪吃蛇”,主要完成无线手机游戏的基本功能,包括单人游戏,游戏的难度等级调整,游戏的暂停恢复,游戏的最高分纪录,游戏背景音乐的加入,无线网络对战的实现。

其开发的目的是,设计实现一个具有个性化及良好交互性,并具有较高实现执行效率的手机游戏。现有的J2ME开发环境经非常成熟,无论是从软件方面还是硬件方面。现有技术都可以胜任开发一套较为完善的系统来。

经过对无线手机游戏的详细调查,根据系统规模,对软件开发中将要面临的问题及其解决方案进行初步设计以及合理安排。

2.4Java语言特点

1. 平台无关性

Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。Java的数据类型与机器无关。

2. 安全性

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

3. 面向对象

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

4. 分布式

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

5. 健壮性

Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。通过集成的面向对象异常处理机制,在编译时,Java提示出可能出现但未被处理的异常,帮助程序员正确地进行选择以防止系统崩溃。

6. 多线程

多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计这可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。

7. 动态性

Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且,Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。

2.5系统的运行环境和开发平台

2.6.1硬件设备

测试手机需要支持JA V A应用程序,支持CLDC1.1和MIDP2.0,支持MIDI音乐播放。彩色屏幕。硬件需要对多线程提供良好支持,支持无线网络连接。

测试手机Nokia6300对上述功能提供了良好支持。

2.6.2系统开发平台

电脑配置:CPU: AMD3000+ 内存:256M 硬盘:40G

操作系统:Microsoft Windows XP

程序语言:Java 2

开发包:Java(TM) 2 Standard Edition (6.0)

Sun Micro. J2ME

Wireless Tool Kit 2.5.2

IDE: NetBeans 6.0.1

测试手机:nokia6300

2.6.3关于NetBeans

NetBeans IDE 是一个为软件开发者提供的自由、开源的集成开发环境。您可以从中获得您所需要的所有工具,用Java、C/C++ 甚至是Ruby 来创建专业的桌面应用程序、企业应用程序、web 和移动应用程序。此IDE 可以在多种平台上运行,包括Windows、Linux、Mac OS X 以及Solaris;它易于安装且非常方便使用。

NetBeans最新版NetBeans IDE 6.1版本提供了几种新功能和一些功能的增强。提供了强大的JavaScript编辑功能,支持使用Sping的WEB框架,并加强了与MySQL的整合,便NetBeans 比较方便的使用MySQL数据库,NetBeans 6.1增强了性能,启动速度提升40%。在建立一个大工程时,有较低的内存消耗和更快的响应速度。

NetBeans以它的高集成度,人性化的界面,以及逐步增强的功能,已经得到越来越多的开发者的支持。

2.6.4关于Wireless Toolkit

WTK(Wireless Toolkit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。界面如图2.1所示

图2.1 WTK界面

Sun Java(TM) Wireless Toolkit 的目录结构见表2.1。

表2.1 Sun Java(TM) Wireless Toolkit的安装目录

2.6.5MIDP应用程序

MIDP应用程序是指遵循由应用程序主体(Jar文件)和应用程序描述文件(Jad文件)组成。按部署方式可分OTA和非OTA两种。

MIDlet:是Jave一个类,扩展了javax.microediton.midlet.MIDlet抽象类。MIDlet生命周期分3种状态:运行状态,暂停状态,销毁状态等。

MIDP2.0将OTA(Over The Air)预配置规范加入进来,确保了应用程序分发机制可以适用于所有设备,同时还定义了移动信息设备上的应用程序管理需求。图2.2显示的是MIDP 2.0图形用户界面接口结构

图2.2 MIDP 2.0图形用户界面接口结构

随着今后MIDP 3.0的推出,手持设备的性能还将大幅提高,手机游戏开发将更加便捷,游戏制作更加精良。

第三章手机游戏“贪食蛇”的功能分析和设计

3.1手机游戏“贪食蛇”的总体设计

总体设计的基本目的是解决系统如何实现这个问题,因此系统设计又称为概要设计。总体设计是系统开发过程中关键的一步,下面将对系统进行总体设计。

3.1.1总体设计

本系统在主菜单界面上采用Screen类提供的高级界面。游戏界面采用Canvas类提供的低级界面开发,无线网络对战使用Socket编程的方法,实现客户机端与服务器端之间进行通信。

Screen是高级图形用户界面,从Screen派生的如TextBox,List,Form不需要我们自己绘制,只需制定合适的参数,系统就会将标题、文本框、滚动条等自动绘制出来。在绘制开始菜单等界面上满足了实际的需求,同时实现了很大的便捷。

Canvas则正好相反,它是一个低级图形用户界面,在手机界面大小的范围内,我们可以控制任意像素的绘制,显示效果完全取决于我们设计的代码,这在游戏的开发中是必不可少的。

Socket原先是Unix系统中的概念,后来在网络编成中广泛应用。在用J2ME进行手机游戏开发中,将Socket类和ServerSocket类分别用于Client端和Server端,在任意两台机器间建立连接。

3.1.2程序流程

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状态[7]。

图3.1 Midlet流程

值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。

本程序运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。在程序运行的主线程中,画面刷新将以一定的频率对屏幕重绘,实时反映整个游戏的进行状态。在Player线程中开启游戏背景音乐。

游戏开始后先绘制地图,并将各个对象初始化。游戏中的普通食物设置为初始显示isShow = true,而奖励食物设置为初始不显示isShow = false,当用户达到奖励食物的出现条件时再设置isShow = true,予以显示。在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。如:设是否与屏幕边缘、食物以及自身相撞、屏幕上相关信息的绘制等。

如果选择无线双人对战,还需要对对方的得分进行实时的传送与显示,以及对最终的胜负进行判断。Client类与Server类分别对应客户机与服务器,Sender类负责对客户机与服务期间传送数据。

程序为需要完成独立功能的模块还设置了其他单独的类。splashScreen类负责显示初始载入画面,Food类实现食物的显示。

3.2本程序需要解决的主要技术问题

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

2. 游戏中为了美观,提高游戏性,可能需要采用外部文件引入的图片贴图,以及MID背

景音乐。背景音乐可以根据用户的需要随时进行开启和关闭。游戏的开始信息画面也是吸引用户的重要部分。

3. 为了满足游戏的需要,游戏需要加入难度调整的功能,根据选择难度的不同,蛇的移动速度需要进行相应的调整,以增强游戏的挑战性。

4. 游戏需要进行实时的得分计算,蛇每吃到一个食物进行加分,每得到一定的分数,还会出现奖励食物,吃到的加分会更多。游戏的结尾会对用户的最终得分加以显示。

5. 蛇每吃到一个食物,就会在地图上在生成一个新食物,新食物的生成不应与蛇的位置相重叠,缺乏真实感。所以每一次生成新食物都需要进行相关的碰撞检测。

6. 以无线网络进行双人对战时,需要在屏幕上显示自己和对方的当前得分,在游戏结束时,需要根据双方的得分进行判断胜负,并在屏幕上显示双方的胜负结果。

7. 游戏需要建立高分榜,将用户打出的最高分加以保存,可以随时察看游戏的最高分,以增强游戏的挑战性。记录分数的存储方式也需要有较好的解决方案。手机中由于处理器和内存空间、存储空间都十分有限,其数据库系统与普通PC大相径庭。其数据库结构较为简单,被称之为RMS系统。

8. Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。

以上相关技术细节和整体流程将分别在以下小节阐述。

3.3程序中的几项技术

3.3.1Canvas类

Canvas是MIDP提供的低级用户界面类。和高级用户界面相比,Canvas拥有更大的灵活性。由于Canvas不提供任何现成的可视化组件,所有在Canvas显示的图形和文本都必须通过Graphics绘制出来。因此,开发人员可以完全获得界面控制能力,能精确控制每一个像素的位置,在游戏开发中,这是必不可少的。Canvas提供了键盘事件,并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。

3.3.2 Graphics类

Graphics是javax.microedition.lcdui包中用于绘制简单2D图形的类[8]。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制。

文本的绘制是基于定位点操作的。定位点的最大作用就是最小化计算文本绘制位置所需的

工作量。定位点是由三个水平常量(LEFT,HCENTER,RIGHT)和三个垂直常量(BOTTOM,BASELINE,TOP)组合而成的,组合的方式按照“或”操作。数字玲也可以做定位点的值,它代表的组合方式是TOP|LEFT。在Graphics中还定义了一个垂直常量VCENTER,但是它不能用于绘制文本。一般认为文本的垂直居中没有意义,而且也很难实现[9]。

但是VCENTER可以用于绘制图片的drawImage()方法[10]。绘制图片的方法与文本非常类似,不同的是由于图片没有基线(baseline)的概念,因此在绘制图片时不能使用BASELINE 常量。

3.3.3使用Socket开发MIDP无线连网游戏

MIDP2.0(JSR 118)增加了对TCP/IP和UDP协议的支持。可以使用Socket开发联网游戏,MIDP2.0规范并没有规定设备必须支持Socket,因此在使用之前应该参考设备规范看其是否支持Socket通信[11]。

MIDP2.0增加了下面两个接口来支持基于IP的Socket网络编程:

javax.microedition.io.SocketConnection

javax.microedition.io.ServerSocketConnection

Socket类用在用户端,用户构造一个Socket类可以建立与服务器的连接。Socket类的构造方法有四种:

●Socket(String,int)构造一个连接指定主机、指定端口的流Socket。

●Socket(String,int,boolean)构造一个连接指定主机、指定端口的Socket类,boolean类型

的参数用来设置是流Socket还是数据报Socket。

●Socket(InetAddress,int,boolean)构造一个连接指定Internet地址、指定端口的流Socket。

●Socket(InetAddress,int,boolean)构造一个连接指定Internet地址、指定端口的Socket类,

boolean类型的参数用来设置是流Socket还是数据报Socket。

构造完Socket类后,就可以通过Socket类建立输入、输出流,通过流来传送数据。

ServerSocket类用在服务器端,接收用户端传送的数据。ServerSocket类的构造方法有两种:

●ServerSocket(int)在指定端口上构造一个ServerSocket类。

●ServerSocket(int,int)在指定端口上构造一个ServerSocket类,并进入监听状态,第二个

int类型的参数是监听时间长度[12]。

3.3.4 RMS数据库系统

MIDP为MIDlets提供了一种永久存储和后来读出数据的数据库解决方案,被称为Record Managerment System(RMS),是一种类简单的基于记录的数据库[13]。

很显然,手机上的数据库系统不可能有PC上的强大功能。微小的存储空间也限制了它们的结构不能过于复杂。RMS是专门针对移动设备的服务的。

RMS包中包括RecordStore类。在一个MIDlet suite包里的所有MIDlet都允许创建多个记

录集,只要它们赋有不同的名称。当MIDlet包从平台中被移除后,所有与该包有关的的记录集都同时会被移除。同一个包内的MIDlets可以直接互相访问它们的记录集,不同包内也可产生共享,但这需要有包的授权属性决定。访问模式会在准备提供共享的RecordStore被建立时被创建。访问模式允许私有使用或访问。

记录是字节数组。开发者可以利用InputStream的派生类DataInputStream、DataOutputStream 以及ByteArrayInputStream、ByteArrayOutputStream将不同种类的数据类型打包,以字节流的形式发送和接收。

区别记录的唯一标记是他们的ID值,作为记录集的主键。第一项记录的ID是1,其后的每个记录ID递增。

Record是以字节为基本单位来存放的,所以所有要写入record的数据都必须先将其转为字节才能写入,从record所读出来的数据也是字节,必须将其转换为原先写入时的数据类型才有意义。

然而读取或写入的字节数组都只能代表一个字段的信息,如果需要读取或写入多个字段就必须要将数据转换成字节信息,并且提供适当的机制来分隔这些信息。

利用输入/输出流

这一种方法较上一种复杂,但是较为实用。方法一中所有的字段只能以字符串的形式存储,要对这些字段作进一步的处理非常麻烦。利用输入输出流可以写入及读取不同数据类型的数据,做法是在写入数据时先将一个DataOutputStream数据流对象串接到一个ByteArrayOutStream数据流对象,然后再依字段的数据类型用writeInt()、writeBoolean()等方法写入,最后把ByteArrayOutputStream内的元素数据写入record中。反之若要读取数据,则先要串接一个DataInputStream对象和ByteArrayInputStream,依字段的数据类用readInt()、readBoolean()等方法读取。

3.4PNG图片格式

PNG(Portable Network Graphics)格式是MIDlet唯一支持的图象格式[14],PNG具体格式由PNG Specification,Version 1.0定义的。PNG格式提供透明背景的图象,这对绘制游戏画面和被操纵主角极有帮助。物体之间重叠时最上层图片也不会覆盖超过其有效象素外的部分。

3.5内存的优化技术

手机内存空间小,所以在程序设计时应该注意以下几点,以尽量减少内存的使用:

?绘图是很占用时间的,所以尽可能的减少Graphics函数的调用

?尽可能的将变量定义在循环以外!

?尽最大可能的进行对需要的数据进行预先计算并将结果保存在缓冲里

?String类很容易产生垃圾内存,尽可能的使用StringBuffer代替String或用final static来定义之

?尽量使用static final修饰函数,而避免synchronized修饰符

?对于频繁调用的函数要使用尽可能少的参数!

?尽可能的使用<<和>>来代替*和/

?与0比较比与其他数值比较快

?局部变量比其他类型的变量运算要快

?在switch()中尽量使用连续的小数值判断

?尽量使用乘法而不使用除法[15]。

3.6混淆器(Obfuscator)的使用

Java 语言并没有完全编译成二进制可执行文件,编译出的.class文件是一种介于源程序和二进制之间的一中基于半解释的字节码,需要虚拟机来执行。它包括了所有的信息。然而这样会导致.class很容易被反编译为源代码,从而不能保护作者的知识成果。目前流行的如decode,JAD等反编译工具可以以很快的速度生成源文件。如果不加以施行有效的措施,将造成严重的后果。

由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的减少变量、函数的命名长度的关系,编译后也会从.class文件中减少这些冗余的信息。混淆后,体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。

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

4.1游戏的开始菜单

每个MIDlet程序都必须有一个主类,该类必须继承自MIDlet。它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。)、结束的函数。

进入游戏首先显示游戏的Logo界面,Logo的显示时间为3秒钟,3秒钟之后游戏便会进入主菜单,或者在Logo显示时按任意键便可进入游戏的主菜单。实现Logo显示的类为splashScreen,由于需要进行倒计时操作,新词需要加入关于时间的接口:java.util.Timer

java.util.TimerTask

并且事先规定默认的等待时间为3秒displayTime = 3000;

通过加载Logo图片显示出Logo界面,之后进入游戏的主菜单。

SnakeMIDlet继承自MIDlet,负责游戏的主界面显示,并继承了接口commandListener,这样,就可以使用高级界面的Command按钮。继承了commandListener的类必须拥有commandAction(),以决定对按键采取什么样的行为。即按钮事件触发后需执行的函数。在设置好commandlistener后,需要调用setCommandListener()以将按钮事件激活。

通过继承Screen的子类List类,来显示游戏的主界面列表和难度等级调整界面列表,继承Textbox类用来显示游戏界面中的相关文字,继承Form类用来显示无线网络对战的选择界面。

其中第一个选项是进入单人游戏,第二个选项是进行游戏的难度等级调整,第三个选项是游戏的帮助界面,第四个选项显示游戏作者的相关信息,第五个选项是记录游戏的最高纪录,第六个选项是进行无线网络对战,需要两台机器进行联网游戏。主程序框架如图4.1所示。

相关主题
文本预览
相关文档 最新文档