ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:491.43KB ,
资源ID:4383794      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4383794.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络游戏的设计与实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

网络游戏的设计与实现.docx

1、网络游戏的设计与实现 网络游戏的设计与实现网络游戏开发是一项很大的工程,需要很多综合性的知识。这对于刚刚入门的开发者来说很难理解。本论文从研究开发一个模仿泡泡堂网络游戏的例子出发,讲述网络游戏开发中用到的一些最基本的知识和设计思想,使大家清晰的理解游戏开发的过程。整个设计中利用java中的swing编程,结合游戏的操作流程,对整个游戏进行精心的设计和大量的测试,实现游戏软件服务器端和客户端的开发,为玩家提供一个友好美观的操作界面,并添加聊天等功能以增加玩家之间的互动性,此外实现了可编辑场景地图的功能,使得游戏内容的更加丰富,玩家交互性更好,确保了游戏更具有趣味性、灵活性,以满足玩家对这款网络游

2、戏的要求。1引言1.1课题背景最近几年游戏产业特别是网络游戏得到飞速发展。而随着人们工作节奏的加快,小型的、竞技性的网络游戏因为游戏所需时间短,竞技性和娱乐性强等特点,越来越受到工作人士的喜爱。盛大公司推出的“泡泡堂”是一款比较好也是比较成功的网络小游戏。本课题就是想对该游戏进行分析研究,借助于它的游戏规则,用java语言模拟开发一个类似的,功能相对简单的网络小游戏。从而使自己更清楚的认识小游戏开发需要的知识和开发的环节和涉及到的领域。泡泡堂游戏简介在2004年全世界最火爆、在线人数最多的网络游戏,不是传奇、奇迹等深受欢迎的传统MMO,也不是梦幻西游、剑网、巨商等一大批后起之秀,而是盛大旗下的

3、一款休闲游戏泡泡堂。泡泡堂是韩国第一人气网络游戏,拥有多达2500万的注册用户。它以简单趣味征服玩家。有专家将玩家区分为临时玩家、中间玩家和忠实玩家三类。而泡泡堂的服务对象大部分都是临时玩家。对于这一概念的定义为:年龄层从10岁到20岁甚至35岁左右,每天平均游戏时间约为2小时,希望选择可以即刻得到结果、界面简洁的游戏。临时玩家是互联网娱乐初级阶段的玩家层,对数字娱乐有一定渴望,对上手较难的游戏有畏惧感。他们比忠实玩家要更广泛,而且还是最有开发价值的目标人群。有资料统计,在美国临时玩家和忠实玩家之间的比例大约是50:1,在中国这种差距可能会更高。 而休闲游戏恰恰抓住了这些临时玩家对互动娱乐的需

4、求。休闲游戏简单轻松,趣味十足,临时玩家们在短时间内就可获得游戏所带来的互动趣味和成就感。这些其实是休闲游戏成功的最大法宝。开发商非常清楚的认识到了这一点,他们以红白机的炸弹人作为原形,针对市场开发出了泡泡堂。使游戏操作简单,极易上手,富有乐趣,充分吸收了炸弹人的诸多优点。在保留精髓的同时,泡泡堂还开发了一些有创意的玩点,加入一些很有影响力的娱乐元素(Avatar),使产品线更丰富,满足了临时玩家多方面的互联网娱乐需求。本课题研究的意义本课题以开发该游戏为平台,综合运用网络编程,数据之间的通讯,程序中算法的实现,线程的分配,程序运行中的内存使用情况的控制等。通过这些技术的综合运用,更深入的了解

5、计算机程序方面的相关知识,熟悉游戏开发的理念和流程,了解整个游戏项目开发的关注点。该课题属于研究性的一个课题,不考虑商业上的应用。只是对技术研究的并不是游戏本身的娱乐性。2开发的环境及相关技术的介绍开发环境操作系统:Microsoft Windows XP开发语言:java 2开发包:Java(TM) 2 Standard Edition (5.0),JFC Swing.IDE: Eclipse 3.2测试环境:局域网,PC机Java语言的特点1. 平台无关性Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。Java的数据类型与机器无关。2. 安全性Java的编程类似C+

