您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页J2SE网络游戏设计与实现

J2SE网络游戏设计与实现

来源:华佗健康网
2013年1O月 第34卷第1O期 计算机工程与设计 COMPUTER ENGINEERING AND DESIGN Oct.2013 Vo1.34 No.10 J2SE网络游戏设计与实现 徐增敏 ,崔忠宁。,湛永松。,陈光喜。 (1.桂林电子科技大学数学与计算科学学院,广西桂林541004;2.广东欧珀移动通信有限公司, 广东东莞523860;3.桂林电子科技大学计算机科学与Z-.程学院,广西桂林5410O4) 摘要:针对J2SE网络游戏研究较少的情况,基于J2SE版本语言,提出通过规则制定、元素设计和模块分析3个步骤说 明休闲游戏的设计思路和过程,采用图像编程、事件响应、碰撞检测、多线程、网络通信等技术开发出适合多用户联机对 战的游戏。测试结果表明,该软件在Ubuntu/Windows平台上运行正常,具有很强的趣味性和可移植性。 关键词:Java2标准版;图像编程;碰撞检测;消息传输;网络游戏 中图法分类号:TP311.11;TP393.09 文献标识号:A 文章编号:1000—7024(2013)10 3574—06 Design and realization of J2SE network game xu Zeng-min ,CUI Zhong—ning。,ZHAN Yong song。,CHEN Guang-xi。 (1.School of Mathematics and Computational Science,Guilin University of Electronic Technology,Guilin 541004,China; 2.Guangdong OPPO Mobile Telecommunications Corporation Limited,Dongguan 523860,China;3.School of Computer Science and Engineering,Guilin University of Electronic Technology,Guilin 541004,China) Abstract:Aimed at the problems of few researches on J2SE network games,the design of casual game based on J2SE is presen ted by making rules,designing element and analyzing models,a multi—player game is also developed by graphic programming, event response,collision detection,multi-threads and network communication.The results show that this software,which iS funny and highly transferable,can run very well on Ubuntu/Windows OS. Key words:Java2 standard edition(J2SE);graphics programming;collision detection;message passing;network game 0 引 言 目前对于Java游戏程序的研究主要有:文献[1—3]从 框架模式上进行分析,根据应用特点讨论了UMI 模式、 采用的语言版本基本以J2EE和J2ME为主,很少有关于 J2SE网络游戏设计的具体研究;同时,由于国内游戏厂商 创作的游戏缺乏创新,基本依靠用户积累或模仿其它游戏 获得经济效益,而且现有文献中主要是针对开发技术和实 现框架的探讨,缺乏对游戏主题的思考和分析,因此本文 B/S模式和MVC模式的游戏开发;文献[4 6]从图形图 像上进行研究,主要对图形结构和3D设计展开讨论;文献 E7]在课程设计中开展网页游戏编程吸引学生,结合 从休闲游戏主题设计出发,根据游戏特点分析模式应用情 况,通过角色和场景功能制定规则,阐述了J2SE网络游戏 Ax技术加深对Java程序设计的认识和技能;文献[8, 9]考虑从面向应用的设备进行设计,结合蓝牙、Android 开发的详细过程。 等技术开发软件;文献[1Ol指出Java渲染性能较低,提 出一种兼容AWT/Swing控件的架构以提升Web用户体验; 文献[11 13]则主要在J2ME平台上进行游戏设计。以上 文献大多是在web网页或智能手机平台上进行软件开发的, 收稿日期:2013—01—28;修订日期:2013-03—29 1 J2SE网络游戏设计 J2SE网络游戏可使用c/s模式来实现多用户互联,保 证各个客户端同步的情况下应尽可能少的向服务器发送消 息,减轻服务器的压力。游戏软件的设计包含规则制定、 基金项目:广西教育厅科研基金项目(201102ZD016);广西可信软件重点实验室开放课题基金项目(kx201102);广西自然科学基金项目 (2013GXNSFAA019330) 作者简介:徐增敏(1981一),男,广西梧州人,硕士,讲师,研究方向为智能计算、多媒体;崔忠宁(1988一),男,广西河池人,工程 师,研究方向为计算机应用技术;湛永松(1979一),男,广西宾阳人,博士,副教授,研究方向为数字媒体技术、计算机图形学;陈光喜 (1971一),男,四川金堂人,博士,教授,研究方向为智能算法、信息安全。E-mail:xzm@guet.edu.cn 第34卷第10期 徐增敏,崔忠宁,湛永松,等:J2SE网络游戏设计与实现 元素设计和模块分析3个步骤,关键技术涉及到图像编程、 事件响应、碰撞检测和网络通信4个方面。同时,在整个 游戏进程中采用多线程负责界面重绘、消息传输以及角色 功能的实现,可以使各项任务有序进行,不会互相干扰。 1.1规则制定 考虑到休闲游戏应以绚丽有趣为设计思路,本游戏使 用多人联机模式提升多用户趣味性,按照加入的顺序号也 就角色的id奇偶性将所有玩家分为两方进行夺宝。游戏场 景中有很多宝物,如宝石、书本、苹果等,在规定时间内 或者战场上已经没有宝物的情况下,哪一方搬动到大本营 的宝物价值总和多则赢得胜利。对游戏规则、操作技巧的 主要设计如下:宝物价值和重量成反比,宝物越贵搬动时 就越慢;部分宝物藏于墙中,需把墙炸毁才能取到宝物; 角色阵亡后会变成空壳,空壳是最有价值的宝物;角色视 野有限,在屏幕上反应为400个像素;子弹的射程是380 个像素;场景中会随机出现龙卷风,处于龙卷风下为隐身 状态;被子弹击中后生命值会下降,移动速度在一定时间 内也会减缓;吃到宝物可以获得各种特效;按加速键可以 加速,但加速太久会导致后一段时间行动缓慢。 1.2元素设计 用户角色是游戏中最重要的元素,本游戏提供了两种 角色,一是七星瓢虫,二是臭龟子。多个角色之间用颜色 ◆ ●懋 进行区分,除了用户角色之外,子弹是与角色关系最紧密 o £静毒 的元素,部分角色相关设计如图1所示。场景元素主要分 为无价值和有价值元素,需要注意的是当角色阵亡后会变 l|I▲ 7. 为有价值元素。用户主要抢夺场景中的有价值元素,所以 宝物的种类应该丰富,元素的选择设计足以吸引用户,还 蠢参■ 可应该考虑各种宝物的具体价值和特效作用。为了让游戏 有2.5D的效果,采用了按级排序显示的方法来进行元素分 层__】 。游戏中很多宝贝有动态闪烁效果,需要设计多张图 片来实现的,在图2中仅列出每种宝贝第一张显示的图片。 O o◇9 9 9◇9 m e ̄ .o 图1 角色相关设计 1.3模块分析 对游戏主要功能模块的分析十分重要,因为每个功能 模块都对应着相应的程序。正常运行该游戏需要至少两个 角色:用户和管理服务器的工作人员。针对这两者的不同 情况,分别设计客户端程序GameClient和服务器端程序 GameServer,具体功能模块设计如图3所示。 图2宝物元素设计 图3客户端和服务器端的功能模块 2关键技术研究 游戏主框架包含3个模块:一是场景模块;二是通信 模块;三是说明模块。通信模块和说明模块都包含游戏主 框架当中,这个框架从Frame类继承来实现,并用show— Frame()方法显示。在场景模块程序设计中,通过建立一 个PaintThread线程类,专门负责界面的重绘。因为这个线 程类只为重绘客户端界面而服务,所以将其写为Game— Client的一个内部类,PaintThread类实现Runnable接口, 并重写了其run()方法。下面对游戏中涉及的关键技术进 行研究和分析。 2.1图像编程 在场景设计过程中,还需要解决3个主要问题:第一 个是如何将图像从硬盘装载到程序可用的内存中;第二个 是元素循环移动以及图像闪烁的现象;第三个是部分元素 动态效果的实现。下面分别对这3个问题进行分析处理: (1)本程序使用Java提供的Toolkit类来将图像从硬 盘装载到内存中,同时利用Java反射机制动态获取对象的 信息,通过判断元素的实例,在其第一次实例化时,找出 图像资源并装载到内存中,将图像变量声明为静态l_1 ,避 免内存资源的浪费。 (2)为了解决游戏元素在移动过程中出现闪失的现 象I】 ,程序采用Java图形重绘方法,通过建立一张虚拟的 计算机工程与设计 画布,在update()方法中把所有的元素先画到这张虚拟 2.3碰撞检测 2013钷 的画布上,然后通过paint()方法就可以直接一次性的将 所有的元素图像显示到屏幕上。 (3)Java本身不支持多帧动态图像,因此本游戏中某 最初的碰撞检测从静态几何计算开始,对算法精度要 求高,但不强调实时性,随着仿真场景要求的不断提高, 研究人员提出了各种动态碰撞检测算法,以解决不同的碰 撞问题l1 。碰撞问题由碰撞检测和碰撞处理两部分组成。 虽然游戏公司都有自己的游戏引擎,但是碰撞问题已经被 封装起来,而本游戏对所有功能都需要重新设计。游戏中 些元素的动态效果,需要将图像先加工好后再使用。先将 动态图像的每一帧都导出成单个静态图像,得到的多张静 态图像在程序中以一个数组的形式出现,对图像的处理即 转换成了对数组的操作[1 。fruit各帧图像见表1。 表1 fruit各帧图像表 实现fruit动态显示的关键代码: if(fruitStep一一44){ j+一0.02; fruitStep+一J; if(j>一1.O){ j—O; } }else{ g.drawlmage(imgs[fruitStep],X,Y, nul1); fruitStep++; ) if(fruitStep一一50){ fruitStep=44; } 2.2事件响应 用户角色主要有3个功能:移动、射击和搬运宝物, 采用Java的事件响应机制可实现对键盘、鼠标的响应。当 事件发生时,事件源会把事件对象发送给所有注册过的监 听器,不同事件对应相应的接口,事件发生后在其 内部的事件响应器中负责对事件做出响应。除基本的8个 方向移动外,用户角色功能还包括发射子弹、拿起或放下 宝物、移动加速。角色各个功能的实现都是对按键的响应, 主要的功能事件分为3种:按下、抬起键盘和抬起鼠标。 keyPressed(KeyEvent e)函数是处理键盘按键按下的 事件,KeyEvent表示组件中发生键击的事件。当按下、释 放或键入某个键时,组件对象(如文本字段)将生成低级 别事件,该事件被传递给每一个KeyListener或KeyAdapter 对象,这些对象使用组件的addKeyI istener方法注册,以 接收此类事件。如果按下的是A,D,W,S其中一个或两 个键时调用move(),而角色在移动时按下Shift则可以起 到加速作用。keyReleased(KeyEvent e)函数是处理键盘 按键抬起的事件,x键每次抬起程序都会调用pick()函 数,第一次的作用是捡起宝贝,第二次则是放下宝贝,依 次循环。每次抬起C键程序则会调用fire()函数发射子 弹。mouseReleased(MouseEvent e)函数则是处理鼠标按 键抬起的事件,e一一BU r()N1一MASK表示抬起的是 鼠标左键,等同于键盘C键抬起。 常见的碰撞检测法有圆形物体的半径检测法、三维标准平 台方程法、边界框法等_1 ,虽然用物体几何形状作边界框 最准确,但是因为网络游戏强调实时响应,而复杂的边界 框会增加大量浮点计算,所以本游戏设计采用边框法,通 过加入不可见的边界,检测两个物体的边界框是否相交。 本文采用矩形边框作为物体的边界,对物体碰撞具体 情况进行分析。如图4所示,设物体1的左上端点坐标为 (xl,y1),宽度wl,高度hl;物体2的左上端点坐标为 (x2,y2),宽度w2,高度h2。那么这两个物体满足碰撞的 条件为 {collis 。n l < 且Oy< }(1) 式中:Ox、0)卜一两个物体中心在X轴和Y轴坐标上相间 隔的距离。具体计算时,式(1)可以展开为以下形式 fl(xl+ )一(at2+ )l<  Il( 1+ )~( 2+等)l< (2) (0,o1 (0,o1 (b) 图4边框检测法 第34卷第1o期 徐增敏,崔忠宁,湛永松,等:J2SE网络游戏设计与实现 以检测子弹和角色的碰撞为例,图5说明了游戏中两 颗不同方向的子弹与一个角色之间的碰撞问题,其中子弹 和角色的边框选择约等于该元素的最大内正方形。 图5中的u是沿Y轴负方向移动的子弹的右边框的移 动路径,L2、L3、L5和I 7分别是角色的各边框所在的坐 标线,L4和L8是角色上下边缘的切线,L6则是沿X负方 向移动的子弹的下边框。在程序设计中设置角色的内边框 大小设为3O×30(单位:像素),而子弹的边框大小为 1O×10(单位:像素)。在上图中沿X轴负方向(向左)运 动的子弹的边框和角色边框有重合部分,即已经发生碰撞。 沿Y轴负方向(向上)运动的子弹虽然子弹和角色有接触, 但是两者的边框没有重合部分,故判定为未发生碰撞。这 部分关键代码句是this.1ive&&P.isLive()&&this.good !一p.isGood()&&this.getRect().intersects(p.getRect ()),其中this.1ive是确定图中所示的子弹和角色都还活 着,this.getRect().intersects(P.getRect()就是判定子 弹和角色是否发生碰撞,如果发生碰撞就返回true,否则返 回false。解决了碰撞的检测问题,接下来就是对发生碰撞 后的处理,处理的详细设计如图6所示。 的生命值减5 被击中角色 ——+ 位置变动的消息 创建一个物品 否 将物品变动的消 息发送给服务器 J 否 向爆炸容器中增 L— 加一个爆炸对象 J 设置物品与角色 降低角色 处于脱离状态 的移动速度 V,l + 将角色设为 厂,-_==■、 阵亡状态 \ 竺 ./ 图6碰撞处理流程 2.4网络通信 联机对战的实现是本游戏程序设计中最重要的部分, 这涉及到3个技术点,分别是多线程、10流和网络编程。 其中游戏消息的收发都要经过封装、解析的过程,这些处 理要靠IO(输入/输出)编程结合网络编程来实现。程序 采用TCP和UDP两种网络传输协议,分别用于提供IP环 境下的数据可靠传输和密文信息传输。 2.4.1基于c/s模式的网络通信 基于c/s模式的网络通信需要写两个应用进程。由于 客户端程序GameClient类已经负责主战场的绘制和其它一 些工作,而网络消息处理又比较复杂,所以把对所有客户 端网络消息的处理封装成一个类,名称为Net,该类专门负 责网络消息的处理,如消息的发送和接收。因为服务器端 程序GameServer类就只是负责网络消息的收发,就不用再 新建一个类来处理网络消息了。网络上的两个Java程序通 过一个双向Socket通信连接实现数据的交换。由于在对不 同的数据进行读取的时候,采取的方式会有所不同,所以 本游戏对流的处理采用大管道套小管道的方式,小管道是 指最初基本的流读取,外面的大管道可以增加缓冲功能和 流的读取功能,可以套多层管道满足程序要求。 2.4.2网络消息的传输 本游戏中需要传输的网络消息比较多,有角色移动、 搬运物品、子弹消亡等消息,各种消息本身的内容互不相 同,因此每一种消息都被封装成一个类,在此只对角色移 动消息类ProtagonistMove进行解析。针对网络消息种类繁 多的特点,编写了一个News接口,不同消息类的任务就 只要去实现它。首先建立一个ProtagonistMove类,实现 News接口。public ProtagonistMove(int id,int X,int Y, Direction direction,Direction ammDir)是ProtagonistMove 类的构造方法,其中参数id是指角色的id,X和Y代表角 色的位置坐标,direction是角色的移动方向,ammDir则是 指炮筒的方向。ProtagonistMove类中最重要的两个方法分 别是send()和parse()。send(DatagramSocket ds,String IP,int udpPort)的功能是向服务器发送与角色移动相关的 UDP数据信息,在写信息的时候主要用到了writelnt() 方法,该方法可以将一个int值写入输出流,最终用 ds.send(udp)将数据发送出去;parse(DataInputStream dis)的功能则是解析接收到的数据,将角色移动相关的信 息取出并执行相应操作。在读取数据过程中主要使用 readInt()方法,该方法可以读取4个输入字节并返回一 个int值。下面给出ProtagonistMove类中send()方法和 parse()方法对应的流程如图7和图8所示。 2.4.3发送广播及密报 广播是指对阵双方都可以收到消息,密报则只有战友才 可以收到消息,在操作上体现为:单击“发送”发按钮送广 播消息,单击“秘密发送”按钮则发送密报消息。之前已经 ・3578・ 计算机工程与设计 2013钲 str—tfTxt.getText().trim(); //获取文本框输 入内容 Chatting news—new Chatting(str,getMyPro— 建立.输出流baos r—+ 创建数据包udp tagonist().getId(),1); //封装消息为密文 getNet().send(news); //发送消息 格式化baos数据 发送数据包udp tfTxt.setText(””); //清空文本框 } }); 将newsType,id,x,Y, direction,ammDir 写入baos /^\否 < 捉到异前 \/ 3游戏运行与测试 本游戏在Ubuntul0.10操作系统下使用的Eclipse IDE 人< 捉到异 \/ 姓 否 k l是 异常处理 开发环境中完成开发,在使用sun.audio对音频编程的同 时,选择Eclipse的开源插件fatjar工具为后期生成应用程 序做准备,经过压缩优化后的游戏服务器端和客户端程序 大小均只有8.2MB。每个用户需要一个游戏账号才能进行 异常处理 『=■、 \.兰 /、 游戏,每个账号的游戏进度及各种游戏信息都被保存在服 务器端。 3.1测试环境 JDK1.6,Ubuntul0.10,Windows XP SP2/SP3,Win— dows 7,TF LINK TDW89741N。 图7 send()方法执行流程 3.2测试方法 测试使用java的System.nanoTime()获取精度为纳 秒级别的系统时间,通过计算屏幕每秒绘制图片的帧数 FPS来表示游戏流畅度。局域网由ADsL无线路由一体机 搭建,选用4人进入该局域网联机游戏,分别在以上4个 操作系统运行游戏,4个角色的颜色各不相同,其中两个 是臭龟子,另外两个是七星瓢虫。因为各个客户端程序是 相同的,所以只需要使用一台硬件配置稍好的计算机作为 服务器,然后再用4个客户端连接服务器IP地址进入服务 器,对每个客户端进行实时帧数的跟踪测试。 图8 parse()方法执行流程 3.3测试结果 游戏场景的运行情况如图9和图10所示,经过3局对 实现了该模块的框架,现在仅需要做进一步加工,addAc— tionListener(new ActionIAstener(){})表示给组件添加指定 的动作,以接收发自此按钮的动作事件,其余的工作 战并统计测试帧数后,结果表明该软件运行情况良好,服 务器程序能正常收发各种游戏信息,各客户端在局域网下 实时帧数高,响应速度快,能很好地支持不同操作平台上 多人联网对战。由于本游戏未使用显卡绘图功能,而且各 客户端的硬件配置和系统平台上有所差异,因此在客户端 登录、射击子弹密集或元素爆炸等网络消息传输量较大时, 客户端的实时帧数会有一定波动,测试结果详见表2。 如IO编程和收发信息,都和游戏消息接收类似。 cB.addActionI。istener(new ActionListener k 『『 为组件cB创建一个匿名类作为动作 public void actionPerformed(ActionEvent e){ 表2局域网下游戏性能测试 

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

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

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

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