6安阳工学院本科生毕业设计论文_参考模板.doc_第1页
6安阳工学院本科生毕业设计论文_参考模板.doc_第2页
6安阳工学院本科生毕业设计论文_参考模板.doc_第3页
6安阳工学院本科生毕业设计论文_参考模板.doc_第4页
6安阳工学院本科生毕业设计论文_参考模板.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

ANYANG INSTITUTE OF TECHNOLOGY 本本 科科 毕毕 业业 论论 文文 基于客户端 服务器架构的三维网络游戏 Three Dimensional Online Game Based On Client Server Architecture 系 院 名称 计算机科学与信息工程学院 专业班级 2012 届计算机科学与技术 学生姓名 四号宋体 指导教师姓名 四号宋体 指导教师职称 四号宋体 2012 年 5 月 I 毕业设计 论文 原创性声明和使用授权说明毕业设计 论文 原创性声明和使用授权说明 原创性声明原创性声明 本人郑重承诺 所呈交的毕业设计 论文 是我个人在指导教师的指 导下进行的研究工作及取得的成果 尽我所知 除文中特别加以标注和致谢 的地方外 不包含其他人或组织已经发表或公布过的研究成果 也不包含我 为获得安阳工学院及其它教育机构的学位或学历而使用过的材料 对本研究 提供过帮助和做出过贡献的个人或集体 均已在文中作了明确的说明并表示 了谢意 作 者 签 名 日 期 指导教师签名 日 期 使用授权说明使用授权说明 本人完全了解安阳工学院关于收集 保存 使用毕业设计 论文 的规 定 即 按照学校要求提交毕业设计 论文 的印刷本和电子版本 学校有 权保存毕业设计 论文 的印刷本和电子版 并提供目录检索与阅览服务 学校可以采用影印 缩印 数字化或其它复制手段保存论文 在不以赢利为 目的前提下 学校可以公布论文的部分或全部内容 作者签名 日 期 II 基于客户端基于客户端 服务器架构的三维网络游戏服务器架构的三维网络游戏 摘要 摘要 在该课题的设计中 主要实现了客户端的三维图形显示模块 客户端的人机交互 模块 客户端的游戏功能模块 服务器端的数据库读取和存储模块以及客户端与服务器 端的网络通信模块 客户端和服务器端程序均基于 Win32 应用程序框架 使用 C C 语言和面向过程 面向对象方法编写 客户端使用 Microsoft DirectX 技术进行三维图形的开发 服务器端使 用 Microsoft SQL Server 2005 数据库对客户端的数据进行读取和存储 二者利用 Windows Socket 编程技术 以 TCP IP 协议进行网络通信 通过客户端编程 进一步了解了 Windows 应用程序的框架和运行机制 研究了如何 使用 DirectX 应用程序编程接口来实现三维空间中图形的显示及其各种变换 通过服务器 端编程 进一步了解了 Winsock 网络编程流程和网络通信机制 熟悉了如何使用 ADO 技 术来操作数据库 同时 还锻炼了设计程序的思维和解决问题的方法以及运用工具对程序进行调试 熟悉了面向过程和面向对象编程的方法和各种数据结构和常用算法的综合实践运用 关键词 三维图形 数据库 Socket SQL Server TCP IP III Three Dimensional Online Game Based On Client Server Architecture Abstract In the design of this project five main modules have been achieved which include the Client s Three Dimensional Graphics Display Module the Client s Human Computer Interaction Module the Client s Game Function Module the Server s Database Read Write and Memory Module and the Client and Server s Network Communication Module To start with the Client s and Server s program which are based on Win 32 application framework are using the Process Oriented and the Object Oriented Programming Methods with the C C language On one hand the Client s three dimensional graphics are programmed by the technology of Microsoft DirectX On the other hand the Server uses the Microsoft SQL Server 2005 to read write and memory the database What s more they communicate to each other by the Winsock programming with TCP IP Protocol According to the programming of Client it can not only be learned more about the Windows application framework and its operation mechanism but also be studied how to use the DirectX API to create graphics and change their positions in the space of three dimensional In addition it can be learned more about the process of Winsock programming and the mechanism of the network communication as well as be familiar with the ADO technology operating the database At the same time it can well be exercise the thinking of programming and the way to solve problems and how to use program tools to debug Furthermore it can be familiar with the Process Oriented and the Object Oriented programming methods of designing a program and know more various data structures and algorithms that will be used in a large project Key words Three Dimensional Graphics Database Socket SQL Server TCP IP IV 目 录 引 言 1 第 1 章 绪论 2 1 1 设计的目的和意义 2 1 1 1 设计的目的 2 1 1 2 设计的意义 2 1 2 开发环境 2 1 2 1 系统的软硬件平台 2 1 2 1 开发语言和工具 3 1 3 设计的方法和技术 3 1 3 1 面向过程和面向对象的设计方法 3 1 3 2 DirectX 编程技术 3 1 3 3 基于 C S 的网络系统结构 4 1 3 4 Winsock 网络编程技术 4 1 3 5 基于 ADO 的数据库访问技术 6 第 2 章 系统分析 7 2 1 概述 7 2 2 需求分析 7 2 2 1 功能需求 7 2 2 2 数据需求 8 2 2 3 用户需求 8 2 3 可行性分析 8 2 3 1 经济可行性 8 2 3 2 技术可行性 8 2 3 3 操作可行性 8 第 3 章 系统的设计与实现 9 V 3 1 总体设计 9 3 1 1 客户端 服务器模式 9 3 1 2 客户端的总体设计 10 3 1 3 服务器端的总体设计 10 3 2 客户端的详细设计与实现 10 3 2 1 Win32 和 Direct3D 应用程序框架 10 3 2 2 登录窗口的实现 11 3 2 3 必备的数学知识 12 3 2 4 Direct3D 基础 13 3 2 5 创建场景 14 3 2 6 角色 Role 类 17 3 2 7 虚拟摄像机的空间位置变换 19 3 2 8 3D 单词在场景中的显示 20 3 2 9 游戏功能的设计与实现 20 3 3 服务器端的详细设计与实现 22 3 3 1 Win32 应用程序框架 22 3 3 2 数据包的设计 23 3 3 3 网络通信 25 3 3 4 数据库的设计 26 3 3 5 日志记录 27 3 3 6 结果展示 28 3 3 7 客户端的网络同步 28 3 3 8 网络优化 29 第 4 章 系统测试分析 31 4 1 概述 31 4 2 功能测试 31 4 2 1 测试环境的搭建 31 4 2 2 服务器端的测试 31 VI 4 2 3 客户端的测试 32 4 3 非功能测试 35 4 3 1 服务器性能测试和压力测试 35 4 2 2 客户端性能测试和压力测试 36 结 论 37 致 谢 38 参考文献 39 1 引 言 随着文化创意产业的发展 数字娱乐设计正在成为一个新兴的专业方向 数字娱乐 设计是以大众的娱乐和休闲方式为主要研究对象 基于数字化和网络化的平台 通过多 媒体的交互手段 创造具有参与性 互动性和娱乐性的产品或环境 具体的设计内容以 数字游戏设计为主 在游戏产业发展异常迅猛的今天 游戏开发人才成了游戏企业的抢手货 游戏制作 公司 销售公司的大量涌现 使得游戏人才的需求量一升再升 其中需求量最大的是设 计 开发类中的高端人才 劳动和社会保障部最新公布的 10 种新职业中 游戏美术设计 师 游戏程序设计师名列其中 而在游戏开发中 基于客户端 服务器的三维网络游戏的开发所要求的技术水平是最 高的 无疑是最具挑战性的一项工作 游戏的风格并不太重要 重要的是怎样选择符合自己游戏特性的网络构成问题 程 序员不仅要熟练掌握客户端的三维图形编程技术 还要熟练运用网络编程技术开发服务 器 同时还要使用数据库对信息进行存储 因此 通过自主学习和开发一款小型的三维网络游戏 将更有助于熟练掌握相关的 技术 为以后顺利进入游戏行业打下坚实的基础 2 第 1 章 绪论 随着近年来计算机游戏 以下简称游戏 产业的持续升温 游戏产业的价值引起了 国人的重视 我国是全球游戏产业增长速度最快的地区之一 相关人才的需求已越来越 大 1 1 设计的目的和意义 在未来 3 到 5 年内 游戏从业人员将有 60 万的缺口 然而 正当中国游戏产业的超 高速增长让人们对游戏产业的价值刮目相看时 却突然发现中国根本没有正规的游戏教 育 游戏企业不得不沿用师傅带徒弟的育才模式 使得游戏人才培养的效率很低 并缺 乏系统性 因此 游戏企业无一例外地患上了 人才饥渴症 1 1 1 设计的目的 游戏人才的匮乏直接影响到我国游戏的本土化自主研发 这在很大程度上抑制了国 内游戏产业的发展 使得中国游戏产业的命脉被握在了韩国 日本 欧美厂商的手中 国产游戏产业也在夹缝中摸索生存的道路 要提高中国游戏开发的水平和质量 提升中 国游戏在国际上的竞争力 大力加强游戏教育是当务之急 1 1 2 设计的意义 熟悉编程语言在实际中的运用 了解三维空间中图形的绘制 以及各种数据结构和 算法的综合实践 通过本次设计 还可以更加深入的探索游戏开发中所使用到的各项技 术 并熟练掌握这些技术 为今后规模更大的系统设计奠定扎实的基础 1 2 开发环境 系统开发环境作如下介绍 1 2 1 系统的软硬件平台 硬件平台 CPU P4 2 0GHz 以上 内存 1GB 以上 操作系统平台 Windows XP Professional Windows 7 分辨率 1024 768 像素 1280 800 像素 3 1 2 1 开发语言和工具 语言 C C 工具 Microsoft Visual Studio 6 0 Microsoft DirectX 9 0b SDK Microsoft SQL Server 2005 Photoshop 7 0 VMware WorkStation 6 5 InstallShield 2009 网络协议 Winsock TCP IP 1 3 设计的方法和技术 1 3 1 面向过程和面向对象的设计方法 面向过程 是一种以过程为中心的编程思想 先分析出解决问题所需要的步骤 然后用函数把这些步骤一步一步实现 使用的时候一个一个依次调用就可以了 面向对象 是一种以事物为中心的编程思想 在编程过程中采用封装 继承 多 态的编程方法 面向过程其实是最为实际的一种思考方式 就算是面向对象 也是含有面向过程的 思想 可以说面向过程是一种基础的方法 它考虑的是实际的实现 一般的面向过程是从上往下步步求精 所以面向过程最重要的是模块化的思想方法 而面向对象主要是把事物对象化 对象包括属性和行为 当程序规模不是很大时 面向 过程还会体现出一种优势 因为程序的流程很清楚 按着模块与函数的方法可以很好地 组织和使用 1 3 2 DirectX 编程技术 DirectX Direct eXtension 简称 DX 是由微软公司创建的多媒体编程接口 由 C 编程语言实现 遵循 COM 被广泛使用于游戏开发 DirectX 提供给设计人员一个共同的硬件驱动标准 让游戏开发者不必为每一品牌的 硬件来写不同的驱动程序 也降低用户安装及设置硬件的复杂度 从字面意义上说 Direct 就是直接的意思 而后边的 X 则代表了很多的意思 从这一点上我们就可以看出 DirectX 的出现就是为了为众多软件提供直接服务的 DirectX 是由很多 API 组成的 按照性质分类 可以分为四大部分 显示部分 声音 部分 输入部分和网络部分 显示部分担任图形处理的关键 分为 DirectDraw DDraw 和 Direct3D D3D 后者主 要负责 3D 效果的显示 比如 CS 中的场景和人物 FIFA 中的人物等等 都是使用了 4 DirectX 的 Direct3D 输入部分 DirectInput 可以支持很多的游戏输入设备 它能够让这些设备充分发挥最 佳状态和全部功能 除了键盘和鼠标之外还可以连接手柄 摇杆 模拟器等 1 3 3 基于 C S 的网络系统结构 网络游戏最典型的就是 C S 即客户端 服务器模型 是由信息提供者服务器和信息 请求者客户构成的模型 模型采用根据请求信息的客户的请求 服务器中继数据的方式 其一般结构如图 1 1 所示 图 1 1 客户端 服务器模型 如图 1 1 所示 各个客户端在与服务器建立连接的状态下 向服务器发送特定的数 据包 服务器分析接收到的数据包并做出相应处理 然后把必要的数据中继给其他客户 端 或者发送请求给各个客户端 一般 这样的模型适用于几百个 几千个客户端需要 共享数据的在线角色游戏中 C S 结构的优点是能够充分发挥客户端 PC 的处理能力 很多工作可以在客户端处理 后再提交给服务器 这使得客户端响应速度快 对于网络游戏而言 这是十分关键的 缺点是网络游戏的升级比较麻烦 每次升级都需要客户端下载更新软件 然后进行安装 1 3 4 Winsock 网络编程技术 Internet 是一个包交换和容错的网络 包交换意味着在 Internet 上传输的信息实际上是 5 被分装成一个个小包 大小从几字节到几千字节 从某点传送到另一点 容错意味着包 传输的路径上将可能发生错误 如服务器出错等 如果传输路径上的服务器发生了错误 那么传输的包将会选择另一条路径 直到达到目的地 在发送数据时 有两个任务是十分关键的 第一 数据被分割组包 并在另一端重 组 第二 每个数据包单独在网络上传输 直到完成任务 在 TCP IP Transmission Control Protocol 传输控制协议 的协议结构中 这两个任 务分别交给了 TCP 和 IP 前者负责数据包的分割和组装 后者负责数据包在网络上的传 送 面向连接的 TCP 协议保证了 FIFO 数据按顺序到达 操作 保证从一端发送的 TCP 流都将到达目的地 为了保证数据的顺序到达 TCP 协议需要等待一些丢失的包来按顺 序重组原来的数据 同时还要检测是否有丢包发生 因此它的运行速度很低 TCP 协议 已牺牲一部分传输性能为代价 来获取可靠的网络传输 UDP User Datagram Protocol 用户数据报协议 是 TCP 协议的替代选择 UDP 的 一种无连接的协议 它可以在网络的两个节点间传输确定大小的包 但不保证这些包的 传输路径和到达顺序 UDP 的有点就是快速的传输速率 TCP 协议和 UDP 协议的比较如 表 1 1 所示 表 1 1 TCP 和 UDP 比较 TCPUDP 连接保持连接保持连接 包大小包大小可变包大小确定 接收保证接收保证接收 传输顺序FIFO不保证 FIFO 速度慢快 在网络游戏中 协议的选择依赖于游戏的类型和设计重点 如果是一个策略游戏 稍微的一点延迟可以忍受 但不允许关键的移动或者进攻指令出错 这时 TCP 是个不 错的选择 如果是一个第一人称视角游戏 为了保证 60 帧 秒的帧率 获得游戏的流畅性 UDP 协议是一个更好的选择 Socket 编程已经成为了网络编程的规范 极大地便利了程序员编写网络应用程序 Socket 可以被视为一个简单的输入 输出设备 它可以在两个站点间打开一个通信信道 为了传送信息 两个站点都必须打开一个 Socket 连接对方 Socket 帮助程序员完成了数 据的分割 组装包工作 因此 程序员不必 6 关心数据如何被分割和组装 程序员只需要让 Socket 发送一段数据 这段数据将完整地 出现在网络传输的另一端 1 3 5 基于 ADO 的数据库访问技术 ADO ActiveX Data Objects 是微软公司开发的一个用于存取数据源的 COM 组件 用以实现访问关系或非关系数据库中的数据 它提供了编程语言和统一数据访问方式 OLE DB 的一个中间层 允许开发人员编写访问数据的代码而不用关心数据库是如何实现 的 而只用关心到数据库的连接 访问数据库的时候 关于 SQL 的知识不是必要的 但 是特定数据库支持的 SQL 命令仍可以通过 ADO 中的命令对象来执行 像 Microsoft 的其它系统接口一样 ADO 是面向对象的 它是 Microsoft 全局数据访 问 UDA 的一部分 Microsoft 认为与其自己创建一个数据 不如利用 UDA 访问已有 的数据库 为达到这一目的 Microsoft 和其它数据库公司在它们的数据库和 Microsoft 的 OLE 数据库之间提供了一个 桥 程序 OLE 数据库已经在使用 ADO 技术 作为 ActiveX 的一部分 ADO 也是 Microsoft 的组件对象模式 COM 的一部分 它的面向组 件的框架用以将程序组装在一起 ADO 是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法 它是一 种功能强大的数据访问编程模式 从而使得大部分数据源可编程的属性得以直接扩展 7 第第 2 章章 系统分析系统分析 系统分析是指在管理信息系统开发的生命周期中应用系统思想和系统科学的原理进 行分析工作的方法和技术 其目标就是按系统规划所定的某个开发项目范围内明确系统 开发的目的和用户的信息需求 提出系统的逻辑方案 分析阶段独立于系统实现环境 可以保证建立起来的系统结构具有相对的稳定性 便于系统维护 移植或扩充 2 1 概述 系统分析是管理信息系统的一个主要和关键阶段 负责这个阶段的关键人物是系统 分析员 完成这个阶段任务的关键问题是开发人员与用户之间的沟通 系统分析从系统 需求入手 从用户观点出发建立系统用户模型 用户模型从概念上全方位表达系统需求 及系统与用户的相互关系 系统分析在用户模型的基础上 建立适应性强 独立于系统 实现环境的逻辑结构 2 2 需求分析 2 2 1 功能需求 1 客户端主要实现以下功能 1 客户端启动后 进入登录界面 由用户输入用户名和密码 然后连接服务器验 证是否被允许登录 2 登录成功后 首次向服务器发送数据 以获取用户的相关数据 3 根据所获取的数据 进行游戏场景的载入和显示 4 获取用户的键盘和鼠标输入状态 并做出相应的操作 以达到人机交互的目的 5 用户在场景中移动 并根据预先设置进入游戏状态 6 对于每一个游戏状态结束后 向服务器发送数据 以更新用户信息 2 服务器端主要实现以下功能 8 1 服务器启动后 检测所有初始化工作是否完成 并显示相关结果 2 等待客户端的连接 验证是否允许用户登录 3 接收客户端发来的数据 做出相应处理 4 对于每一个操作 做好日志记录 2 2 2 数据需求 客户端和服务器端按照事先约定的数据包格式 实时地进行数据交换 以保证用户 信息的正确性 同时 服务器端要不断更新数据库和做好日志记录 以便出现问题后可 以依此维护和调试 2 2 3 用户需求 1 客户端要有较好的可操作性 2 根据用户的意见 修改或提升游戏功能 2 3 可行性分析 2 3 1 经济可行性 该系统为毕业设计 目的在于自主学习和研究 开发所需的硬件环境并不高 一般 利用自己的 PC 机就可以进行开发 由于系统并不复杂 所需的软件资源和文档资源通过 翻阅书籍和网上搜索均能得到 人力 物力的支出较少 因此在经济上是可行的 2 3 2 技术可行性 该系统使用 C C 语言 利用面向过程和面向对象方法 结合 Microsoft DirectX API 实现的功能并不是很复杂 因此在技术上是可行的 2 3 3 操作可行性 该系统界面设计简单 包括了常用功能 同时可以根据主流游戏操作方式 动态修 改 使其能够适合绝大多数的用户 因此在操作上是可行的 9 第第 3 章章 系统的设计与实现系统的设计与实现 总体设计是在经过了需求分析与可行性分析之后 为明确各项功能需求的落实与否 以及以后进一步设计开发而编写的 它的依据是需求分析 总体设计是软件工程中的生 存期的重要环节 它基本确定了软件中关于 怎样做 的大致框架 3 1 总体设计 在 TCP IP 网络应用中 通信的两个进程间相互作用的主要模式是客户端 服务器模式 Client Server 即客户端向服务器提出请求 服务器接收到请求后 提供相应的服务 3 1 1 客户端 服务器模式 客户端 服务器模式的建立基于以下两点 首先 建立网络的起因是网络中软硬件资 源 运算能力和信息不均等 需要共享 从而造就拥有众多资源的主机提供服务 资源 较少的客户端请求服务这一非对等作用 其次 网间进程通信完全是异步的 相互通信 的进程间既不存在父子关系 又不共享内存缓冲区 因此需要一种机制为希望通信的进 程间建立联系 为二者的数据交换提供同步 这就是基于客户端 服务器模式的 TCP IP 客户端 服务器模式在操作过程中采取的是主动请求的方式 1 首先服务器方要先启动 并根据请求提供相应的服务 1 打开一个通信通道并告知本地主机 它愿意在某一地址和端口上接收客户端请 求 2 等待客户端请求到达该端口 3 接收到重复服务请求 处理该请求并发送应答信号 接收到并发服务请求 要 激活一个新的进程 或线程 来处理这个客户端请求 新进程 或线程 处理此客户端请求 并不需要对其它请求作出应答 服务完成后 关闭此新进程与客户端的通信链路 并终 止 4 返回第二步 等待另一客户端请求 5 关闭服务器 2 客户端 10 1 打开一个通信通道 并连接到服务器所在主机的特定端口 2 向服务器发服务请求报文 等待并接收应答 继续提出请求 3 请求结束后关闭通信通道并终止 3 1 2 客户端的总体设计 1 客户端启动后 进入登录界面 由用户输入用户名和密码 然后连接服务器验 证是否被允许登录 2 登录成功后 首次向服务器发送数据 以获取用户的相关数据 3 根据所获取的数据 进行游戏场景的载入和显示 4 获取用户的键盘和鼠标输入状态 并做出相应的操作 以达到人机交互的目的 5 用户在场景中移动 并根据预先设置进入游戏状态 6 对于每一个游戏状态结束后 向服务器发送数据 以更新用户信息 3 1 3 服务器端的总体设计 1 服务器启动后 检测所有初始化工作是否完成 并显示相关结果 2 等待客户端的连接 验证是否允许用户登录 3 接收客户端发来的数据 做出相应处理 4 对于每一个操作 做好日志记录 3 2 客户端的详细设计与实现 3 2 1 Win32 和 Direct3D 应用程序框架 Windows 应用程序是基于事件响应的运行机制 程序从 WinMain 函数入口 其功能 是首先定义一个 Windows 的窗口样式 大小等 并创建 显示和更新这个窗口 然后进 入 MsgProc 消息循环 在 MsgProc 的 WM CREATE 中 先创建登录对话框窗口 连接 远程服务器 验证用户名和密码 如果成功则创建主程序窗口 接着初始化 Direct3D 然 后进入 WM PAINT WM TIMER WM COMMOND 等消息处理 MsgProc 窗口回调 函数在整个运行周期中随时对回调函数所定义的外部事件 鼠标移动 点击 键盘按键 窗口变化和其它函数发出的消息 做出反应 如图 3 1 所示 11 图 3 1 Windows 和 Direct3D 程序框架 3 2 2 登录窗口的实现 创建好 Win32 应用程序框架后 插入一个对话框资源 添加两个 static 控件 两个 edit 控件和两个 button 控件 在 WM PAINT 中绘制背景图 最后经过排版 结果如图 3 2 所示 图 3 2 游戏登录窗口 12 3 2 3 必备的数学知识 要进行三维图形程序的编写 首先必须要了解的就是相关的数学知识 主要包括向 量 矩阵和相应的变换 向量的两个属性是他的长度和他的顶点所指的方向 因此 可以用向量来模拟既有 大小又有方向的物理模型 一般仅用向量来描述光线的照射方向 多边形的朝向 以及 在 3D 世界中摄像机所观察的方向 向量为三维空间中表示方向提供了方便 一个 M N 的矩阵是由 m 行和 n 列的数字组成的矩阵列 行和列的数字就是这个矩 阵的维数 在三维空间中 用矩阵来保存多边形的顶点坐标 这样就可以灵活地使用一 个 4 4 的矩阵与之数乘 相加 逆和转置来实现顶点的坐标变换 例如 先把向量 p 5 0 0 1 在所有轴上缩小为原来的 1 5 然后绕着 y 轴旋转 4 最后把它在 x 轴上平移 1 个单位 在 y 轴上平移 2 个单位 在 z 轴上平移 3 个单位 其流 程和结果如图 3 3 和 3 4 所示 图 3 3 缩放矩阵 S 旋转矩阵 Ry 和平移矩阵 T 图 3 4 经过缩放 旋转和平移后的结 13 3 2 4 Direct3D 基础 1 表现模型 一个场景是多个物体或模型的集合 一个物体可以使用三角形网格来近似表示 由 三角形网格建立一个模型 称之为建模 一个多边形两边相交的点叫做顶点 为了描述一个三角形 通常指定三个点的位置 来对应三角形的三个顶点 如图 3 5 所示 图 3 5 三角形的表示 在 Direct3D 中的顶点除了包含位置坐标 还包含了许多附加属性 如颜色 法线等 因此就需要创建一个自定义的顶点格式 struct Vertex Vertex Vertex float x float y float z float nx float ny float nz float u float v x x y y z z nx nx ny ny nz nz u u v v float x y z 空间坐标 float nx ny nz 法线方向 float u v 贴图坐标 14 define FVF VERTEX D3DFVF XYZ D3DFVF NORMAL D3DFVF TEX1 2 本地空间 世界空间和虚拟摄像机 本地空间又叫建模空间 还可以叫做自身坐标系 这是定义物体三角形列的坐标系 本地空间简化了建模的过程 它允许我们构造一个模型而不必考虑物体在世界中相对于 其他物体的位置 大小和方向关系 一旦我们构造了各种模型 它们都在自己的坐标系中 因此我们需要通过进行平移 旋转和缩放操作把它们都放到同一个世界坐标系中 最后使用虚拟摄像机 对世界进行坐标变换和投影 显示到应用程序窗口中 如图 3 6 所示 图 3 6 本地空间和世界空间 3 2 5 创建场景 1 建筑物的建模 用多个三角形面片 自定义的 Plane 类 来表示一个复杂的多边 形 由这些多边形结合常用的数据结构和算法就可以表现出建筑物的基本形状 为了使 建筑物更具真实感 需要从实地拍摄一些照片 经过 Photoshop 处理后 供程序所调用 为这些建筑物进行 UV 贴图 同时为了提高最终实时渲染的速度及质量 建模过程中采用 了隐藏面消除 深度测试和背面拣选技术 以此减少显示的多边形面的数量 15 图 3 7 校门建模 下方为真实校门图片 图 3 8 综合办公大楼 2 花 草和树的建模 用两个或多个交叉的四边形就可以简单模拟花或草的大致结 构 然后将真实的花或草的图片处理成带 Alpha 通道的 bmp 格式图片 经过程序处理再 贴图 同时 为了使其有风吹草动的效果 可以再添加动画效果 至于树的建模 则用 同样的方法即可 16 图 3 9 花草树 3 在程序中加入光照后 场景变得更加真实细腻 图 3 10 工学院酒店 图 3 11 主教楼远景 17 图 3 12 求索广场和主教楼俯瞰 图 3 13 明德湖和校门远景 3 2 6 角色 Role 类 1 定义四个向量 right 右手方向 up 正上方向 look 正前方向 和 position 角色位 置 来描述角色在世界中的方向和位置 然后通过矩阵变换就可以实现角色的移动或旋转 了 18 图 3 14 角色在世界中的表示 2 角色类的属性和方法 图 3 15 角色类的属性和方法 3 通过鼠标和键盘输入 Input 类 就可以操控角色在场景中移动了 19 3 2 7 虚拟摄像机的空间位置变换 除了角色要能在场景移动外 虚拟摄像机也要跟着角色的移动而移动 这样才能实 现漫游 虚拟摄像机需要关注的主要有两点 一是它的位置 二是它的朝向 其空间位置变 换如图 3 16 图 3 16 摄像机的空间位置变换 从图中就可以得到摄像机位置 camPos x RolePos x camToRole cos fYZAngle sin fXZAngle camPos y RolePos y camToGround yEyeRole sin fYZAngle camPos z RolePos z camToRole cos fYZAngle cos fXZAngle camTarget x RolePos x camTarget y RolePos y yEyeRole camTarget z RolePos z 同样 可以使用 Input 类对摄像机进行操作 这样 就能进行三维空间中 360 180 度观察了 20 3 2 8 3D 单词在场景中的显示 1 字符和单词的表示 虽然可以在场景中显示 3D 字符或字符串 但这要求在渲染之前初始化 一旦初始化 这些字符或字符串就不能改变了 为了能够在每次渲染的时候可变地显示 3D 字符或字符串 可以在初始化的时候将 26 个字符放入一个缓冲区 用 char c 26 存储 接着根据需求 将将要显示的字符或字符串 放入另一个缓冲区 用 char szWord size 存储 然后在渲染的时候 动态地读取或删除 并显示该缓冲区中的数据 图 3 17 字符和单词结构体 有了这两个结构体 通过 Windows 应用程序的消息相应机制 从键盘获取用户的按 键信息 将其转换成字符结构中字符的编号 然后存储到单词结构体中 在渲染的时候 读取该结构体缓冲区就可以显示了 2 单词的来源 单词的坐标和内容都存储在服务器上 通过网络连接 客户端向服务器发送单词请 求就可以获取 3 2 9 游戏功能的设计与实现 1 游戏功能的设计 客户端将服务器发送的单词显示到场景中 玩家在场景中漫游 如果步入单词的攻 击范围 则开始一个游戏回合 进入倒计时状态 玩家需要在规定的时间内通过敲击键 21 盘 将正确的字符依次输入 程序将根据玩家的输入 对比该单词中的字符 如果正确 则显示绿色 否则显示红色 当玩家输入完毕后 可以按回车键确认 程序再次对比该 单词 如果全部正确则获胜 否则失败 最后结束该回合 于是场景中的单词也因此死 亡而不再显示 接着进入轮回状态 轮回时间一到 客户端向服务器请求单词 这样 该单词又重新复活了 2 游戏功能的实现 1 为了使程序更有效率 单词结构体中可以设计成链表结构 首先定义两个 GameWord 单词结构体的变量 sGWLive dAllWord 和 sGWDead dAllWord 分别存储活着 的单词和死了的单词 另外还要声明两个整型变量 nLiveWord 和 nDeadWord 来表示活着 的和死了的单词数 图 3 18 活着的和死了的单词结构体变量 2 在 MsgProc 的 WM CREATE 中初始化字符和单词结构体变量 并向服务器请 求 dAllWord 个单词 放入 sGWLive 中 sGWDead 为空 接着创建一个定时器 该定时 器 1 秒启动一次 WM TIMER 中的代码开始执行 此时 遍历所有 sGWDead 如果有 就向服务器请求 然后添加到 sGWLive 中 nLiveWord 同时将该单词从 sGWDead 中删除 nDeadWord 3 在渲染函数中 遍历 sGWLive 将活着的单词显示到场景中 如果单词被玩家 22 杀死了 则将该单词添加到 sGWDead 中 并从 sGWLive 中删除 4 为了使问题简单明了化 下图给出的是用一个 GWWord 来存储 Live 和 Dead 单 词 当然这样的缺点就是在 WM TIMER 和渲染函数中都要遍历 dAllWord 个单词 图 3 19 单词的重生和轮回算法 5 字符和单词的对比可以采用 KMP 算法思想 6 在程序启动或者玩家在场景中漫游时 动态播放背景音乐 3 3 服务器端的详细设计与实现 3 3 1 Win32 应用程序框架 与客户端不一样的是 服务器端只需要显示很少的信息 其他大部分时间都处于后 台工作状态 同客户端一样的是 程序从 WinMain 函数入口 其功能是首先定义一个 Windows 的窗口样式 大小等 并创建 显示和更新这个窗口 然后进入 MsgProc 中的 WM PAINT WM TIMER WM COMMOND 等消息循环 如果发生网络连接事件 则 连接数据库进行查询 然后将结果反馈给客户端 如图 3 20 所示 23 图 3 20 Windows 程序框架 3 3 2 数据包的设计 1 在网络游戏中 关于游戏中的所有怪物和玩家的信息是可变的 并且这些信息不 能全部存储在客户端中 因此 需要服务器根据玩家的位置把怪物的位置 其他玩家的 角色信息等必要的信息发送给客户端 客户端根据服务器发送的数据构成画面 一个典 型的基于 C S 架构的回合制游戏的运行流程如图 3 21 所示 图 3 21 C S 架构的回合制游戏 24 2 为了使客户端和服务器端能够友好和快速地交流 数据包的设计不仅要巧 还要 小 例如 客户端登录时 就需要向服务器端发送关于登录的数据包 服务器收到这个 数据包后 按照双方事先的约定 查看这个数据包的目的 当服务器知道目的后 就提 取数据包中的帐号和密码 同时读取数据库查找信息 如果正确 就向客户端发送允许 登录的数据包 这样 客户端就能成功登录了 如图 3 22 所示 图 3 22 客户端向服务器发送数据包 3 如图 3 23 所示的数据包 在数据包的开始部分 tag 指明了该数据包是干什么的 后面则是数据包的内容 因此 用一个结构体来定义数据包 图 3 23 数据包结构体 4 当然 为了数据包的安全 客户端和服务器端可以对数据包进行加密和解密处理 25 3 3 3 网络通信 1 有了前面的准备 就可以使用 Winsock 网络编程 使客户端和服务器端进行通信 了 流程如下 服务器端程序 1 创建套接字 socket 2 将套接字绑定到一个本地地址和端口上 bind 3 将套接字设为监听模式 准备接收客户请求 listen 4 等待客户请求到来 当请求到来后 接受连接请求 返回一个新的对应于此次 连接的套接字 accept 5 用返回的套接字和客户端进行通信 send recv 6 返回 等待另一客户请求 7 关闭套接字 客户端程序 1 创建套接字 socket 2 向服务器发出连接请求 connect 3 和服务器端进行通信 send recv 4 关闭套接字 2 服务器端利用基于消息句柄的 Windows 响应机制 对网络事件进行检测和处理 首先 当接到客户端的连接请求时 通过已经 bind 的套接字发生 FD ACCEPT 时间 其 次 根据这一事件 进行连接处理 然后 当已经完成连接处理的套接字中发生 FD READ 事件时 利用 recv 函数把接收的数据存储到数据包结构体中 最后 利用 send 函数向客户端发送消息 3 服务器端定义一个结构体来存储已经连接的客户端的套接字和 IP 以便接收数据 或向其发送数据 图 3 24 客户端消息结构体 26 3 3 4 数据库的设计 1 服务器端除了要接收和处理客户端发来的消息外 还要按需地对客户端的消息进 行存储 比如 客户端到了场景中的某个地方 因为有事需要暂时下线 那么服务器端 就要记住客户端下线的位置 以便客户端上线后能在相同的地方出现 图 3 25 和 3 26 为服务器端的数据库设计 该数据库中各表的字段应符合数据包中 的各变量 图 3 25 数据库的 login 表 图 3 26 数据库的 word 表 2 使用 ADO 技术对数据库进行访问 ADO 是 COM 组件 因此在使用的时候需要 CoInitialize NULL 初始化 这样就可以 使用 ConnectionPtr 和 RecordsetPtr 对象对数据库进行连接和访问了 当然 使用完后还 需要关闭和卸载 下面简单说明服务器端如何对客户端的登录做验证 sCLIENT MESSAGE sClientMsg recv wParam char switch sClientMsg tag case LOGIN 27 pRecordset CreateInstance uuidof Recordset pRecordset pConnection Execute select from login NULL adCmdText pRecordset MoveFirst while pRecordset adoEOF vAccount pRecordset GetCollect id vPassword pRecordset GetCollect password if bstr t clientMsg sId bstr t vAccount send wParam char break pRecordset MoveNext if pRecordset adoEOF clientMsg tag UNALLOW send wParam char pRecordset Close pRecordset Release break 3 3 5 日志记录 为了方便维护和调试 将服务器的每一次操作存储到日志中 可以使用 C 语言或 C 语言的文件操作 1 使用 C 语言操作文件 FILE pFileLog NULL 28 pFileLog fopen 20110514 log a fwrite buffer 1 strlen buffer pFileLog fflush pFileLog fclose pFileLog 2 使用 C 语言操作文件 ofstream fWriteLog fWriteLog open 20110514 log fWriteLog buffer fWriteLog flush fWriteLog close 3 3 6 结果展示 图 3 27 服务器界面 3 3 7 客户端的网络同步 一个人玩游戏是比较枯燥的 所以当前玩家还可以与其他玩家进行交互 首先就是 要知道其他玩家相对自己的位置 那么如何实现呢 当然就是通过服务器的中继作用了 29 比如某个客户端做了移动这个操作 为了保证与其他客户端的网络同步 该客户端 需要把更新消息发送给服务器端 服务器除了处理该客户端的请求 还需要把其他客户 端的消息也发送给该客户端 这样该客户端就能显示其他客户端并且与之互动了 如图 3 28 所示 图 3 28 服务器的中继作用 3 3 8 网络优化 假设一个最简单的多人游戏的模型 比如一个 FPS 游戏 客户端每次将输入的数据 比如前进 跳跃 开火 发送到服务器端 然后服务器端将玩家当前的位置和情况发 回给客户端来做显示 在这个最简单的模型中 只要有一个包丢失了 所有的东西都必须停下来等包的重 发 任何操作都得停掉 不能移动也不能射击 等到这个包到达的时候 总算能继续操 作了 但是可能会发现还有一堆等待重发的包在排队 于是只好继续等 而且可能收到 的这个重发包对游戏来说已经失去时效性 完全没意义了 这就是 TCP 的可靠传输所带来的问题 1 为了解决这种问题 首先可以使用 UDP 协议 UDP 协议排除了可靠传输机制 将安全和排序等功能交给上层应用来完成 极大降 低了执行时间 从而是速度得到了保证 同时还保证了数据的完整性 相对于可靠性来 说 更快地传输效率意味着更少的服务器延时 当然 也可以在使用 TCP 传输一些序列 行很强的 如 AI 数据加载 NPC 对话等数据的同时 使用 UDP 来传输一些即时性很 强的数据 不过 这种 TCP 就要是基于 UDP 之上的一种类 TCP 因为 TCP 和 UDP 都是 30 基于 IP 协议的 他们在底层会互相干扰 这也是现代游戏中流行的网络架构 2 采用多播技术 客户端将数据发送到服务器 服务器更新数据并把相应的信息发送给所有客户端 此时 不仅存在着一个流量问题 还存在着服务器处理效率的问题 举例来说 一台运行着的服务器上有 100 个客户端 某个客户端向服务器发送了一 条更新消息 为了保证游戏的同步性 服务器需要把这个消息向其他所有的客户端进行 广播 因此这条消息将发送给 100 个玩家 假定这条消息的大小为 100 字节 服务器将 发送 10KB 的数据 然而一般情况下 同一个时刻不止一个玩家向服务器发送消息 假设 有 30 个玩

温馨提示

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

评论

0/150

提交评论