6、,但舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。3. 面向对象Java吸收了C+面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。4. 分布式Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。5. 健壮性Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、g

7、oto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。3需求分析本设计主要是实现一个类似于“泡泡堂”功能的网络游戏。其操作流程及其主要功能如下介绍游戏的操作流程游戏的操作类似于网络游戏QQ堂。其操作流程如图1所示。图1 游戏操作流程1. 首先要先运行服务器端,来处理各个客户端发来的请求。2. 玩家运行客户端,首先展现一个版权声明的界面,因为游戏中的图片来源于腾迅公司的QQ堂游戏,图片的版权归腾迅公司所有。3. 几秒后自动跳到登录界面。在这里输入用户名称,密码。因系统中没有对数据库进行操作,并没有保存用户的相关信息,所以没有注册的功能,也没有对密码的正确与否进行验证。

8、输入密码后点击登录进入游戏大厅,退出则关闭程序。4. 进入大厅后,用户可以选择自己的角色,蓝队或者红队,并可以进行聊天对话。点击准备时将进入准备状态。当所有用户都进入准备状态,游戏自动进入对战场地进行对战游戏。5. 在对战时,玩家可以用方向键盘控制人物的移动,人物只能在空地中移动,当遇到“箱子”时,可以使用“空格键”放置“泡泡”,利用“泡泡”的爆炸的威力去破坏周围的障碍物(“仙人掌”不能被破坏掉)。同时可以一连串放置多个“泡泡”,放置“泡泡”后,“泡泡”将持续几秒钟才会爆炸,在这段时间玩家可以放置更多的“泡泡”来攻击对手,在运动过程中还要及时躲开“泡泡”的爆炸区域。当玩家被“泡泡”炸中,则该玩

9、家的生命将结束,不能继续进行游戏6. 当有一个队中的所有玩家都死掉,则该队挑战失败,对方获胜。应该解决的问题本程序需要解决的主要问题:1. 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。2. 网络计算机之间的数据通讯:用socket进行编程,同时由于对人同时游戏,要尽量减少网络数据的传输量,提高传输效率,防止堵塞。3. 算法的设计:

10、算法是游戏的核心,要设计很好的算法,提高游戏运行的效率,运行速度要高,并且资源占用的要少。4. 线程的控制:由于涉及到对个玩家,并且要即时的将数据进行网络传输,因此可以用多个线程来并发执行这些操作。线程之间的同步和调度上要很好的控制。5. 双缓存:在图片之间相互调用转换时,图像的画面要流畅,不能有停顿和闪烁6. 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,这里使用了QQ堂游戏里的一些截图来美化界面,同时对解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。以上相关技术细节和整体流程将分别在以下小节阐述。4系统设计本游戏开发采用C/S结构,分为服务器端和客

11、户端两部分。处理流程服务器端主要处理各个客户端发过来的消息(Message),并根据消息的类型,对消息进行不同的处理,然后将处理后的消息转发或者直接转发消息到所有玩家。客户端则监听用户的输入动作,包括键盘和鼠标动作,对于不同的动作做不同的处理,并根据玩家动作的类型,把所有信息封装为一个消息的实体(Message),然后发到服务器端。同时要监听服务器端的回复过来的消息当收到一个新的消息,将对消息进行解析,根据消息的类型作不同的处理,从而改变游戏场景或者状态等。处理流程如图2所示。图2 处理流程数据流在整个系统中,客户端和服务器端所有的信息都是通过一个封装的Message来传输的 ,它们的传输数据

