多人在线游戏的设计与实现---毕业论文_第1页
多人在线游戏的设计与实现---毕业论文_第2页
多人在线游戏的设计与实现---毕业论文_第3页
多人在线游戏的设计与实现---毕业论文_第4页
多人在线游戏的设计与实现---毕业论文_第5页
免费预览已结束,剩余58页可下载查看

下载本文档

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

文档简介

本 科 毕 业 论 文 多人在线游戏的设计与实现The Design and Implementation of Multiplayer Online Role Playing Game姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级:校外指导教师: 校内指导教师: 年 月摘要中国网络游戏产业已经成为国际公认最具发展潜力的市场。然而在这样一个网络游戏发展快、势头猛的国家,网络游戏的专业制作人才却十分匮乏。其实有志于网络游戏产业的人才不在少数,以高校学生为主,但很多不是专业出身。所以培养人才是目前国内网络游戏行业的当务之急。专家们分析说,网络游戏软件设计人才奇缺已经成为制约我国软件业向前发展的主要瓶颈。但是,中国目前没有直接的高校教育途径进入这个行业,中国的游戏产业在人才的需求和提供上产生脱节,这一断档教育严重制约了民族游戏产业的飞速发展。基于国内网络游戏产业的这种情况,网龙公司特地抽调技术骨干组建了网络游戏软件开发培训部,对外开设培训班。旨在培养中国游戏人才、储备公司人才和扩大公司影响力。为了做到理论与实践相结合,培训采取了理论课程教学结合项目实操的方式,通过实操项目模拟实际项目的开发,让学员真正体验游戏开发的流程,在开发中学习进步。本系统将做为这次培训的最终实操项目。本系统的开发的主要目的为:(1) 搭建游戏服务端和客户端框架,让学员能在此框架的基础上进行游戏实操的开发。框架必须具有必行开发的特性。使学员能同时参与到项目中合力完成实操项目。(2) 实现基本的游戏功能,做为学员的开发参考,也能让学员更容易熟悉框架。(3) 系统中的部分模块代码(如:网络通信模块,数据库访问模块)将作为实例用于理论教学。(4) 尝试将渲染层独立,可采用不同的方式实现渲染层。使渲染层易于替换。关键词:网络游戏;游戏架构;游戏模块化AbstractRecognized by the international organizations, Chinese online game industry has been made the most potential market. However, in the momentum national which has such a fast development of online games, professional production of online games is very scarce talent.In fact, there are many people who are interested in online games industry and most of those are college students, but many are not professional. Therefore, professional training is currently the most urgent task in the domestic online game industry. Some experts said that the lack of software designers in online games is becoming a major bottleneck and constraints the development of Chinas software industry. However, currently in china, there is no directly access to higher education of this industry. The demand and provision of talented person which cant be matched, has seriously decrease the speed of fast development of game industry.Based on the domestic fact, the net-long company particularly deployed technical backbones to set up training department of online game software development, opening training courses for the external.The most purpose is to nurture talent game, reserve of talent and expand the companys influence.To make theory in practice, training courses are taken by way of putting class teaching with project duties. Through simulating development of practical projects, the courses enable trainees to experience the game development process and to learn progress in the development.This system will be used as the ultimate exercise project of the training. The main purpose of developing the system is as following:(1) Set up the framework of games server and client interface, so that students can carry out the development of the game based on the system. The framework should have the characteristic of must being developed. At the same time, students can participate in the project to complete their duties together.(2) As a reference for students, the implement of a games basic functions also will enable students to be familiar with the framework more easily.(3) Part of the system module code (such as: network communication module, database access module) will serve as examples for the theory of teaching.(4) Try to play up the layer independence; the system may take different approaches to achieve the rendering layer, which makes it easy to replace the rendering layer.Key words: Online games; Game structure; Modular games目录第一章绪论11.1选题背景11.2网络游戏发展历程11.3本文主要研究内容4第二章多人在线游戏的需求52.1登陆系统52.2角色系统52.2.1玩家52.2.2 NPC62.3地图系统72.4 AI系统82.5战斗系统82.5.1玩家82.5.2 NPC112.6联盟系统112.7聊天系统112.8数据系统122.9本章小结12第三章多人在线游戏的架构设计133.1服务端架构133.1.1服务端层次划分133.1.2服务器框架构建133.1.3消费者/供应者模式153.2客户端架构163.2.1客户端层次划分163.2.2客户端逻辑模块化设计173.3本章小结18第四章多人在线游戏的详细设计194.1服务端详细设计194.1.1服务端模块的划分和管理194.1.2服务端模块设计224.2客户端详细设计244.2.1客户端模块设计244.2.2客户端渲染层设计254.2.3客户端角色管理器设计274.2.4客户端角色行为设计294.2.5客户端网络消息管理器设计314.3网络通信层详细设计344.3.1网络通信服务设计344.3.2服务端网络通信层设计354.3.3客户端网络通信层设计364.4数据库详细设计364.4.1数据库表格设计364.4.2数据库访问层设计394.5本章小结42第五章多人在线游戏的实现435.1游戏的开发环境435.2游戏的运行配置435.3游戏的运行效果445.4本章小结51第六章总结52致谢53参考文献54contentsChapter 1 Introduction11.1 Research Topics Background11.2 The Development of Online Games11.3 The Main Work of this Thesis4Chapter 2 The Requirements of The Game52.1 Login System52.2 Role System52.2.1 Players52.2.2 NPC62.3 Map System72.4 AI System82.5 Combat System82.5.1 Player82.5.2 NPC112.6 Allies System112.7 Chatting System112.8 Data System122.9 Chapter Summary12Chapter 3 The Design of The Game Structure133.1 Sever Structure133.1.1 Sever Layering133.1.2 Sever Framwork Construction 133.1.3 Consumer/Provider Mode153.2 Client Structure163.2.1 Client Layering163.2.2 The Design of Client Modules173.3 Chapter Summary18Chapter 4 The Detailed Design of The Game194.1 The Detailed Design of Sever194.1.1 The Devision and Management of Modules194.1.2 The Module Design224.2 The Detailed Design of Client244.2.1 The Module Design244.2.2 The Rendering Layer Design254.2.3 Role Manager Design274.2.4 Role behavior Design 294.2.5 Network Message Manager Design314.3 Network Communication Layer Design344.3.1 Network Communication Service Design344.3.2 Network Communication Layer Design of Server354.3.3 Network Communication Layer Design of Client364.4 The Detailed Design of Database364.4.1 Database Tables Design364.4.2 Database Access Layer Design394.5 Chapter Summary42Chapter 5 The Result Game Running435.1 The Development Enviroment of the Game435.2 The Running Configuration of the Game435.3 The Running Effects of the Game445.4 Chapter Summary51Chapter 6 Summary52Acknowledgement53Reference54多人在线游戏的设计与实现第一章 绪论1.1选题背景网络游戏行业作为一种新兴行业,也是一个快速发展的行业。对于一般的人来说,它也是一个神秘的行业,大批的年轻玩家为它着迷。当今中国,网络游戏的开发人才还是相当匮乏。虽然有大批学子有志于投身到网络游戏开发的行列中来,但很多都因专业不对头或者缺乏获得专业知识的途径而终止放弃。基于这种情况,公司程序部特地抽调技术骨干组建了网络游戏软件开发培训部,对外开设培训班。旨在培养中国游戏人才、储备公司人才和扩大公司影响力。为了做到理论与实践相结合,培训采取了理论课程教学结合项目实操的方式,通过实操项目模拟实际项目的开发,让学员真正体验游戏开发的流程,在开发中学习进步。本系统将做为这次培训的最终实操项目。本系统的开发的主要目的为:(1) 搭建游戏服务端和客户端框架,让学员能在此框架的基础上进行游戏实操的开发。框架必须具有必行开发的特性。使学员能同时参与到项目中合力完成实操项目。(2) 实现基本的游戏功能,做为学员的开发参考,也能让学员更容易熟悉框架。(3) 系统中的部分模块代码(如:网络通信模块,数据库访问模块)将作为实例用于理论教学。(4) 尝试将渲染层独立,可采用不同的方式实现渲染层。使渲染层易于替换。1.2网络游戏发展历程网络游戏发展至今,已经有四十多年的历史了。一般的观点将网络游戏划分为三代。第一代网络游戏:1969年至1977年 。背景:由于当时的计算机硬件和软件尚无统一的技术标准,因此第一代网络游戏的平台、操作系统和语言各不相同。它们大多为试验品,运行在高等院校的大型主机上,如美国的麻省理工学院、弗吉尼亚大学,以及英国的埃塞克斯大学。 游戏特征:非持续性,机器重启后游戏的相关信息即会丢失,因此无法模拟一个持续发展的世界;游戏只能在同一服务器/终端机系统内部执行,无法跨系统运行。商业模式:免费。第一款真正意义上的网络游戏可追溯到1969年,当时瑞克布罗米为PLATO系统编写了一款名为太空大战的游戏,游戏以八年前诞生于麻省理工学院的第一款电脑游戏太空大战为蓝本,不同之处在于,它可支持两人远程连线。第二代网络游戏:1978年至1995年 。背景:一些专业的游戏开发商和发行商开始涉足网络游戏,如Activision、Interplay、Sierra Online、Stormfront Studios、Virgin Interactive、SSI和TSR等,都曾在这一阶段试探性地进入过这一新兴产业,它们与GEnie、Prodigy、AOL和CompuServe等运营商合作,推出了第一批具有普及意义的网络游戏。游戏特征:网络游戏出现了“可持续性”的概念,玩家所扮演的角色可以成年累月地在同一世界内不断发展,而不像PLATO上的游戏那样,只能在其中扮演一个匆匆过客;游戏可以跨系统运行,只要玩家拥有电脑和调制解调器,且硬件兼容,就能连入当时的任何一款网络游戏。 商业模式:网络游戏市场的迅速膨胀刺激了网络服务业的发展,网络游戏开始进入收费时代,许多消费者都愿意支付高昂的费用来玩网络游戏。从凯斯迈之岛的每小时12美元到GEnie的每小时6美元,第二代网络游戏的主流计费方式是按小时计费,尽管也有过包月计费的特例,但未能形成气候。1978年,英国的埃塞克斯大学的罗伊特鲁布肖用DEC-10编写了世界上第一款MUD游戏“MUD1”。MUD1是第一款真正意义上的实时多人交互网络游戏,它可以保证整个虚拟世界的持续发展。 1982年,约翰泰勒和凯尔顿弗林组建Kesmai公司,这家公司在网络游戏的发展史上留下了不少具有纪念意义的作品。1984年,马克雅克布斯组建AUSI公司,并推出游戏阿拉达特。这是网络游戏史上第一款采用包月制的网络游戏,包月制的收费方式有利于加速网络游戏的平民化进程,对网络游戏的普及将起到重要作用。1988年,Quantum从TSR手中购得“龙与地下城”的授权,三年后,第一款AD&D设定的网络游戏夜在绝冬城(Neverwinter Nights)诞生。 1991年,Sierra公司架设了世界上第一个用于网络游戏的服务平台The Sierra Network,这个平台有点类似于国内的联众游戏,它的第一个版本主要用于运行棋牌游戏,第二个版本加入了叶塞伯斯的阴影、红色伯爵和幻想空间等功能更为复杂的网络游戏。第三代网络游戏:1996年至今 。背景:越来越多的专业游戏开发商和发行商介入网络游戏,一个规模庞大、分工明确的产业生态环境最终形成。人们开始认真思考网络游戏的设计方法和经营方法,希望归纳出一套系统的理论基础,这是长久以来所一直缺乏的。游戏特征:“大型网络游戏”(MMOG)的概念浮出水面,网络游戏不再依托于单一的服务商和服务平台而存在,而是直接接入互联网,在全球范围内形成了一个大一统的市场。商业模式:包月制被广泛接受,成为主流的计费方式,从而把网络游戏带入了大众市场。第三代网络游戏始于1996年秋季子午线59的发布,这款游戏由Archetype公司独立开发。Archetype公司的创建者为克姆斯兄弟,即将发售的模拟人生在线的设计师迈克塞勒斯和已被取消的网络创世纪2的设计师戴蒙舒伯特都曾在这家公司工作过。子午线59本应是一款划时代的作品,可惜发行商3DO公司在决策过程中出现了重大失误,在游戏的定价问题上举棋不定,面对网络创世纪这样强大的竞争对手,先机尽失,“第一网络游戏”的头衔终被网络创世纪夺走。网络创世纪于1997年正式推出,用户人数很快即突破10万大关。 子午线59和网络创世纪均采用了包月的付费方式,而此前的网络游戏绝大多数均是按小时或分钟计费(收费前通常会有一段时间的免费使用期)。采用包月制后,游戏运营商的首要经营目标已不再是放在如何让玩家在游戏里付出更多的时间上,而是放在了如何保持并扩大游戏的用户群上。与目前国内众多网络游戏“捞一票即走”的心态相比,月卡、季度卡和年卡等付费方式无疑更有利于网络游戏的长远发展,尽管从眼前来看,或许会失去部分经济利益1。网络创世纪的成功加速了网络游戏产业链的形成,随着互联网的普及以及越来越多的专业游戏公司的介入,网络游戏的市场规模迅速膨胀起来。这其中既有无尽的任务、天堂、艾莎隆的召唤和亚瑟王的暗黑时代的成功,也有网络创世纪2、银河私掠者在线和龙与地下城在线的被取消。一些传统的单机游戏开发商,如Maxis、Westwood和暴雪等,也依托自己的品牌实力加入进来,模拟人生在线、远离地球、星球大战:星系和魔兽世界等都是期待度很高的作品。 1.3本文主要研究内容(1) 构建稳定的网络通信层。(2) 搭建服务端框架。(3) 搭建客户端框架。(4) 完成各个模块的逻辑功能。(5) 构建数据库访问层,实现游戏数据的保存。(6) 尝试以不同的方式实现渲染层。第二章 多人在线游戏的需求2.1登陆系统客户端需以帐号验证的方式登陆游戏。2.2角色系统包含玩家和简单NPC角色,各角色属性信息如下:2.2.1玩家玩家:性别,生命,力量,敏捷,等级,经验值等。角色出生拥有7点自由点,可用于力量和敏捷度的分配,每升一级增加3点自由点,由玩家自行分配。玩家的攻击力由原始攻击和力量决定,敏捷觉得角色的攻击速度。角色的原始攻击、生命与等级的关系表如表2-1。表2-1:角色等级、原始攻击、生命关系表等级原始攻击生命159327123381534101625111926132227142528162829173121019342112037212224021323432142544115284501628501172953118325401934549203655821385882240597234360624446362547645264965427516632853693295570230577113159741326175033647593466768356879836708073772816387482539778344080843418187342829034385912448792145899514691960479396948959992.2.2 NPCNPC:等级,生命,最大攻击,最小攻击,敏捷。NPC的实际攻击力由最大攻击和最小攻击共同决定,敏捷决定NPC的攻击速度。NPC的基础数据见表2-2。表2-2:NPC基础数据表等级生命最大攻击最小攻击敏捷13365362336536333653643365365336536633653678116153788116153798116153710811615371181161537121833531361318335313614183353136151833531361618335313617303464269183034642691930346426920303464269213034642692254860537123548605371245486053712554860537126548605371276677365732866773657329667736573306677365732.3地图系统实现简单地图系统,对整个游戏场景坐标依照像素划分(2000 * 2000),角色可以在相邻坐标点间运动。单窗体大小为640 *400。2.4 AI系统NPC能发现一定半径范围内的玩家,并选择攻击或逃跑。NPC能在发现敌人后选择最短路径靠近并攻击玩家。2.5战斗系统实现玩家和玩家,玩家和NPC之间的战斗逻辑。计算并保存战斗效果。客户端有相应的战斗动作和伤害表现。2.5.1玩家物理伤害计算:伤害 = max( 1 , 攻击)(1) 攻击攻击 = 原始攻击 + 力量 + 等级藐视等级藐视:1.等级差 0 等级藐视 = 力量 * 向下取整 ( 2 + 等级差 ) / 5 * 0.82.等级差 = 0等级藐视 = 0(2) 命中率命中率 = 100 + 攻方敏捷 / 2 - 被击方敏捷(命中率取值范围为10,90,计算结果在此区间之外,需做矫正)经验计算:经验 = 物理伤害 * 矫正系数矫正系数的计算方式见表2-3。表2-3:经验值矫正系数表等级差(攻击-被攻击)矫正系数= 70.1= 60.2= 50.3= 40.8其他1.0表2-4:角色升级数据表等级提升到下一级所需要经验1120218032404360560069607120082400936001084001112000121440013180001421600152264616322031737433184755619566092068772217051522759362397733241148362512085326123981271267202814587829173436301976463120245132212160332441903428582335305986363128643732448038366168394339594046059041506738425699944372852744850829459164794693511847940800481076593491272780501357994死亡:角色死亡后进入灵魂状态,启动20秒倒计时,计时结束后可复活。2.5.2 NPC 物理伤害计算:伤害 = max( 1 , 攻击)(1) 攻击攻击 = RAND(最大攻击 最小攻击) + 最小攻击(最大攻击、最小攻击参考 表2-2)(2) 命中率命中率 = 100 + 攻方敏捷 / 2 - 被击方敏捷;(命中率取值范围为10,90,计算结果在此区间之外,需做矫正)2.6联盟系统达到等级8的玩家可发起联盟,并由发起者做为联盟头领。其他玩家可申请加入或退出某联盟。联盟成员不可以相互攻击。2.7聊天系统玩家间能进行在线聊天,聊天可选择公聊、私聊以及联盟聊天的方式。公聊:聊天内容所有人可见。私聊:聊天内容仅聊天双方可见。联盟聊天:联盟成员可见。2.8数据系统游戏中玩家、联盟等数据通过mysql进行存储。2.9本章小结本章为游戏的主要需求,是系统中要求实现的功能,进一步的需要将由受训学员进一步完善,并在系统中实现需要。第三章 多人在线游戏的架构设计3.1服务端架构3.1.1服务端层次划分为了降低耦合,提高代码复用性,我们将服务端按层次2分为逻辑模块层、服务层、适配层、核心层。3.1.2服务器框架构建为了实现各个模块的并行开发,降低模块对其他模块的依赖性,我们采取了一种框架模式来组建各个模块,我们称之为消费者(Consumer)/供应者(Provider),简称:C/P模式9。其实这是一种功能的输出/输入模式。Consumer对应于功能的输入端,Provider对应于功能的输出端。这种模式能使各个模块独立进行开发,最终再由框架整合各个模块。采用这种方式,我们可以将代码的复用提升到模块层次9,大大加快了开发效率。现在,我们将通过对各个框架层次的介绍,逐步解释C/P模式。系统的服务端架构图见图3-1:图3-1:服务端架构图逻辑模块层:由ChatModule、RoleModule、LoginModule、CombatModule等功能模块构成,负责具体游戏逻辑的处理,每个模块都能提供解决该模块逻辑的一些功能,同时它需要外部模块提供一些功能支持。这些功能支持可能来之于其他逻辑模块,也可能要来之于服务层提供的服务。比如LoginModule它能提供登录/登出等功能,但它无法完成实体数据获取、角色信息发送等一些功能,这些功能必须由外部模块提供。一个模块对外提供的功能我们称之为Provider,它需要外部提供的功能我们称之为该模块的Consumer。服务层:由NetServer、DBServer等服务模块构成,服务层基本上是输出层,它是一个纯粹的Provider,基本不产生对外依赖,只是将自己的功能提供给外部使用。如NetServer提问网络通信服务,DBServer提供与数据库相关的实体数据,Server起协调左右,它负责启动、配置各个服务。适配层:适配层接收各个模块和各个服务所提供的功能,通过适配转接为各个模块提供需要的功能。它是一个中间层,它的唯一功能就是从所有可知的Provider中产生各个模块所需的Consumer。核心层:包含了整个结构的一些核心信息,如各个模块的实例对象,各个模块的Provider,各个模块的Consumer都需在核心层Root中注册。它管理着服务器中的所有模块,也管理着它们提供的Provider以及适配层生成的各个模块所需的Consumer。3.1.3消费者/供应者模式以上这种模块之间采用的交互方式我们称之为消费者(Consumer)/供应者(Provider)模式,简称:C/P模式9。采用这种模式的目的是:(1) 降低游戏逻辑开发的复杂度,减少在制作游戏过程中打交道的对象9。模块需要的功能都通过adapter适配转接,然后利用这些功能来实现本模块的游戏逻辑。(2) 逻辑层的子系统与其他子系统无关,其他子系统修改与演化不会干扰本子系统的稳定性,子系统是独立演化的。(3) 游戏逻辑模块能够在不同项目间高度复用。其实,模块之间总是存在着交互,为了达到这种交互,如果我们直接让各个模块直接相互访问的话,这样的话会产生以下问题:(1) 模块之间高度耦合,你对任意一个模块代码的修改都可能对其他模块产生影响,这样逻辑处理会变的更加复杂。(2) 各个模块无法并行开发,因为各个模块间相互影响,无法对单个逻辑模块进行单独开发。(3) 代码的复用性变的极差。C/P模式为我们提供了一种低耦合性的模块交互模式。在这种模式下,每一个模块都是可替换的,每一个模块都扮演着插件的角色。各个模块可以只专注于本身模块相关功能的实现,而把其他的支持功能以Consumer的方式对外索取。这么看来的话,每一个模块就是一个有着输入端和输出端两个端口的插件,只要系统能提供给模块输入端的功能,该模块就能在该系统上运行,并为系统产生新的功能。而这新提供的功能又能为其他模块产生支持。而将已有模块的功能提供给其他模块使用,这就是适配器所要实现的功能了。这样,每一个模块都可以独立的进行开发,最终由适配层进行转接,核心层进行组装,整个系统就能搭建起来9。3.2客户端架构3.2.1客户端层次划分因为渲染层是多变的且形式多样的,所以在客户端框架的设计中要尽量降低渲染层与系统的耦合性。所有我们以MVC的架构9为参考,完成客户端架构的设计。我们的目的是尽量让的数据通信层、模型层、逻辑层可复用。而让渲染层可以轻易替换。初步将客户端划分成4个层次:渲染层、模型层、控制层、网络通信层。 渲染层:具有灵活多变性,打算采用GDI先实现渲染层,之后实操学员也可采用DX或OGRE实现一个3D的渲染层。模型层:定义游戏中出现的实体对象,如:Player,Npc等。这些实体对象存储着实体的数据。控制层:控制层其实是由各种的管理器组成的,包括角色管理器、网络消息管理器、角色行为管理器等等。网络通信层:负责与服务端通信,收发网络数据。以MVC的框架为基础,降低各模块间的耦合关系,在此基础上为满足于服务器端的通添加了数据传输模块。资源管理模块,如:图片管理,声音资源的管理可挂接到控制模块,由于采用MVC的架构,对于这些模块的添加、移除将变得容易。3.2.2客户端逻辑模块化设计对应于服务端的逻辑模块划分,客户端也做了相对应的划分,不同的是客户端模块将数据模块和功能模块隔离8。客户端模块架构图见图3-2:逻辑模块管理器联盟模块战斗模块聊天模块其他模块。消息管理器模块集HeroPlayer消息交互数据管理模块功能模块其他网络模块数据交互代理集图3-2:客户端逻辑模块化设计图网络消息的处理:只负责收发网络数据包,收到的数据包都将由消息管理器进行解析分发。各个模块通过模块管理器向消息管理器注册自己模块感兴趣的消息集。消息管理器根据模块注册的消息集进行消息的分发。模块管理器:游戏初始化时生成,接受各模块的注册。往消息管理器注册各个模块的消息。同时,运行过程中模块管理将作为消息中转站,供模块之间进行消息交互。模块集:包括两类模块,数据模块和功能模块。数据模块:主要是服务器信息在客户端的映射,为简单结构,只提供基础数据管理功能而不带有任何操作。数据模块的简单保证了其独立性。功能模块:所有的操作按照功能划分为各功能模块。功能模块需要和数据模块结合,才能发挥作用。加载模块:在新构架中,模块的加载分为两类,一类是基础模块,例如 网络模块,基础数据模块等,这些模块在游戏初始化时加载。而其他大部分功能模块可做成动态链接库,在需要访问时再加载感兴趣的函数。3.3本章小结本章介绍了游戏的整体架构,详细介绍了服务端架构和客户端架构。服务端架构和客户端架构都力求将游戏逻辑模块化。这样能是提供代码复用性,便于模块的移植和复用。模块化还有理由游戏的并行开发。对呀每个模块,只要定义好交互的接口,就可以独立开发、独立编译。第四章 多人在线游戏的详细设计4.1服务端详细设计4.1.1服务端模块的划分和管理本游戏中包含5个基本模块,分别是:登录模块:LoginModule角色模块:RoleModule战斗模块:CombatModule聊天模块:ChatModule联盟模块:AllianceModule对应与每个模块都有一个适配器:登录适配器:LoginAdapter角色适配器:RoleAdapter战斗适配器:CombatAdapter聊天适配器:ChatAdapter联盟适配器:AllianceAdapter与模块相关的主要管理器有CModuleManager、CAdapterFactory、CRoot:CModuleManager:模块管理器,负责模块的创建注册以及Consumer的注入等。CAdapterFactory:适配器工厂,负责生产适配器实例。CRoot:保存着所有已注册模块,已经模块Provider和Consumer的指针以及模块可处理的消息等基本信息。在Root中定义了构建一个模块所必须的三个接口IProvider、IConsumer、IModule:IProvider:生产者接口,定义了模块可以向外提供的功能。IConsumer:消费者接口,定义了模块需要外部提供的功能。IModule:模块接口。root:IProvider是所有生产者类的基类,root:IConsumer是所有消费者类的基类,root:IModle是所有模块类的基类。Root下的IProvider和IConsumer只定义了一个Release()方法。每个模块都有直接的Provider和Consumer,它们都是继承与Root下的IProvider和IConsumer。如:CombatModule中定义了combat:IProvider和combat:IConsumer。每个模块模块都必须继承和实现root:IModule和root:IProvider接口。而对于每个模块定义的Consumer都会有适配器产生实例并注入到模块中供模块使用。系统是通过IModule这个接口来管理模块的,如Provider的获取或Consumer的注入都是通过这个接口。下面具体介绍下IModule接口。IModule的定义如下:class IModulepublic:virtual void Release(void) = 0;virtual void Init(root:IConsumer* pConsumer) = 0;virtual void GetRecvableMsgType(std:vector& vecMsgType) = 0;virtual IProvider* GetProvider(void) = 0;virtual int OnRcevMsg(int nSenderID, const root:CMsg* pMsg) = 0;virtual void OnTimer(void) = 0;当服务器启动时,CServer类会通知CModuleManager创建各个模块类然后在CRoot中注册各个模块。注册的过程为:(1) 创建模块适配器,适配器就是模块的Consumer。(2) 调用IModule的Init()方法往模块中注入Consumer。(3) 在CRoot中注册模块Consumer。(4) 调用GetProvider()方法获得模块Provider。(5) 在CRoot中注册模块Provider。(6) 调用GetRecvableMsgType()方法获得模块可处理的消息队列。(7) 在CRoot中注册模块可处理的消息队列。注入Consumer要在获得Provider之前的原因在于,一般Provider的创建都要基于传入的Consumer。所有模块一般在Init()方法中获得Consumer然后创建出Provider。这样在调用GetProvider()就可以获得模块的Provider了而不是一个NULL。适配器的作用是为将其他模块提供的功能以及各个服务提供的功能转成模块的Consumer供模块使用。所以,模块适配器必须知道其他模块的Provider以及各个服务。服务类一般都是单实例类,可以直接获取其实例,而其他模块的Provider是通过CRoot获取的。这里就存在一个问题:因为注册模块时是先注册Consumer然后再注册Provider的,所有有可能在创建Consumer时CRoot中的Provider的指针还是NULL。解决的方法有两个8:(1) 延迟调用法,将Provider指针的获取延迟到方法的调用时。即在创建适配器时不获取Provider的指针,等到实际调用了适配器中的方法时再从CRoot中获取Provider指针,这是Provider肯定是注册好的。(2) 检测获取法,具体的实现方法是当适配器需要其他模块Provider时在调用之前检测Provider的指针是否为空,如果为空则去获取实际的Provider指针。这种运行时动态的获取可以保证得到正确的Provider。示例代码:if (NULL = m_pRoleProvider)root:IProvider* pProvider = root:RootInstanceGet()-GetProvider(MOD_ROLE);if (NULL = pProvider)return false;m_pRoleProvider = static_cast(pProvider);先注册所有的Provider,然后再创建适配器,注入Consumer。这样在模块中Provider的创建就不能依赖Consumer。应在具体的Provider中设置一个SetConsumer的方法,这样Provider实例化的时候就不需要Consumer,当Consumer注入模块时,再通过SetConsumer方法往模块Provider中注入Consumer。4.1.2服务端模块设计服务端简单模块的设计:对于一般较简单的模块,模块本身只需继承实现IModule和IProvider接口并定义该模块需要外部支持的功能接口IConsumer。而IConsumer的具体实现将由适配器层提供。服务端简单模块的设计图见图4-1:图4-1:服务端简单模块设计图模块中的参与者如下:IConsumer定义抽象的消费者接口,规范了IConsumer抽象接口的行为语义,其实现类由其他模块或服务提供,由Adapter转接。IProvider定义抽象的生产者接口,为该模块的使用者提供服务。IModule实际是root:IModle.CProvider模块的具体实现类,数据的读、写以及其他支持功能依赖于

温馨提示

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

评论

0/150

提交评论