・48・ Computer Era No.7 2008 面向手机的J 2 M E的三维弹球游戏设计★ 顾才东 ,李华 ,马敬波。,谭方勇 ,陆侃 ,费国扬 (1.苏州职业大学计算机3-程系,江苏苏州215104; 2.苏州I职业大学学报编辑部;3.宁夏大学计算机系) 摘要:利用J2ME(Java2 Platform Micro Edition)技术,可以在手机上通过图像效果的变换构建3D场景,实现一个简单 三维弹球手机游戏。文章分析并介绍了游戏的设计思想和具体的实现技术,给出了部分类的设计调用关系与程序代码,以 及游戏的界面。 关键词:J2ME;手机游戏;3D弹球;游戏设计 0引言 DOWN、LEFT、RIGHT四种移动方向的指令,也可以同时接收 通讯技术的发展及手机的普及,使人们正在不断地给手机 任意两个运动指向互相垂直的指令,实现斜向运动。 增加新的功能,更希望手机能集娱乐、商务办公等功能于一体, 游戏开始后,玩家按下手机方向键,移动挡板以挡住即将 并能自由访问lnternet。使手机实现一般只有PC机才具有的功 逃出深井的小球,每挡住一次,屏幕左上角显示积分增加一分。 能——下载各种程序并运行,是目前手机发展的—个重要方向nI。 如此重复,直到挡板没有将小球挡住,游戏结束,重新进入等待 为此,人们提出了各种各样的解决方案,其中基于J2ME(Java 开始状态。 2 Micro Edition)方案无疑是最引人注目的。 2弹球游戏的流程与类的继承及调用关系 日本和韩国是Java在手机上应用程度最深的国家。Java在 2.1系统流程(见图1】 手机上的应用以游戏为主。韩国的LG在日本推出Java手机之 后也提供Java游戏下载服务[21。美国的厂家推出的Java下载服 务也受到相当程度的欢迎。移动电话的领导厂商Nokia、 Motorola、Ericsson、Siemens等推出了开发平台Symbian OS 7.0,并相继推出各自各种型号的Java手机,他们都使用J2ME 技术[31。 J2ME是一种高度优化的Java运行环境,主要针对消费类 电子没备。它是Java语言的移动版,专门用于嵌入式设备,适 应GSM、CDMA和GPRS等多种网络环境。如今使用手机查 询银行账号、地理信息查询、收听音乐已逐渐流行n1。开发环境 由J2ME整合J2DK+Wireless Tool Kit+Eclipse+Eclipse me 构成。 图l程序流程图 1弹球游戏的设计思想 2.2类的继承及调用关系 本游戏之所以称之为3D弹球是因为小球的运动空间是一 本游戏共没计了l0个类,各类问的主要继承和调用关系 个三维的空间,与以前接触过的打砖块一类的2D游戏有明显 如图2所示。 的区别。小球所运动的空间(play ground)形状是一个形为正四 棱柱(底面为正方形的棱柱)的井。小球在井内以某一初速度开 始沿直线运动,碰到井的底面、四壁或者井口可以移动的挡板 后做类似于光的平面反射运动,在此反弹的过程中小球的速度 会不断增加,玩家控制井口平面的一块正方形挡板(paddle)上 下左右移动,挡住即将逃逸出井的小球,每挡住一次,积分加一 分。挡板的边缘外凸,并且是半透明的,这样既可以让人辨认挡 板的位置,又不会遮盖住挡板下方的小球。挡板可以接收UP、 图2类之间的调用与继承关系图 基金项目:苏t'1 i职业大学研究性课程项目(070405) 维普资讯 http://www.cqvip.com
计算机时代2008年第7期 ・49・ 3部分类的设计 限于篇幅,仅将十个类中的三个最主要的类加以说明。 3.1 M3GCanvas类的设计 M3GCanvas继承GameCanvas,构造了一个c ̄vas。包括 构造小球的运动场,运用MeshFactory类载入小球的运动背 景,创建了挡板和小球,用到了J2ME里最常用的Graphics方 法,接收了键盘事件,通过一个条件语句控制了挡板移动的最 大速度。 3.2 VectorOps类的设计 VectorOps类定义了最基本的运算,包括向量的点积 dotProduct(lfoat f】v,lfoat I1 u),交叉积crossProduct(lfoat I1 v, lfoat[】u),向量的长度length(lfoat[】v),向量的规格化normalize (lfoat[]v),数乘scalarMul(lfoat scalar,lfoat][v),减法sub(lfoat][v, lfoat][u),加法add(lfoat1]v,lfoatlf u),向量的镜像mirror(lfoat][v, lfoat[]n),定义一个向量,将向量转化成字符串。 3.3 ball类的设计 Ball类主要用于定义小球的属性。小球与墙面或者挡板碰 撞后的轨迹以及速度都由ball类来规定。小球与墙面或者挡板 碰撞后,会做类似于光的镜面反射的运动,在完成30回合碰撞 后速度还会增加。这样可以增加游戏的难度。镜面反射运动用 VectorOps.mirror方法实现。小球是通过MeshOperator类实现 的。其实它是运用区域遮盖的方法来显示小球的。小球的3D立 体效果则通过调用一个rediBal1.m3g文件来实现。Ball类的动 作流程如图3所示。 (Beginning(开始)) ialization the moving,rotation.bounce.impact variables of the ball(初始化小球的变量) To construct the moving of the ball(构建球的运动) J垂蠢 The baIl iS rebounded j This game ls 0ver (重新发射小球)广] (游戏结束) I 。ad pecd。 (增加球速 i IF(否) T(是) 、 r 厂r 图3 ball类的动作流程 下面是ball类的部分程序代码: public class Ball{ Group ball=null; //小球运动的量 lfoat[]moveVec=null; |H、垛的转挟 Transform trBall=new Transform(); //再定义一个临时量 lfoat][coords; //小球旋转的量 lfoat rotated=0 Of;||弹起的量 int bounces=0; ||磕撞交叉 Raylntersection ri=new Raylntersection(); Mesh meshBalI=nulI: /“构造小球运行★/ public Ball()throws IOException {Object3D[】ballObj=Loader.1oad(”/res/rediBal1.m3g”): //找节点 int__O: while(](ballObj[i】instanceof World)) {i++;) ball=(World)ballObj[i]; int count=bal1.getChiIdCount(); for(int.i=O:j<count;++j) {if(bal1.getChild(j)instanceof Mesh) {meshBall=(Mesh)bal1.getChild(j); break; ) ) bal1.removeChild(meshBal1); ball=null; System.gc0; //小球从挡板出发 trBall=new Transform(); coords=VectorOps.vector(0.Of.O Of,1 O.Of): ) Public Boolean render(Graphics3D g3d,Group walls, oat口口口wallVectors,lfoat[]paddleCoords) {trBal1.setldentity0; if(moveVec!=nul1) {ri=new Raylntersection0; lfoat][nMove=VectorOps.normalize(moveVec); ||是否衣琏撞 if(walls.pick(一1,coords[0],coords[1],coords[2],nMove[0], nMove[1],nMove[2],ri)&&ri.getDistance()<=O.5f】 {//有碰撞的话得到我们的面 Node n=ri.getlntersected0; //镜面反射 moveVec=VectorOps.mirrOr (moveVec,wallVectors[n.getUserID()】[2]): //让玩家通过移动挡板来反弹小球 if(n.getUserlD0==M3GCanvas.PADDLE_wALL) {//增加额外的速度 lfoat distX=(paddleCoords[0]・coords[0])/1 O.Of; lfoat distY=(paddIeCoords[1】一coords[1])11 O.Of; moveVec[0]=Math.max(一0.3f,Math.min (moveVec[0]一distX,O.3眦 moveVec[1]=Math.max(一0.3f,Math.min(moveVec[1】 一distY,0.3f)):1130回合后加速 维普资讯 http://www.cqvip.com
Computer Era No.7 2008 moveVec[2]=moveVec[2]>07(moveVec[2]+0.01 f1: (moveVec[2]一O.01 f); bounces++; 装一>运行。J2ME Wireless Toolkit自动对MIDlet套件打包。 打包产生两个文件,即一个MlDlet描述符manifest.mf和一个 MIDlet套件JAR。游戏运行画面如图4所示。 ) ) coords[0]+=moveVec[0]; coords[1]+=moveVec[1]; coords[2]+=moveVec[2]; ) boolean quit=coords[2】>:O.Of; rotated+=1 5.Of; trBal1.postTranslate(coords[0],coords[1],coords[2]); trBal1.postRotate(rotated,1.Of,1.Of,1.Of): if(quit) ( moVeVec:nuII: coords VectorOps.vector(0.Of.O.Of,10.00; ) return quit; 图4游戏开始界面 5结束语 本系统实现了手机上以J2ME为平台的3D弹球游戏,场 景是立体空间。程序在虚拟机上可以顺利地运行。 ) public void start() {Random r=new Random(); bounces=0; 本系统将一个平面图片变换成了3D场景,小球经过变换 后具有立体感。目前手机3D游戏还很少,本文所述内容可为 3D游戏的研发提供参考。 参考文献: moVeVec=VecforOps.vector(一0.1f+r.nextFIoat0 0.2f,一O.If+ r nextFIoat0 0.2f,O.1f】: coords=VectorOps.vector(一3.of+r.nextFIoat0 6.Of.一3.Of +r nextFIoat() 6 Of,一5.Of): 【1】瞿英.J2ME平台下文本阆读器的实现【J】微计算机信息,2005、10: 151~153 ) public boolean isMoving()(return moveVec I=null;) public int getBounces()(return bounces;) 【2】周勇杰.基于J2ME的手机在线棋粪游戏系统【J1..汁算机工程与设 计.2005 12. 【3】郭春雷,基于J2me的手机远程监控软件的分析与实现【J】.计算机系 统应用.2005.11. 【4】许向锋.基于J2ME的Java手机软件开发 微型机与应用,2002.1 4程序打包、下载安装与运行 一Peter V Mikhalenko.Developing Wireless Bluetooth Applications 个完整的开发周期通常包括:编辑源代码一>打包一>安 J2ME・Java D。ve 。P。 Journal,2005.1. 酾 (上接第47页) 翟 现方法。OpenGL和3DS MAX结合实现三维仿真既利用了 3DS MAX建立模型方便怏捷的特点,又利用了OpenGL容易 实现交互性的特点,可以方便地在不同平台和系统间移植。利 用本文所述方法构建虚拟系统,简单方便,通用性好,这对于快 速开发可视化系统具有实际意义。 参考文献: 【1】Grigore C.Burdea[蔓】,Philippe Coiffet[法】虚拟现实技术(第二版) 【M】.电子工业出版社,2005 【2】黄心渊等3DS MAX 5标准教程【M】.人民邮,It出版社,2003. 【3】李长春等基于VC++与OpenGL的三维囤形环境的构建[J1.电脑 图3系统运行界面 开发与应用,2004.17(6):10~13 【4】和平鸽工作室.OpenGL高缀编程与可视化系统开发【M】中国水制 水电出 ̄,2002. 5结束语 本文给出了一种构建桌面虚拟现实系统的基本过程和实
因篇幅问题不能全部显示,请点此查看更多更全内容