12、流如图3所示(这里以一次通讯为例)图3 数据流当一个客户端把玩家的动作封装为一个的消息,之后发送到服务器端。服务器端接收到该消息,并对该消息进行解析处理。然后将处理过的消息转发给当前的所有客户端,包括消息的发出者。客户端收到该消息,根据消息的类型来解析,然后处理并改变当前的场景。部署方案因为游戏为一个网络游戏,要多个玩家同时参加互动。所有程序有服务器端和客户端两部分。它们部署图如图4所示:图4 部署图服务器端部署服务器端程序,负责保存当前玩家的信息,对客户端发过来的消息进行处理并转发等。客户端只需要部署客户端程序,负责发送消息并处理游戏主要逻辑。5系统实现代码结构图5 代码结构程序是用ecli

13、pse平台开发,在该平台下代码组织如图5所示。代码结构的详细介绍参考表1。表1 代码结构介绍文件夹包名称类描述Src游戏源代码net.jeson.game.util(存放系统中经常用到的类,系统级)GameKey.java系统级参数Util.java系统级的类net.jeson.game.server(存放服务器端相关的类)Server.java服务器端的主程序net.jeson.game(存放启动游戏所有到的类)Game.java启动游戏的入口类net.jeson.game.biz(存放处理一些业务逻辑的类)Bomb.java管理放置的“泡泡”的类Message.java用来封装客户端和服务

14、器端直接通讯的消息的类MessageManager.java管理消息的接收和发送ponent(存放一些可以被重用的swing组件,主要是用来UI的设计)CenterShowDialog.java把窗口显示的位置在屏幕上居中GameImage.java管理图片加载创建的类ImageButton.java定义一个图片按钮ImageLabel.java定义一个图片的label.ImagePanel.java定义一个图片的panelnet.jeson.game.ui(游戏主要显示的界面)Login.java登陆游戏的界面GameHall.java游戏大厅的界面QQFrame.java启动对战场景的窗口

15、QQPad.java对战场景中的画布Images(存放游戏所用到的图片)Map(存放游戏对战场景中的地图。)公共类的介绍系统中定义了一些公共的类,可以被客户端和服务器端多次使用,这些类里的方法多是静态的。GameKey.java这里定义了一些系统级的一些参数,都是静态的。Util.java主要定义了4个方法,用户测试时候打印信息的,全屏的,和关闭显示窗口的方法。MessageManager.java声明了发送消息和接收消息的两个方法。控制着客户端和服务器端之间的数据交换。服务器端的开发服务器端开发是使用JAVA语言中的套接字,采用TCP协议进行通讯的。通讯的数据全部封装在一个Message类里

