




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 XX大学大学毕业论毕业论文文(设计设计) 题题 目:目: 基于基于 J2ME 的手机游戏软件开发的手机游戏软件开发 指导老师指导老师: : 学生姓名:学生姓名: 所属院系:所属院系: 信息科学与工程学院信息科学与工程学院 专专 业:业: 计算机科学与技术计算机科学与技术 班班 级级: 计算机计算机 05-1 班班 完成日期完成日期: 2009 年年 5 月月 15 日日 2 摘要 过去的两年,移动手持设备领域实现了飞速的发展,并伴随着巨大的变革。 在近几年的技术创新中,蓝牙可谓是最为吸引人的应用之一。JSR82的 JCP 蓝牙 规范规范了一个标准的 J2ME 蓝牙开发平台,以保证开发出来的的程序可以在任 何 J2ME 设备上运行。本文正是利用 J2ME 开发平台,通过对 JSR82的 JCP 蓝牙 规范的深入研究,实现了一个基于蓝牙的联机俄罗斯方块游戏。该软件很好的 完成了在蓝牙技术的基础上对数据的接收、传送等功能。并可以在支持 JAVA 的 手机中成功使用。 关键词:J2ME;蓝牙;Netbeans 3 ABSTRACT Over the past two years, the field of mobile handheld devices to achieve a rapid development, and accompanied by huge changes. In recent years, technological innovation, Bluetooth can be one of the most attractive applications. JSR82 Bluetooth specification JCP specification of a standard Bluetooth J2ME development platform to ensure that the procedures developed can run on any J2ME device. This article is the use of J2ME development platform, the JCP through JSR82-depth study of the Bluetooth specification, the realization of a Bluetooth-based online game Tetris. The software is very good in the Bluetooth technology was completed on the basis of data reception, transmission and other functions. JAVA can be in support of the successful use of mobile phones. Keywords J2ME;Bluetooth;Netbeans 4 目录 1 前言 .1 2 研究方法 .2 2.1 J2ME.2 2.1.1 不同的 java 版本.2 2.1.2 J2ME.2 2.2 开发平台的搭建.3 2.3 蓝牙技术.3 2.4 JSR82(JABWT)规范.4 3 游戏设计实现.5 3.1 结构设计.5 3.2 系统静态类图.5 3.3 MAINMIDLET类 .6 3.4 TETRISBLOCK类 .9 3.5 TETRISCANVAS类 .11 3.6 BULETOOTHDISCOVERY类 .14 4 结束语.20 致 谢.21 参考文献.22 1 1 前言 过去的两年,移动手持设备领域实现了飞速的发展,并伴随着巨大的变革。 在近几年的技术创新中,蓝牙可谓是最为吸引人的应用之一。由于手机无线网 络还处于研究阶段,而蓝牙在某种程度上可以认为是对手机无线网络的弥补。 很多手机单机游戏对于喜爱游戏的玩家来说并不具有吸引力。如果可以通过蓝 牙技术实现小区域联机游戏。那么,在某种程度上来说,这会成为很多喜欢游 戏的消费者的首选,便可以在很大程度上提高手机的销量。 2 2 研究方法 Java 2 分为有 3 个版本,其中 J2ME 是一个高度优化的 Java 运行环境,它 专门为那些 CPU、内存都非常有限且带宽、屏幕分辨率也很小的无线手持设备 而设计。 JSR82 的 JCP 蓝牙规范规范了一个标准的 J2ME 蓝牙开发平台,以保证开发 出来的的程序可以在任何 J2ME 设备上运行。而不必考虑硬件平台和协议栈的不 同对应用程序产生的影响。因此,利用 JSR82 规范可以开发灵活高效的局域网 联机游戏。 2.1 J2ME 2.1.1 不同的 java 版本 当 Sun 公司引入 Java2后,他们认识到,一个版本是远远不够的。因为运 行 Java 的设备在迅速变革。最终他们将 Java2分成了3个版本: J2SE Java 2 Standard Edition J2EE Java 2 Enterprise Edition J2ME Java 2 Micro Edition J2SE 是一个以客户程序为基础的开发平台,它专为 PC 机用户设计。J2EE 是基于服务器程序的一个版本,它支持 Servlets, JSP 和 XML。而 J2ME 是一 个精简版的 J2SE。每一个版本都为基于 JAVA 设计的应用程序提供了完整的运 行平台,且均含有虚拟机和类。 2.1.2 J2ME Java 2分为3个版本:Java2企业版(J2EE),Java2标准版(J2SE)和 Java2 微缩版(J2ME) 。J2ME 是 J2SE 的一个精简版,它专门为那些 CPU 和内存容量有 限且屏幕分辨率也很低的小型设备而设计。例如 PDA,移动电话。 Java 2微缩版,J2ME,是一个高度优化的 Java 运行平台。J2ME 技术拥有一个 庞大的消费空间,它所覆盖的产品范围从最小的日常用品,比如智能卡或是传 呼机到机顶盒,或者是一个和电脑能力相差不大的设备。 随着便携式嵌入设备的飞速发展,在计算行业出现了一个新的领域,同时 也带来了新的开发工具。而现在最理想的灵活的计算和信息环境就是其能够适 应不同功能和不同制作方法的设备。 迅速发展的移动和嵌入式设备,导致了一个新的计算时代,同时对这种技 术也提出了新的要求。最关键的要求是必须有一个共同而灵活的计算和通讯环 境,拥有在不同的装置上实现安装的和共享的能力。1999 年 6 月, Sun 微系统 公司推出 J2ME。它专门为那些 CPU、内存都非常有限且带宽、屏幕分辨率也很 小的无线手持设备而设计。总之 J2ME 是一个能够使我们在移动设备上实现下载 和运行不同应用程序平台,J2ME 是一个开放式标准,这意味着任何人都可以使 用它,而其他人可以随意的下载这个应用程序。用户将能够根据他们的需求和 兴趣实现个性化的设备或是应用。 3 2.2 开发平台的搭建 “工欲善其事,必先利其器” ,程序员也不例外。本实验使用 NETBeans IDE 5.0和 Mobility Pack 5.0 配置 J2ME 开发环境,它们可以显著提高 MIDP 应用程序的开发效率。 安装前先确保计算机上已经正确地安装了 J2SDK 1.4.4(Java 2 Software Development Kit) ,并且可以正常工作。先安装 NETBeans IDE 5.0 中文版,因 为 NETBeans IDE 比较耗费资源,所以建议在较高配置的计算机上使用,然后执 行“文件”目录下的“新建项目”命令,弹出“新建项目”对话框,对话框中 有 5 个项目类可提供选择,包括“常规” 、 “WEB” 、 “企业” 、 “NETBeans 插件模 块”等。 这里并没有用于开发 MIDP 应用程序的类别,因为还没有安装 Mobility Pack 5.0 中文版,它是用于在 NETBeans IDE 中开发 MIDP 应用程序的可选插件 包。安装完后,可以发现新建项目“类别”中增加了“移动”选项。现在就可 以使用 NETBeans IDE 开发 MIDP 应用程序了。 只需要安装 NETBeans IDE 和 Mobility Pack 就可以开发 MIDP 项目,比搭建基 于 Eclipse 和 EclipseMe 的开发环境,NETBeans IDE 更加简单、友好。 2.3 蓝牙技术 信息时代最大的特点便是更加方便快速的信息传播,正是基于这一点技 术人员也在努力开发更加出色的信息数据传输方式。蓝牙,对于手机乃至整 个 IT 业而言已经不仅仅是一项简单的技术,而是一种概念。当蓝牙联盟信 誓旦旦地对未来前景作着美好的憧憬时,整个业界都为之震动。抛开传统连 线的束缚,彻底地享受无拘无束的乐趣,蓝牙给予我们的承诺足以让人精神 振奋。 蓝牙(Bluetooth)技术,实际上是一种短距离 无线电技术,利用 “蓝牙” 技术,能够有效地简化掌上 电脑、笔记本电脑 和移动电话手机等移动通信 终端设备之间的通信,也能够成功地简化以上这些设备与因特网 Internet 之间的通信,从而使这些现代通信设备与因特网之间的数据传输变得更加迅 速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包 技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工 业、科学、医学)频段。其数据速率为 1Mbps。采用时分双工传输方案实现 全双工传输。 蓝牙网络拓扑分微微网和分散网两种,微微网中有一个设备是 主设备,其它设备均为从设备,任何从设备之间的通信必须经过主设备才能 够传输。而在分散网中,跨越两个微微网间的设备即可以是主设备,也可以 是分设备。 2.4 JSR82(JABWT)规范 在 2002 年 4 月 5 日,Java 靠发社区(JCP)发布了给予 J2ME 平台的蓝牙 API 规范 JSR82(Java 蓝牙无线技术 APIs,Java APIs forBluetooth Wireless Technology) 。JSR82 规范定义的 API 中包括 21 个类及接口。JSR82 的最小需求时首先连接设备配置(CLDC) ,而可靠连接设备配置(CDC)是 CLDC 的超集,所以 JABWT 可以同时在 CLDC 和 CDC 上实现,即可以在使用任何 J2ME profile 色上面使用 JABWT。 4 JSR82 规定了一个标准的 J2ME 蓝牙开发平台,保证靠发出来的程序可以在 任何 J2ME 设备上运行,而不必考虑硬件平提案和协议栈的不同对应用程序产生 的影响。基于 JSR82 的 J2ME 蓝牙开发模式不仅提高了开发效率,更是由于 JSR82 规范通过统一的 Java 语言平台和标准的蓝牙开发平台,使用支持 J2ME 和 JSR82 蓝牙规范的设备可以根据环境动态地下载并执行第三方的蓝牙应用代 码。 JSR82 被设计为支持数据传输,不支持语音传输;在核心协议中支持 L2CAP、RFCOMM、SDP 和 OBEX。JSR82 规范的 API 均以类或接口形式定义,总共 定义了 12 个类和 9 个接口。其中 javax.bluetooth 定义 9 各类和 4 个接口; javax.obex 定义其余 3 个类和 5 个接口。 它从便于开发的角度将所规定的 API 分为设备/服务发现(Disvovery) 、通 信(Communicatiuon)和设备管理(DeviceManagement)3 大类。发现类包括 设备发现、服务发现和服务注册的类或接口;通信类包括在串行剖面层次、 RFCOMM 层次、L2CAP 层次和 OBEX 层次建立连接和使用连接的类或接口;设备管 理类包括代表控制和管理的类或接口。 基于 JSR82 的协议栈如下图,灰色部分为 JSR82 规范提供给 Java 平台开发 者的蓝牙软件栈。 基于蓝牙的应用和程序 JABWT(JSR82) 服务发现协议(SDP) 串口仿真协议 (RFCOMM) 对象交换协议 (OBEX) 逻辑链路与适配协议(L2CAP) 主机控制器接口(HCI) 蓝牙无线电(Bluetooth Radio) 基带与链路管理协议(Basedband import game.bluetooth.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.bluetooth.*; public class MainMIDlet extends MIDlet implements CommandListener private Display display; private BluetoothDiscovery disc; private TetrisCanvas canvas ; 7 private MasterSlaveSelect select; public MainMIDlet() /System.out.println(System.getProperty(microedition.m3g.version); display = Display.getDisplay( this ); ErrorScreen.init(null, display); disc = new BluetoothDiscovery( display ); /ketrisCanvas 的构造函数放到 M/SThread 中,将 conn 数组传入 ketrisCanvas 中 /ketrisCanvas = new KetrisCanvas(this); public void startApp() String name; try name = LocalDevice.getLocalDevice().getFriendlyName(); /System.out.println(LocalDevice.getLocalDevice().getFriendlyName() = + name); catch( BluetoothStateException e ) showAlertAndExit( , Please switch Bluetooth on!, AlertType.ERROR ); return; disc.setServiceUUID( 20000000000010008000006057028C19 ); disc.setName(name); startUI(); /* 通过 UserNameInterface 选择做 Master 还是 Slave */ public void startUI() select = new MasterSlaveSelect(this); display.setCurrent(select); 8 public void pauseApp() public void destroyApp( boolean unconditional ) public void showAlertAndExit( String t, String s, AlertType type ) Alert a = new Alert( t, s, null, type ); a.addCommand( new Command( Exit, Command.EXIT, 1 ) ); a.setCommandListener( this ); display.setCurrent( a ); public void Exit() destroyApp( false ); notifyDestroyed(); public void commandAction(Command c, Displayable s) switch( c.getCommandType() ) case Command.EXIT: Exit(); break; public Display getDisplay() return display; public BluetoothDiscovery getDisc() return disc; public void setCanvas( TetrisCanvas _canvas) canvas = _canvas; 9 public TetrisCanvas getCanvas() return canvas; 下面对该类中主要的成员方法进行介绍。 (1) MainMIDlet()方法 MainMIDlet()方法是本类的构造函数,实现如下功能: 通过引用 Display 得到 Display 类对象。 使用 ErrorScreen 的静态方法 init(Image img,Display disp)进行 参数初始化。 构造 BuletoothDiscovery 类对象 disc。 (2) startApp()方法 startApp() 方法实现如下功能: 调用 name = LocalDevice.getLocalDevice().getFriendlyName()得到 本地设备名称。 设置 disc 的 UUID 值和 name。 调用 startUI()方法进行角色选择画面。 (3) startUI() 方法引导玩家进行角色选择画面。 (4) showAlertAndExit( String t, String s, AlertType type )方法 构造了一个 Alert 对象,标题为 t,警告文本为 s,警告类型为 type。 (5) Exit()方法调用 destroyApp( boolean unconditional )和 notifyDestroyed()方法退出程序。 3.4 TetrisBlock 类 TetrisBlock 类负责方块的数据格式定义和坐标控制。 在 TetrisBlock 类中定义了 7 种方法的不同形状和对应的颜色,都有一个 对应的 ID,分别为 17,且对于每种方块来说,其颜色均是固定的。方块 16 个 4*4 的小方格组成,故在数据逻辑上可以使用 4*4 的二维数组表示,又由于 每个方块都有 4 中旋转变化,故可以用 4*4*4 的三维数组表示一个方块的所有 状态。 例如, “T”形方块可以由如下数组来表示: protected int blockpattern7 = 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 10 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ; BRICK_COLORS 整形数组中保存的是每种方块的颜色,17 为活动方块颜色, 8 为为墙砖颜色。 public class TetrisBlock /各种砖块,1-7 为活动砖块颜色,8 为墙砖颜色 public static final int BRICK_COLORS = 0 x00FF0000, 0 x0000FF00, 0 x00FFFF00, 0 x000000FF, 0 x00FF00FF, 0 x0000FFFF, 0 x00C0DCC0, 0 x00808080; 因为每个方块均是由一个个的小方块组成,所以不吝主屏还是附屏对应的 TetrisBlock 对象,均需要设置参数 gamearea_x、gamearea_y、brick_Width。 这 3 个成员变量在 setparameter()中进行设置,该方法程序代码如下: public void setParameter() gamearea_x = map.gamearea_x; gamearea_y = map.gamearea_y; brick_Width = map.brick_Width; 11 3.5 TetrisCanvas 类 俄罗斯方块游戏的逻辑控制和对 TetrisMap 类调用方块绘制方法均是在 TetrisCanvas 类中实现的,它继承自 Canvas 类,实现了 CommandLister 和 Runnable 接口。游戏逻辑由 paint()、commandAction() 、keyPressed() 、 paintRemote() 、updateRemoteGameState()方法共同控制。 TetrisCanvas 类中首先定义了如下几个成员变量来对本地玩家进行设定: static int mainWidth 本地玩家屏幕的宽度。 static int mainHeight 本地玩家屏幕的高度。 static int BRICK_WIDTH 本地玩家方块的边长。 static int GAMEAREA_X 本地玩家游戏区域左上角的 X 坐标。 static int GAMEAREA_Y 本地玩家游戏区域左上角的 Y 坐标。 int gameState 代表本地玩家的游戏状态。 因为游戏屏幕上还会绘制远端玩家的游戏信息,故需要设定远端玩家的参 数值,它们的命令方法和代表本地玩家的成员变量类似,简单地增加一个 _Remote 后缀即可。它们的定义如下: static int GAMEAREA_X_REMOTE 端玩家游戏区域左上角的 X 坐标。 static int GAMEAREA_Y_REMOTE 玩家游戏区域左上角的 Y 坐标。 static int BRICK_WIDTH_REMOTE 玩家方块的边长。 static int mainWidth_Remote 玩家屏幕的宽度。 static int mainHeight_Remote 远端玩家屏幕的高度。 int gameState_Remote 代表远端玩家的游戏状态。 游戏运行后的效果如图 3-3 所示: 12 图 3-3 蓝牙联网俄罗斯方块游戏的运行效果 TetrisCanvas 类构造方法如下所示: public TetrisCanvas( MainMIDlet _midlet, BluetoothConnection btConns , String _role ) midlet = _midlet; btConnections = btConns; role = _role; bug.println(role); if( !( Role.ROLE_SINGLE = role ) setCanvas(); setReceiveThread(); else setSingleCanvas(); TetrisCanvas 类的构造方法将一个 Midlet 的实例和 BuletoothConnection 数组传入(因为是 1 对 1 游戏,故实际传入的 BuletoothConnection 数组长度 为 1) ,_role 为本地玩家所选择的角色。有 Master、Slave、Singe 三种,由 game.buletooth 包中的 Roel 类定义。 Role 类定义如下: package game.bluetooth; public class Role public static final String ROLE_MASTER = Master; public static final String ROLE_SLAVE = Slave; public static final String ROLE_SINGLE = Single; 为了便于理解、调试程序,设计程序时加入了一个单机版的功能,在游戏 开始时显示的 List 子类 MasterSlaveSelect 实例中选择“Single”项,单击 “选择”按钮,则进行单机模式。 SetSingleCanvas()方法的具体代码如下: public void setSingleCanvas() mainHeight = getHeight(); 13 mainWidth = getWidth(); offSet = 0; /计算小砖块宽度 int min = mainWidth; /比较,使用高和宽中最小一个来计算 if (mainHeight = 0; min-) if (min % 16 = 0) break; /游戏区域为 min 的方形,且 min 为 16 的倍数 BRICK_WIDTH = min / 16; /砖块厚度 GAMEAREA_X = (mainWidth - min) / 2 ; GAMEAREA_Y = (mainHeight - min) / 2; startDemoFlag = false; /还没有显示开始画面 gameState = GAME_START_DEMO; /游戏处于 demo 画面 状态 map = new TetrisMap(this,true); block = new TetrisBlock(map,true); map.setTetrisBlock(block); addCommand(); thread = new Thread(this); thread.start(); (1) 按键响应 按键响应在 TetrisCanvas 类实现父类的方法 keyPressed()中实现。按 键是玩家对游戏过程实现控制的途径。接收到远端用户的相应信息后,本地玩 家屏幕上方的附屏上就要有相应的绘图结果,绘图代表远端玩家的附屏方法为 Paint_remote(),它有 paint()方法调用,它的绘制过程及方法与 paint() 是一样的。 (2) 发送数据 14 有一下几种情况触发数据的发送: 按下命令按钮引起游戏状态的变化。 游戏过程中引起状态的变化。 失去连接。 其中,游戏过程中引起状态的变化指的是不论是否有行被取消,只要有 方块落下固定在某个位置,则本地玩家必须将地图数据发送到远端。 (3) 接收数据 SetReceiveThread()方法生成接收线程,接收来自远端用户的命令信息 及数据,具体方法如下所示: public void setReceiveThread() for( int i=0; i=0; i- ) if( ! isSelected(i) ) urlStrings.removeElementAt(i); / 返回到 searchService()方法, / 这时 urlStrings 向量在已经存在建立连接的 url 值字符 串 synchronized( block_m ) block_m.notifyAll(); break; 第二、三步骤的主要代码如下所示: synchronized( block_m ) discoveryAgent.startInquiry( DiscoveryAgent.LIAC, listener ); block_m.wait(); deviceList = null; 17 if( progressBar != null ) progressBar.stop(); if( ! warning.equals( ) ) Alert al = new Alert( null, warning, null, AlertType.INFO ); al.setTimeout( 2000 ); display.setCurrent( al ); synchronized( al ) try al.wait( 2000 ); catch(InterruptedException e ) / 构造一个列表 btConnections = new BluetoothConnectionurlStrings.size(); / 判断是否有设备被发现,如发现,进行下一步操作 if( urlStrings.size() 0 ) progressBar = new PageProgressBar( Connecting., urlStrings.size() ); / 连接查询到的设备(这里只有一个设备会被返回) for( int i=0; iurlStrings.size(); i+ ) de = (ServiceRecord)foundServiceRecords.elementAt(i).getAttributeValue( SERVICE_NAME_BASE_LANGUAGE ); rname = (String) de.getValue(); (PageProgressBar)progressBar).nextDevice(); btConnectionsi = new BluetoothConnection( (String) urlStrings.elementAt(i), localName, rname ); 18 / 向远端玩家发送设置的代表自己的名称字符串 btConnectionsi.writeString( localName ); progressBar.stop(); / 释放 progressBar progressBar = null; /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论