网络工程专业论文.doc_第1页
网络工程专业论文.doc_第2页
网络工程专业论文.doc_第3页
网络工程专业论文.doc_第4页
网络工程专业论文.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

基于嵌入式系统的java 游戏的设计与实现网络工程专业论文题 目:基于嵌入式系统的java游戏的设计与实现 专 业: 网 络 工 程 目 录摘 要7abstract7一 前 言71.2引 言81.3手机游戏特征81.4手机游戏的类型91.5 手机软件现状91.6 本游戏的未来91.7 手机未来的发展方向10二 开发环境及相关技术的介绍112.1 java语言的特点112.2 j2me 是什么?112.3 j2me智能客户端122.4 j2me 总体架构122.5 简单环境的搭建:13三 j2me 手机游戏需求分析143.1 本程序需解决的有关技术问题143.2 程序流程图153.3 绘图与midp2.0新增的gamecanvas包163.3.1 提供低级绘制的canvas类163.3.2 graphics类163.3.3 png格式163.4 有关绘图的一些技术163.5 内存使用的最佳化173.6 混淆器(obfuscator)的使用173.7 模拟器的相关调试18四 程序分析和编写手机代码184.1 游戏进入前的选择184.2 主游戏逻辑及其涉及到的若干类184.2.2 游戏的设定204.2.3 游戏中的帮助和程序控制器204.2.4 游戏版权声明234.2.5 游戏的主要程序244.2.6 游戏的主程序33五 常见错误分析345.1 画图错误345.2 变量没有定义或没有初始化345.3 在 gamescreen 类中不能用线程345.4 在玩游戏时出会发出两张同样的牌35参考资料36致 谢36摘 要j2me(java 2 micro edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“write once, run anywhere”的java特性而提高开发的效率。 随着手机的日益普及、java功能在移动设备上的实现,java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于j2me技术的应用,开发一款可商用的手机游戏程序扑克豪斯。本程序的界面和运作方式于台式游戏豪斯,将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。 本论文介绍了手机的软硬件特性、j2me的相关技术及本程序的结构分析和具体功能的实现。 关键词:j2me,手机游戏, java,扑克豪斯 abstractj2me 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 peoples everyday life, providing them ever fast information just in hand. this dissertation focuses on implementation of j2me technology and has developed a commercial game suite run on mobile phonespokermachine. 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. this dissertation introduces the characteristic of nintendo fc machine and its software, j2me and its relative technology as well as this programs structure and analysis of implementation in details. key words: j2me, mobile game, java, tank, battle city. 一 前 言 1.2引 言 手机游戏成绩斐然,成为it产业中增长最快的部分之一.纵观it产业的历史,计算机游戏已经成为技术创新背后的动者渴望更加强大的硬件计算能力;渴望不受不同的软件的限制?无论是将图形强制在人工智能(ai)上 还是网络安全性。游戏开发者和玩家常常是前沿计算机技术的最早的采用者。由于他们的创新天性,游戏不再是由大型采购公司控制的技术产品?游戏领域总是有充足的空间给那此 在这方面有天分的单个创新者。随着技术对游戏经验的促进,游戏市场持续增长。商业it革命为我们节省了时间力之一。计算机游戏和金钱,从而提高了我们的工作水平,我们因此花费更多的时间和金钱在游戏上,来改善生活的整体质量。甚至在当今困难的经济时代,游戏仍保持快速增长,他仍然是盈利行业的组成部分。java开发者应该注意到这里蕴藏着的巨大的商机。1.3手机游戏特征手机游戏的盈利主要是由于它们的涉及面很广。手机已经与现代生活方式紧紧地结合在一起。他们是最普遍携带的个人用品中仅次于钥匙和钱包的东西。传统的台式机游戏将目标锁定在低级趣味的人和青少年身上,而手机游戏则每个人都可以访问的到?随时,随地。尽管每个手机游戏都不贵,但是巨大的使用量(如:每人每星期一个新游戏)将使得这个市场商机无限并且有利可图。但是,对于开发者来说,将控制台游戏迁移到手机游戏工程很大因为他们所面向的对象、生活方式和分布式模型都有着极大的区别。让我们从手机游戏的需求谈起吧。 一个成功的手机游戏大多具有以下特征: 1:易于学习: 既然手机游戏面向的是普通消费者而不是计算机高手,那么他们不可能深入的学习游戏技巧。消费者不会花几个小时去研究一个3美元的手动操作的游戏。所以游戏必须是一下载就可以玩的。保持游戏的简单是最基本的要求。 2:可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。3:基于订阅:手机游戏的盈利成功取决于他们巨大的使用量。一开始开发和设计每个游戏都是昂贵的。如果一个手机游戏开发者要赚钱的话,重要的是:同一个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。 4:丰富的社会交互: 不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。 1.4手机游戏的类型 基于以上标准,最有可能成功的手机游戏就是那些临时小游戏,它可为广泛的玩家在所有的社交场合提供娱乐。特别是,下列类型的游戏将是明天最具有杀伤力的游戏: 1:多玩家游戏: 这些游戏可以提供手机访问以便建立在线游戏团体。或者,他们利用手机专有特征如多媒体通讯和基于位置的服务,从而创建完全不同的社会结构。好的游戏设计和管理是这种类型游戏成功的关键。 2:基于内容的游戏:这些游戏传送版权的多媒体内容,如名人的图片、视频片断、音频立体声、和私人的体育节目,给那些音乐/电影/体育迷们。它成功的关键就是提供值得订阅的高品质的内容流。 3:高冲击的视频游戏:pc 和台式游戏已经从2d 进化到3d。手机游戏也会遵循这种趋势。现在已经出现手机3d工具箱和听筒。但是,3d是非常资源集中型的。他们要求开发者和图形设计者都是专家级的。专业的商店最有可能开发这些游戏。 1.5 手机软件现状 在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端: 1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。 2. 传统手机访问互联网是通过wap(wireless application protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。 而java技术在无线应用方面的优势非常明显: 1. 应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。 2. java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(gui); 3. java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。 基于以上分析,java手机将是未来手机的发展方向,是业界的热点。1.6 本游戏的未来 看过周润发主演的赌神都知道里的豪斯是很好玩的,也很有发展前途。一,这个游戏对手机的要求不高;二,这个游戏简单;三,当这个游戏做成网络游戏时,可以是各个玩家斗智的平台;要实现这点技术要求并不难。在本设计的基础上再加上某些技术就可以了:a) 网络的连接 b) 能读能存网络数据库 c) 牌不再是用随机产生这么简,它应该根据玩家的积分来产生,这样会更好。 1.7 手机未来的发展方向 手机游戏的盈利主要是由于它们的涉及面很广。手机已经与现代生活方式紧紧地结合在一起。他们是最普遍携带的个人用品中仅次于钥匙和钱包的东西。传统的台式机游戏将目标锁定在低级趣味的人和青少年身上,而手机游戏则每个人都可以访问的到随时,随地。尽管每个手机游戏都不贵,但是巨大的使用量(如:每人每星期一个新游戏)将使得这个市场商机无限。只要有好的游戏,就会有更广的使用量。 二 开发环境及相关技术的介绍 2.1 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语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。 2.2 j2me 是什么? 据j2me应用程序调用的api,j2me应用程序分为标准应用程序和不易移植的应用程序两种。 据j2me应用程序调用的api,j2me应用程序分为标准应用程序和不易移植的应用程序两种。 术语: cdc:连接设备配置 cldc:连接限制设备配置 jre:java运行环境 midp:mobile information device profile规范 ota:over the air 非ota:数据线、蓝牙(bluetooth)、红外线(irda)、多媒体信息服务(mms)、email附件 2.3 j2me智能客户端 j2me平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。它有一些非常重要的特征对所有组织都有益 2.4 j2me 总体架构 j2me 使用配置和简表定制 java 运行时环境 (jre)。作为一个完整的 jre,j2me 由配置和简表组成,配置决定了使用的 jvm,而简表通过添加特定于域的类来定义应用程序。 配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 jvm。我们将在 j2me 配置一章中详细讨论配置。 简表定义应用程序;特别地,它向 j2me 配置中添加特定于域的类,定义设备的某种作用。我们将在 j2me 简表一章中深入介绍简表。 下面的图表描述了不同的虚拟机、配置和简表之间的关系。它同时把 j2se api 和它的 java 虚拟机进行了比较。虽然 j2se 虚拟机通常被称为一种 jvm,但是 j2me 虚拟机、kvm 和 cvm 都是 jvm 的子集。kvm 和 cvm 均可被看作是一种 java 虚拟机 - 它们是j2se jvm 的压缩版,并特定于 j2me。 移动通信的时代即将来临,通信相关待业变得前景可期,而除了移动通信的主要通信工具手机,其功能越来越强大之外,有更多的厂商相继投入移动通信设备的生产与开发,其平台和操作系统的复杂度比目前混乱的pda有过之而不及,除了symbian 针对手机推出操作系统 symbian os(过去称做epoc,)操作系统之外,微软也针对手机推出操作系统 smartphone 2002 (stinger),但是日前市面上的手机仍以使用厂商自行开发的操作系统者居多。 平台的复杂纷乱对一般用户当然没什么影响,但是对于程序开发人员来说,这么多不同的程序发展平台,光看完头就昏了。如果每个平台都有自己的程序写法以及程序库,那么光是看上面这些平台至少就要学习五种以上程序的写法。当然,只专精一种平台当然是很好的事情。可是程序员不禁要说:“如果我们写出来的软件可以在不经过修改源代码的情况下就能够在这些平台上执行,那不是更完美吗?“对程序开发人员来说,这样的投资报酬率当然是最大的。 2.5 简单环境的搭建: 1、 下载jdk和j2me无线工具包() 安装sun jdk:j2sdk-1_4_0_03-windows=i386 安装sun j2me sdk:j2me_wireless_toolkit-1_0_3-win 2 关于wireless tool kit wtk(wireless tool kit)是sun公司针对j2me推出的用于手机和palm等 移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。 它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用 厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它 提供运行模拟器的最基本组件,是其他ide需集成采用的必备元素。 3, 用于手机游戏开发的环境不是只建立一个 java sdk 就可以了,它还需要了一个一个库类,叫 java toolkit。首先安装 java sdk 再在原来的目录下安装java toolkit这个新的环境就可以满足我们的需要了。然后我们编写一个最简单的程序用来验证这个环境是否可以用来编写我们的手机程序。 编写以下代码: 保存成 hello.java 文件。 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class hello extends midlet private display display; public hello() display = display.getdisplay(this); public void startapp() textbox t = new textbox(hello midlet, hello midp!, 256, 0); display.setcurrent(t); public void pauseapp() public void destroyapp(boolean unconditional) 启动ktoolbar 新建一个工程,取名 hello 。把以上文件拷到 hello 文件的目录编译。能通过编译并能运行,说明这个开发环境就能满足我们的需要了。 三 j2me 手机游戏需求分析 3.1 本程序需解决的有关技术问题 1. 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。 2. 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在midp2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。 3. 一开始就把牌全部分配好,这样就可以简单而有效地避免了牌的重复,也可以大大地简化了程序代码的编写。 4. 牌的转化可以用一个函数来实现,这样就可以使代码更模块化,利用也就可以更高5牌慢慢移动的实现。牌的移动是用线程来实现的,用thread.sleep() 这个函数来作时间延迟,让坐标变量缓慢地变化。然后通过刷新画图,就会使人觉得牌是在缓慢地移动。 6是否是要牌还是放弃(认输),它通过向右键(要牌)和向左键(放弃)来操作的。当点击向右键时,发生点击事伯,变量发生相应的变化,然后触发画图事件。 7当玩家都跟到5张牌时,就要判断牌的大小了,它通过多次循环,来确定其大小。 以上相关技术细节和整体流程将分别在以下小节阐述。 3.2 程序流程图 midlet suite是midp应用程序的最小单位,jam负责将手机内的midlet suite以图形 v 化的方式呈现,让用户能够选取欲执行的midlet suite,一旦选取了某个midlet suite,操作系统就会激活kvm执行里面的midlet。midlet及相关的支持类组成了midp应用程序的实际内容。每个midlet都必须继承javax.microedition.midlet.midlet这个抽象类。在midp规格中定义了midlet的生命周期,以及可以存在的三种状态,包括paused、active以及destroyed,每一个midlet在任何时刻只可能处于其中的一个状态这 v 三种状态的转换关系如图所示: 本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入牌的图文件,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的牌运行在主线程中,随屏幕刷新的频率而移动。牌将在游戏开始时逐渐新增线程,每增加一个牌对象就新增加一条线程,一旦线程数满到最大值(本程序暂设置最大值为几千多个),就不允许线程的再增加。这个线程问题就是本设计的一个 bug。 本程序主要的流程如图32所示: 流程简略解释: 程序一开始执行是先从主类 test.java 来开始。这个类从 midlet 类继承过 来,在程序的开始函数 startapp() 中我用 navigator.current = navigator.main_screen; 这个等式把程序的执行转到 mainscreen.java 文件(程序的画面)来。而这个类继承 list ,这个 list 类可以更方便地控制程序的选择。在这个文件中列出一个菜单供用户去选择,如下: 开始 设定 版权声明 离开 当点击开始时,程序转到 gamescreen 这个类去。gamescreen 这个类继承 canvas,canvas 专门是用来控制游戏的。里面包括屏幕的绘图,一些变量的初始化。 当点击设定时,程序转到setscreen 这个类。这个类用于登录帮助网站的,当然这个是需要网络支持的。 当点击版权声明时,程序转到 copyscreen 这个类,这个类继承 alert,它用于描述版权的一些信息。 当点击离开时,程序退出 test 类。 3.3 绘图与midp2.0新增的gamecanvas包 3.3.1 提供低级绘制的canvas类 为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是canvas抽象类进行绘图。从程序开发的观点看,canvas类可与高级screen类交互,程序可在需要时在canvas中掺入高级类的组件。canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。本程序中,操纵用户坦克运行的按键都定义为游戏控制键,这样便能适应所有的机器。 3.3.2 graphics类 graphics类提供了简单的2d绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用graphics绘制,gamecanvas可调用getgraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给canvas的paint()函数, 以便最终显示。 3.3.3 png格式 png(portable network graphics)格式是midlet唯一支持的图象格式,png具体格式由png specification,version 1.0定义的。png格式提供透明背景的图象,这对绘制游戏画面和被操纵主角极有帮助。坦克之间或与障碍物碰撞时就不会因为背景有特定的颜色,显示出的效果像贴上的图片而缺乏真实感,物体之间轻微重叠时最上层图片也不会覆盖超过其有效象素外的部分。 png格式图片中包含许多定义其图片特性的冗余部分(chunks)。这些代码包含在每一个单独的png格式图象中,然而如果将多个png图象合并在一张幅面稍大一些的整图中,多个chunks就可以得到精简,图片的大小可以得到控制。使用image 类中的createimage函数可从整图中分割出所需要的元素。在game包中的tiledlayer和sprite类都整合了这样的 功能。本程序中的地图元素都集成在一张tile.png图片中,实现了方便的管理和程序体积的精简。 3.4 有关绘图的一些技术 在没有midp2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内所想要画的图形画在一张预先准备好的背景,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上。image类提供了一个建立背景的静态方法createimage(int width, int height),再利用getgraphics()方法取得属于这个背景的graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用drawimage()方法将背景的数据复制到实际显示的屏幕上。 3.5 内存使用的最佳化 通常在midp应用程序的手机执行环境中,所牵涉的内存有下列三种: 应用程序存储内存 recordstore存储内存 执行时期内存(java heap) 其中前两种是持久性的内存,关闭电源后还能保持数据的正确性,通常这两种内存所能存储的容量是合并计算的,这个上限对每种手机都不一样,大部分在一两百kb内。在这样的情况下需要在不影响原有功能的情况下适当的缩减jar文件的大小,除了可以克服内存空间的限制外,也能大幅度缩短下载的时间(费用也降低了),势必会有更多的人愿意下载所开发的程序。其方法有第一就是尽量缩短命名的长度。在应用程序内,对于所建立的类、接口、方法及变量名而言,都需要赋予一个识别的名称,所命名的名称每多一个字符就会在类文件内多产生一个字节,对于一个较复杂的应用程序而言就会增加为数不小的数据量。所有这些可以借助混淆器来帮助实现。 第二是减少复杂的程序结构,为一些共同的行为建立一个抽象类(abstract class) 来表示继承的子类的共通性。 第三是减少图形数据的大小。将png格式的小分辨率图象合并在一张大的高分辨率图象中,由于减少了chunks,将比合并前的总大小减少许多。 3.6 混淆器(obfuscator)的使用 java 语言并没有完全编译成二进制可执行文件,编译出的.class文件是一种介于源程序和二进制之间的一中基于半解释的字节码,需要虚拟机来执行。它包括了所有的信息。然而这样会导致.class很容易被反编译为源代码,从而不能保护作者的知识成果。目前流行的如decode,jad等反编译工具可以以很快的速度生成源文件。如果不加以施行有效的措施,将造成严重的后果。 由此引入混淆器的概念。混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,如果缺乏相应的函数名指示和程序注释,即使被反编译,也将难以阅读。 混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的减少变量、函数的命名长度的关系,编译后也会从.class文件中减少这些冗余的信息。混淆后,体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。 为了能与各种ide集成,就像java2 sdk一样,混淆器采用命令行参数的形式,以便可被其调用。目前流行的obfuscator有retroguard等。 3.7 模拟器的相关调试 ide整合的wireless tool kit提供了许多在运行时监视运行状态的工具。 包括内存状况的检测(手机上的内存空间十分有限,必须时刻关注机载内存是否大于程序所能使用到的最大可能的内存空间),网络状况的检测,运行函数的跟踪等。如图3-4,是内存跟踪测试随时间变化的调试器。其中,允许强制垃圾回收(garbage collection)。由于java语言中,不像许多其他的如c+语言,不需要指定回收函数中特定不使用的资源,资源回收机制将自动清空无效变量占用的空间。在程序运行中也可以调用system类的gc()函数手动收回废弃的内存。 四 程序分析和编写手机代码 4.1 游戏进入前的选择 每个midlet程序都必须有一个主类,该类必须继承自midlet。它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。)、结束的函数。 本设计程序进入时,首先载入画面的不是游戏运行状态,而是提供选项,当选择 开始 时正式运行。因此,在 mainscreen的构造函数中分配了list类,即选项画面的内存空间。在startapp()函数中,随即调用了displable的setcurrent()函数将当前屏幕设置为navigator.main_screen。在 版权声明 界面前,建造了一个alert类。alert对象用于显示提示、警告,还有版权信息等告之用户信息的临时闪现的屏幕,它可作为setcurrent的参数,提前显示在最终需要显示的屏幕前。当程序转到 gamescreen 时,画面将永久显示游戏本身,直到用户点击相应按钮手动结束。但是当显示的画面元素超过一屏大小时,将自动转换为永久状态。 4.2 主游戏逻辑及其涉及到的若干类 4.2.1 程序的菜单选项 这个写在 mainscreen.java 文件中,这个类继承 list 。同时也继承了接口commandlistener,这样,就可以使用高级界面的command按钮。继承了commandlistener的类必须拥有commandaction(),以决定对按键采取什么样的行为。即按钮事件触发后需执行的函数。在设置好commandlistener后,需要调用setcommandlistener()以将按钮事件激活。用append 方法来加入菜单: append(开始,null); append(设定,null); append(版权声明,null); append(离开,null); setcommandlistener(this); 再用 getstring(int) 函数来获得菜单的选项。 mainscreen.java 文件: import javax.microedition.lcdui.*; public class mainscreen extends list implements commandlistener private static displayable instance; synchronized public static displayable getinstance() if(instance = null) instance = new mainscreen(); return instance; private mainscreen() super(进入game,implicit); / 菜单选择 append(开始,null); append(设定,null); append(版权声明,null); append(离开,null); / 事件侦听 setcommandlistener(this); public void commandaction(command c,displayable s) / 事件侦听 string cmd= getstring(getselectedindex(); / 把得到的值传给程序控制器,用程序控制器来决定指引程序的执行。 navigator.flow(cmd); 4.2.2 游戏的设定 这个写在 setscreen.java 文件中,而这个类继承 form 类,同时也继承了接口commandlistener,这样,就可以使用高级界面的textfield按钮。继承了commandlistener的类必须拥有commandaction(),以决定对 textfield 值获取采等行为。在设置好commandlistener后,需要调用setcommandlistener()函数来把值传入程序中。 setscreen.java 文件: import javax.microedition.lcdui.*; public class setscreen extends form /继承 commandlistener 接口 implements commandlistener private static displayable instance; synchronized public static displayable getinstance() if(instance = null) instance = new setscreen(); return instance; / 定义 textfield (文本输入框) textfield url; gauge volume; private setscreen() super(设定); url = new textfield(请输入服务器位置,socket:/:99,40,textfield.url); append(url); volume = new gauge(音量,true,10,3); / 软键菜单 addcommand(new command(辅助说明,command.help,1); addcommand(new command(返回,command.back,1); / 事件侦听 setcommandlistener(this); public void commandaction(command c,displayable s) navigator.flow(c.getlabel(); 4.2.3 游戏中的帮助和程序控制器 首先调用 helpscreen 类,然后赋一个值辅助说明给 navigator 类,当navigator接收到这个值时,就显示帮助字符串。 helpscreen.java import javax.microedition.lcdui.*; public class helpscreen extends form implements commandlistener public helpscreen(string c) super(辅助说明); append; addcommand(new command(返回,command.back,1); setcommandlistener(this); public void commandaction(command c,displayable s) navigator.flow(c.getlabel(); 这个写在navigator.java 里,它接收 setscreen.,mainscreen等类传过来的值。然后根据它触发的按钮事件,来调用相对应的事件。 /navigator.java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import java.util.*; public class navigator final public static int main_screen = 1; final public static int game_screen = 2; final public static int set_screen = 3; final public static int game_help_screen = 4; final public static int set_help_screen = 5; public static midlet midlet; public static display display; public static int current; / 自定义一个类 / 重载函数 public static void show(object obj) switch(current) case main_screen: display.setcurrent(mainscreen.getinstance(); break; case game_screen: display.setcurrent(gamescreen.getinstance(); break; case set_screen: display.setcurrent(setscreen.getinstance(); break; case game_help_screen: display.setcurrent(new helpscreen(string)obj); break; case set_help_screen: display.setcurrent(new helpscreen(string)obj); break; public static void flow(string cmd) switch(current) case main_screen : if(cmd.equals(开始) current = game_screen ; show(null); else if(cmd.equals(设定) current = set_screen; show(null); else if(cmd.equals(版权声明) display.setcurrent(copyscreen.getinstance(); else if(cmd.equals(离开) midlet.notifydestroyed(); break; case game_screen : if(cmd.equals(辅助说明) current = game_help_screen; show(游戏的操作方式:向右键要牌,向左键放弃!顺子并同花最大,其次四张相同的牌,顺子,再次三张相同的牌和两个到顺子,再次到同花.); else if(cmd.equals(返回) current = main_screen; show(null); break; case set_screen : if(cmd.equals(辅助说明) current = set_help_screen; show(设定方式); else if(cmd.equals(返回) current = main_screen; show(null); break; case game_help_screen : if(cmd.equals(返回) current = main_screen; show(null); break; case set_help_screen: if(cmd.equals(返回) current = set_screen; show(null); break; 4.2.4 游戏版权声明 / copyscreen.java import javax.microeditio

温馨提示

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

评论

0/150

提交评论