16、面。这些数据在网络之间传输并在客户端和服务器端进行解析,得到后作出相应的动作。处理流程参考图6.图6 服务器端处理流程服务器端主要用到了java中的网络编程和线程。在构造函数中,利用默认端口创建一个套接字ServerSocket(Port);然后进入一个无限循环来监听网络连接,每当有一个新的客户端连接到服务器,建立一个新的线程来处理该客户请求。之后服务器端继续监听,等待新的客户端连接。try serversocket = new ServerSocket(port); System.out.println(Game Server started at: + serversocket.getIn

17、etAddress().getLocalHost() + : + serversocket.getLocalPort(); while (true) /设置玩家的编号:1-8 if (number 8) number+; else number = 0; continue; clientsocket = serversocket.accept(); System.out.println(Connection from: + clientsocket); out = new ObjectOutputStream(clientsocket.getOutputStream(); ht_out.put

18、(clientsocket, out); ServerThread serverThread = new ServerThread(clientsocket, ht_out,number, out, allMessage); Thread thread = new Thread(serverThread); thread.start(); ServerThread被启动后,也执行一个无限循环,对连接通道进行监听,如果有该通道发过来的信息,就对相关的信息进行处理,之后把处理后的消息转发给所有玩家。客户端首先在程序中定义了几个通用的组件和方法:CenterShowDialog, GameImage

19、.java, ImageButton.java ,ImageLabel.java 和ImagePanel.javaCenterShowDialog:这个类的功能是使显示的图形界面居中。ImagePanel:定义一个背景为一个image的画板(panel)GameImage:这里定义了一些对图片操作的类,如创建一个图片等。ImageButton:定义一个图片按钮(JButton)ImageLabel:定义一个图片的标签这些通用的组件和方法供各个模块所公用。一些场景的设置是在它们的基础上进行搭建的。模块设计如图7所示,游戏客户端总体分为4个大的模块:游戏入口,登陆,游戏大厅,和对战场地。图7 客户

20、端模块划分图以下对具体模块的设计进行详细介绍。游戏入口模块 主要类:Game.java 描述:显示一个无标题栏的窗口,提示一些版权信息,如图8所示。图 8 游戏声明首先在它的构造方法中初始化该JFrame的相关属性。在main方法中,先声明一个Game类,创建声明窗口。之后调用Util方法中的showWindow()方法,显示该窗口的动态展开,产生一个动画的效果。窗口将停顿5秒,以便玩家有足够的时间来阅读相关内容。最后调用Util方法中的closeWindow()方法来动态地收缩关闭该窗口。随后创建一个Login类,并将其显示,进入登录模块,同时隐藏该声明信息窗口 。登陆模块主要类:Login

21、.java描述:显示登陆界面(效果请参考图9),并处理相关的鼠标动作,输入玩家名称,密码等,登陆后和服务器建立连接,并发送信息到服务器。(因为不设计到数据库,这里并没有对玩家输入的相关信息进行验证,也没有注册玩家信息的功能)图9 登陆界面因设计到对一些组件的监听,并对鼠标事件进行监听,该类实现了相关方法:public class Login extends JFrame implements ActionListener , mouseMotionListener构造方法调用init()方法对类进行初始化,这里主要是创建了两个ImageButton : login_bt 和exit_bt,两个

22、文本框:user和password,设置它们被显示的位置和样式,同时为两个ImageButton增加鼠标监听事件。当鼠标点击login_bt时,将触发一个事件,捕捉该事件,并进行处理。处理过程:从user和password两个文本框得到玩家输入的信息,把这些信息作为属性值赋值给一个新的Message 实体。创建一个和服务器的新的连接,把这个message发送到服务器段。之后创建一个GameHall: new GameHall(msg,in,out);游戏大厅模块主要类:GameHall.java描述:游戏大厅的主界面,同时负责处理玩家一些鼠标事件,并和服务器进行通讯,发送/接受消息。当鼠标触发

23、一些事件时候,对事件的内容进行解析,然后根据不同的事件,创建不同类型的消息,把相关的必要的信息进行封装,最后发给服务器。由服务器进行处理后,服务器发送消息给所有客户端,客户端接收到消息,并对接收到的消息进行处理,来改变大厅场景。该类中设计到对整个大厅中鼠标和键盘事件的监听,并创建一个主的线程来监听从服务器端发来的消息。因此该类实现了MouseListener, MouseMotionListener, Runnable,KeyListener等接口。构造方法中调用了init()方法 。初始化大厅用到的一些组件。整个大厅是一个ImagePanel,一个画布。所有的组件都是在这个画布上增加。并为这

24、些组件增加一个监听器来监听它们的动作。之后程序启动主线程,对服务器发来的消息进行监听,并在解析后作出相应的动作。thread=new Thread(this);thread.start();当受到一个消息时,根据消息的类型,作出不同的动作。最后调用paint()方法来刷新主画布从而改变场景。调用paint()方法时,首先把所要玩家都移除,然后重新画整个场景:removeAllPlayer()for(Enumeration e=htPlayer.elements();e.hasMoreElements();)Message msg =(Message)e.nextElement();showPl

25、ayer(msg);其中的showPlayer()方发中是根据玩家不同的编号(number)和小组(team)来把玩家的图片画到画布的不同位置。并判断该玩家现在的准备情况,如果准备好了就显示准备状态。游戏大厅中主要实现了小组的选择,聊天功能,准备和取消准备等功能。 小组的选择: 游戏中的小组分为“蓝队”和“红队”,它们的选择图标都是一个ImageButton。当有鼠标点击它们的动作时,将触发一个鼠标点击事件,这时鼠标监听器将捕捉到该动作。然后创建一个新的消息,把玩家的一些信息赋值给该消息,同时设置消息的类别为“更换小组”,最后发送消息.这里以选择蓝队为例:Message test=new Me

26、ssage();test.team=GameKey.TEAM_BLUE;test.type=GameKey.MESSAGE_TYPE_CHANGE_TEAM;test.number=meMessage.number;test.UserName=meMessage.UserName;Util.printMessage(Select Team ,test);当客户端收到Type为GameKey.MESSAGE_TYPE_CHANGE_TEAM (数值为5)的消息时,从保存的所有玩家的信息中得到状态改变的该玩家,并更换它的TEAM,之后还放到HashTable中。 for(Enumeration e

27、=htPlayer.elements();e.hasMoreElements();) Message test =(Message)e.nextElement(); if(test.number=msg.number) test.team=msg.team; htPlayer.put(Integer.toString(test.number),test); 最后要调用paint()方法来重新刷新该画布,改变场景,使该玩家的颜色显示和选择小组颜色一致。 聊天功能:原理和小组选择相似,首先玩家在文本框中输入要发送的消息内容,当点击“发送”的图片按钮时,触发一个鼠标动作。监视器拦截该动作,并得到输入

28、文本框中的信息,把它封装到一个消息里面Message。最后发往服务器 。服务器端只是把消息进行转发给所有玩家。玩家的客户端收到消息后,判断该消息的类型,如果是聊天消息,将聊天的内容提取,然后显示在聊天信息板里面。准备/取消准备功能: 点击准备图片按钮,触发一个事件,然后封装生成一个消息发送到服务器,服务器转发。客户端收到消息后把该玩家的状态改为“准备”。之后判断是否所有玩家都已经准备好,如果都准备好,把全局变量Ready的数值设置为“OK”,然后在主线程里判断这个值从而得到是否所有玩家都已经准备好。都准备好的话就创建一个新的窗口进入对战区。对战场地模块主要类:QQPad.java描述:这个类为

29、游戏大厅的画布,同时处理对战时的主要逻辑,是整个游戏的核心。负责处理了玩家移动,泡泡的放置及引爆,障碍物的清除和胜负判断等多个功能。当玩家进入大厅时,程序首先要初始化场景,包括对地图和玩家位置的初始化,并为场景增加监听器监听玩家键盘和鼠标的动作,之后启动一个主线程。该线程负责处理玩家的鼠标和键盘动作,并对从服务器端接收到的消息进行处理,从而改变当前的场景。当有一个小组的全部玩家都被消灭后,就判断胜负并显示结果,这次对战就结束,返回到游戏大厅。整体流程如图10所示。图10 对战处理流程以下将对几个主要的流程作详细的介绍。地图的生成地图是每个游戏必需的一个元素,地图主要是生成游戏的场景,然后在画布

30、上显示该场景。在开发很多类型的游戏中,地图系统都需要良好的设计,直观的说,我们需要的地图系统仅仅是一个2D数组,然后用最快的方式将数组影射到屏幕上。地图的设计方式有很多,大多数2D游戏是通过开发的地图编辑器来实现的。而该游戏的设计是首先定义一个地图文件,这个地图文件是用一些0,1等数字表示一种物体。然后在用流对该文件进行读取,把内容读取到一个数组里面。不同的数字就会在场景中显示出不同的物体。程序中首先在map文件夹下定义好一个“map1.txt”文件,该文件是由0,1,2三种数字组成:111110010011111111000210100111110012*100010010101001101121101010100002011010101011022*110101*001010101121101100101010010001110010102210011111001012000111111110010011111其中,0在场景中显示的是一个空地,1显示的是一个箱子,2显示为一个植物。之后通过流将数据读取到一个数组里面:while(true) String line=reader.readLine(); if(line=null) reader.close(); brea

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1