二D赛车游戏的设计与实现_第1页
二D赛车游戏的设计与实现_第2页
二D赛车游戏的设计与实现_第3页
二D赛车游戏的设计与实现_第4页
二D赛车游戏的设计与实现_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

2D 赛车游戏的设计与实现 摘摘 要要 随着电脑的普及 游戏已成为大多数年青人的主要休闲方式 赛车价格比较昂贵 而赛车游戏则可以让那些想玩赛车却没法玩的人体验一把 爱好赛车竞速游戏的玩家 们以体验比赛中的刺激为乐趣 玩家唯一的真实目的就是 最快 本设计所实现的赛车游戏是基于 C 语言设计开发的 所选用的游戏引擎是基于 Directx8 0 编写的 能进行赛车 赛道以及各种图片的绘制 实现各种游戏音效 获 取键盘输入 单人游戏时 可与电脑控制的赛车竞速 多人游戏时可与其他玩家或电 脑 AI 竞速 与其他类似游戏相比 本设计所采用的碰撞检测算法 像边界矩形盒算法和颜色识 别算法 不仅速度快 而且检测灵敏 多人游戏的实现是靠 socket 网络编程与多线 程的联用 socket 提供 C S 模式下数据的可靠传输 多线程解决了 socket 等待问题 两者结合使得在局域网内的多人游戏运行比较流畅 关关键键词词 2D DirectX 赛车 游戏 Abstract Design and Implementation of 2D Racing Game Abstract With the popularity of computer games has become a major leisure activity for most young people cars are expensive and racing games for those who want to play can play racing who had no opportunity to experience one Hobby car racing game players to experience the game for fun stimulation players only real purpose is the fastest This design is realized racing game based on the C language design and development the choice of the game engine is based on Directx8 0 written Capable of racing track and draw various pictures sound effects to achieve a variety of games to get keyboard input single player game with computer controlled car racing multiplayer games with other players or computer AI racing Compared with other similar games collision detection algorithms used in the design like the bounding rectangle box algorithm and color recognition algorithm not only fast but also detection sensitivity Multiplayer is achieved by the socket network programming and multi threaded MS socket provides reliable data transmission under C S mode multi threaded socket waiting to solve the problem a combination that makes the LAN multiplayer games run more smooth Keywords 2D DirectX racing game 计算机信息工程学院毕业设计说明书 I 目目 录录 第第一一章章 绪绪论论 1 1 1 1 研究背景及意义 1 1 2 赛车游戏开发环境和语言 1 1 3 赛车游戏的主要功能 1 1 4 赛车游戏开发的主要步骤 2 第第二二章章 D DI IR RE EC CT TX X 游游戏戏引引擎擎和和游游戏戏结结构构 3 3 2 1 DIRECTX 概述 3 2 2 游戏引擎 3 2 2 1 选用的游戏引擎结构 4 2 3 游戏结构 5 2 4 本章小结 6 第第三三章章 游游戏戏逻逻辑辑 8 8 3 1 游戏主逻辑 8 3 2 单人游戏逻辑 9 3 3 多人游戏逻辑 13 3 3 1 多人游戏服务器端逻辑 13 3 3 2 多人游戏客户端逻辑 15 3 4 显示游戏胜利 15 3 5 本章小结 16 第第四四章章 赛赛车车碰碰撞撞检检测测技技术术 1 17 7 4 1 边界矩形盒方法 17 4 2 颜色识别算法 19 4 3 本章小结 24 第第五五章章 S SO OC CK KE ET T 网网络络通通信信实实现现多多人人游游戏戏 2 25 5 5 1 SOCKET简介 25 5 1 1 什么是 Socket 25 计算机信息工程学院毕业设计说明书 II 5 1 2 Windows Socket 编程模型 25 5 1 3 游戏所使用的 Socket 模型 31 5 2 粘包问题 32 5 2 1 粘包出现的原因 32 5 2 2 粘包问题解决办法 33 5 2 3 关闭优化算法 34 5 3 多线程与 SOCKET组合实现多人游戏 34 5 3 1 多线程的使用 34 5 3 2 多线程与 socket 的联用 36 5 4 本章小结 39 第第六六章章 游游戏戏调调试试及及运运行行 4 40 0 6 1 游戏程序的环境 40 6 2 游戏运行界面 40 结结论论 4 42 2 致致谢谢 4 43 3 参参考考文文献献 4 44 4 计算机信息工程学院毕业设计说明书 1 第第一一章章 绪绪论论 1 1 1 1 研研究究背背景景及及意意义义 游戏可以锻炼我们的大脑 提高大脑思维的敏捷性和灵活性 让我们暂时抛开自 己的烦恼 缓解现实生活给予我们的压力 玩游戏可以让我们适当的放松 缓解精神 疲劳 中国的游戏产业在多年里迅猛的发展 一开始主要依靠国外代理 而现在自主研 发的游戏已经占了大部分的市场份额 现在的游戏产业 在中国的经济发展中发挥着 不可替代的作用 随着国际国内的游戏产业的发展 三维游戏逐渐成为游戏市场中的主要形式 但 2D 游戏因为自己的独特的优点并没有退出人们的视野 反而在网页游戏 娱乐休闲游 戏等领域快速的发展 和欧美 日韩游戏产业发展比较成熟的国家相比 中国的3D 技术并不成熟 很多游戏公司的精力主要放在技术方面的处理 想尽量模仿国外优秀 游戏的处理技术 而且 3D 游戏的投资比较大 只有一小部分大型公司有实力进行开发 与此相对的是 因为 2D 游戏的技术处理难度比较低 游戏公司不仅可以将精力放在技 术处理方面 还可以多花些精力在游戏策划方面 以丰富游戏的内容 它的整体开发 周期短 投入的资金少得多 这些优点使得 2D 游戏非常适合在中国发展 从中国游戏玩家的反应来看 3D 游戏的吸引力比 2D 游戏强的多 玩家都更加喜 欢画面质量优秀的游戏 大多数 2D 游戏通常比较轻松 休闲 操作难度低 并且对硬 件和系统没什么要求 非常适合那些喜欢休闲娱乐 交友的人 现在的 2D 游戏中也 利用不少的 3D 处理技术来优化游戏画面 如粒子系统 水波特效 爆炸特效等 所以 中国的 2D 游戏还是有比较好的发展前途的 尤其是在手机游戏中 在电脑游戏里也不 会被取代 因此 2D 游戏的开发是我们值得关注和研究的问题 1 1 2 2 赛赛车车游游戏戏开开发发环环境境和和语语言言 本设计所用的语言是C语言实现的 软件使用的是 VC 6 0 还要Directx8 0 DirectX是微软公司开发的基于Windows系统的多媒体编程接口 编写的语言是 C 并且遵循COM 它可以提高在window平台运行的游戏或者多媒体程序的运行速度 有很强的3D图像处理能力 并且支持2D 3D图形加速 使得开发人员在创建 3D场景时 不需要考虑硬件的类型 只需要通过 Direct3D调用设备接口就可以操作图形设备 简 化了游戏开发难度 1 1 3 3 赛赛车车游游戏戏的的主主要要功功能能 本设计可实现较真实的游戏音效 键盘接口 局域网内通信 等功能 所设计的游 戏可以进行两种类型的游戏即单人和多人游戏 游戏包括赛车创建 赛道载入 碰撞 检测 控制在跑赛车 赛车数据处理 单人游戏中有电脑控制的赛车可以与玩家进行 计算机信息工程学院毕业设计说明书 2 赛车 多人游戏是可以各自控制赛车 在不同的赛道上有不同的速度 第一个到终点 胜利 编译通过或找出查出的问题 进行最终调试 完成游戏 1 1 4 4 赛赛车车游游戏戏开开发发的的主主要要步步骤骤 本游戏利用现在比较常用的 Visual C 6 0 工具 基于 DirectX 8 0 用 C 语言 实现 进行系统的分析 从玩家的角度去思考 怎么实现开赛车时的快感与激情 实现赛车的控制 赛道载入 碰撞检测 赛车数据处理和多人游戏 等 主要步骤 为 1 设计并画游戏的场景 2 设计界面 3 游戏逻辑的设计与实现 4 游戏功能模块设计与实现 5 游戏测试 计算机信息工程学院毕业设计说明书 3 第第二二章章 D Di ir re ec ct tX X 游游戏戏引引擎擎和和游游戏戏结结构构 DirectX 是 PC 平台上开发游戏的事实上的标准 而游戏引擎能使开发游戏的工作 量大大的减少 本毕业设计所使用的游戏引擎是在 Directx8 0 上编写的 下面是 Directx8 0 游戏引擎的一些介绍 2 2 1 1 D Di ir re ec ct tX X 概概述述 Microsoft 公司的 DirectX 是一个多媒体应用编程接口 它实际上是一种软件系 统 抽象出音频 输入 视频 网络以及安装等内容 由 C 语言实现 遵循 COM 组件对象模型 你可以使用相同的代码 而不管计算机的具体硬件配置怎么样 另外 DirectX 比 Windows 系统自带的 GDI 要快很多 而且系统更稳定 DirectX 的主要组件有 DirectDraw DirectGraphic DirectInput DirectPlay DirectMusic 和 DirectSound 不同的 API 负责完成 DirectX 内核中不同的功能 DirectX 中的每个 API 都可以通过硬件加速 这意味着只要是 DirectX 支持的硬件 都可以用程序访问 到 而不用关心它的具体实现 下面是它的主要组件和功能 DirectDraw 主要负责 2D 图像加速 所有图像的绘制都要用到它 因此它是十分 重要的 在 8 0 之后的版本已没有了 DirectGraphic 主要负责向屏幕上渲染二维图形和三维图形 它实际是 DirectDraw 和 Direct3D 合并起来的 DirectInput 它可以直接使用所有与计算机关联的输入设备 这些设备包括键盘 鼠标 游戏控制杆 操作杆 空间定位球等设备 重要的是 DirectInput 可以和所 有现在的或将来的输入设备对话 DirectPlay 可以通过因特网 调制解调器或直接连接来建立抽象的连接 DirectMusic 支持 MIDI DirectSound 声音组件 支持数字化声音 WAV 但不支持 MIDI DirectX 目前已经发展到到 DirectX12 一开始 DirectX 1 很不成功 当到了 DirectX 8 时 它引发了显卡革命 引入像素渲染概念 DirectX 11 增加了新的计算 shader 技术 它允许 GPU 从事更多的计算工作 而不仅是 3D 运算 这可以将 GPU 作 为并行处理器使用 DirectX 11 还支持 tessellation 镶嵌化技术 这有助于开发人 员创建更为细腻流畅的模型 实现高质量实时渲染和预渲染场景 DirectX 11 另外一 大亮点是可以更好地利用多线程资源 从而使游戏更有效地利用多核处理器 目前 已更新到 DirectX12 毫无疑问 DirectX 给游戏业带来了巨大的发展 2 2 2 2 游游戏戏引引擎擎 游戏引擎是游戏中与游戏具体实现无关的核心技术部分 可以说是游戏的心脏 计算机信息工程学院毕业设计说明书 4 而游戏的部分就是场景模型 角色模型 动画 声音等其他控制部分 经过几十年不 断的发展 现在的游戏引擎已经发展成一个由多个子系统共同构成的复杂系统 游戏 引擎就是为了降低游戏开发者们重复劳动 节省开发时间和开发费用而诞生的 它封 装了很多在游戏制作中常用的功能 让我们能直接调用这些功能而不用再从头编写 下面是游戏引擎主要的结构 2 2 2 2 1 1 选选用用的的游游戏戏引引擎擎结结构构 毕业设计所设计的赛车游戏中所使用的的游戏引擎由 3 个库函数组成 T3DLIB1 T3DLIB2 T3DLIB3 1 T3DLIB1 这是一个相当简单的二维 8 16 位色 并具有后备缓冲的 Directx 引擎 支持任何分辨率 并且不在意是否为窗口模式 主要包含 1 Direct 接口函数如 DDraw Init int width int height int bpp int windowed 0 启动并初始 化 DirectDraw 可以选择任何分辨率和颜色色深 windowed 为 0 表示全屏 若想为 窗口模式 应置 1 并且不可选择分辨率和颜色深度 DDraw Shutdown void 关闭 Directdraw 并释放所有接口 DDraw Attach Clipper 给发送的表面关联一个裁剪器等等 2 2D 多边形函数 包含点 线 多边形的绘制以及绘制 GDI 文字等 3 数学和误差函数 包含计算两点间的距离 打开误差文件等 4 位图函数 包括加载位图函数 释放位图函数 创建内存位图 绘制位图等 5 调色板函数 这些函数只用于 256 色 即 8 位模式 包含读取调色板函数 更新调色板 保存 调色板等 6 实用工具函数 如 Get Clock Start Clock 等时间函数以及矩形碰撞检测和颜色检测函数 7 BOB 对象 类似精灵 及其处理函数 包含对 BOB 操作的各种函数 2 T3DLIB2 输入系统 此系统比较简单主要功能如下 1 初始化 DirectInput 系统 2 设置并获取键盘 鼠标 游戏杆 3 从输入设备中读取数据 4 关闭设备 计算机信息工程学院毕业设计说明书 5 3 T3DLIB3 声音控制 包含 DirectSound 和 DirectMusic 1 DirectSound 实现 wav 格式的波形声音数据的播放控制 它的 API 封装功 能如下 DirectSound 的初始化及关闭 用 11kHz 8 声道载入 WAV 文件 播放加载的声音文件 停止播放 检测声音的播放状态 改变音量 回放速率或立体声的声道平衡 删除声音数据 2 DirectMusic 实现 MIDI 文件的播放控制 其 API 封装功能如下 DirectMusic 的初始化及关闭 加载 MIDI 文件 播放 MIDI 文件 停止正在播放的 MIDI 文件 检测声音播放状态 如果 DirectSound 已被初始化 则自动连接 DirectSound 删除 MIDI 2 2 3 3 游游戏戏结结构构 所有的游戏本质上是一个持续不断的 while循环 它执行逻辑并在屏幕上不间断的 绘制更新图像 通常以30 60帧每秒速度不断的绘制 本设计所实现的赛车游戏也是如 此 但图像是以30帧每秒的速度绘制 本设计所实现的赛车游戏流程如图 2 1 下面 是游戏的每个子流程的说明 计算机信息工程学院毕业设计说明书 6 WinMian CreateWindow GameInit 主事件循环 Game Shutdown GameInit WinProc Process Messages Game mian Game Shutdown Game main 输入 人工智能和逻辑 渲染 图2 1 游戏程序流程图 1 Game Init 初始化 在这一部分中 游戏执行初始化操作 此赛车游戏主要的初始化工作有对三角函 数 DirectDraw DirectSound DirectInput的初始化 键盘的初始化 声音的载入 创建裁剪器 游戏开始画面载入与绘制 各个位图 包括赛车 终点 赛道 指示灯 菜单画面 的载入 2 Game main 这一部分是游戏的主要部分 包括获取玩家的输入信息 执行人工智能 游戏逻 辑 绘制 3 Game Shutdown 此部分是在退出游戏循环后执行的 用来释放资源 先释放各种位图资源 如赛 车 终点 指示灯等 再将DirectDraw对象释放掉 这两个的顺序不能搞错 删除所 有声音 释放DirectSound对象 释放键盘设备 2 2 4 4 本本章章小小结结 本章主要介绍了 DirectX8 0 游戏引擎和游戏基本结构 在列举的 Directx8 0 的主要组件中 DirectDraw DirectInput DirectMusic 和 DirectSound 是和本毕业 设计所设计的游戏相关的 并且是选用的游戏引擎的基础 所列出的游戏引擎中的功 能模块是本毕业设计主要用到的 是实际编写过程中必须要调用的部分 本设计的游 计算机信息工程学院毕业设计说明书 7 戏的基本结构与其他游戏类似 本质上就 是一个持续不断的 while 循环 它执行逻辑 并根据逻辑计算出下一帧图像 并在屏幕上不间断的绘制更新图像 游戏最终表现出 来的就是一帧又一帧连续的画面 本设计所要做的就是在循环中 不断的获取键盘的 输入 根据输入执行游戏逻辑 生成下一个游戏动画帧 最后渲染该动画帧 计算机信息工程学院毕业设计说明书 8 第第三三章章 游游戏戏逻逻辑辑 3 3 1 1 游游戏戏主主逻逻辑辑 游戏主逻辑如图 2 1 所示 图 2 1 游戏主逻辑流程图 开始时钟 将后备缓冲填充黑色 依据 game state 的值选择相应的功能 game state 值类型有 GAME STATE INIT 初始状态 GAME STATE MENU 菜单选择 GAME STATE RUNNING 游戏进行 GAME STATE EXIT 退出 GAME STATE WAIT EXIT 等待退出 如果 game state 为 GAME STATE INIT 为游戏初始状态 停止准备音乐 将 game state 置 GAME STATE MENU 并重置游戏数据 进入菜单选择界面 读取键盘键 值 上 下移动箭头 Enter 为确认选择 若为单人游戏或多人游戏则将当前状态置 为 GAME STATE RUNNING 将游戏种类置为当前值 退出选项与 Escape 键为退出 当 计算机信息工程学院毕业设计说明书 9 为可识别键时 播放按键音 然后将菜单选择界面与箭头绘制在后备缓冲表面 换页 并等待 100 毫秒 等待时间不宜太短 否则会出现连击的现象 当 game state 为 GAME STATE RUNNING 时为游戏进行时 之后判断 game type 的 值 GAME TYPE SINGLEPLAYER 为单人模式 GAME TYPE MULTIPLAYER 为多人游戏 GAME TYPE WIN 为胜利状态 换页 并等待 30ms 期间如果检测到 Escape 键 则将 game state 置为 GAME STATE MENU 并重置游戏数据 当 game state 为 GAME STATE EXIT 为游戏退出状态 则将 game state 置 GAME STATE WAIT EXIT 游戏退出等待状态 发送消息 WM DESTROY 之后将进入退 出等待阶段 期间游戏不进行操作 等待退出 3 3 2 2 单单人人游游戏戏逻逻辑辑 单人游戏的总的游戏逻辑如图 2 2 所示 图 2 2 单人游戏流程图 具体模块如下 1 判断准备 判断 gameready 是否为 3 若为 3 则读取键值 若不为 3 将当前的 gameready 计算机信息工程学院毕业设计说明书 10 的值赋给指示灯当前动画帧 light curr frame 等待一秒钟 播放准备声音 gameready 自加 并将 0 号车的状态改为玩家状态 之后对读取的键值进行相应的操 作 上键为打开引擎前进 左键与右键改变方向 2 赛车数据处理 这一部分是关键部分 决定了赛车的具体位置 引擎声音以及各种状态 赛车是 BOB 对象 本部分分别对各个对象进行数据处理 首先对按键所产生的信号和 AI 所产生的信号进行处理 无论信号是来自接受来自 输入或 AI 算法 他们对赛车对象所产生的变化是同一种类型 所以处理时 只要根据 赛车对象的内部数据执行相应的改变 如果引擎打开 则提高当前速度 不超过最大 速度 并提高引擎发声频率 若引擎关闭 则减小引擎发声频率 方向向哪个方向变 则将相应的加或减相应的方向数值 第二步算出赛车在 X 和 Y 方向上这一帧的位移变化 进行碰撞检测 因为赛车之 间只能进行一次检测 所以 将当前赛车与之后的赛车进行碰撞检测 若检测到碰撞 则将位移大的赛车减小位移 将位移小的增加位移 之后重新算出赛车的速度以及方 向 查三角函数表 找出与赛车实际方向最接近的表中方向 并将该方向值赋给赛车 方向 第三步 将赛车在世界坐标中的位置加上位移变化得出当前的位置坐标 并进行 越界检测 若赛车超出世界范围 则强制将赛车位置约束在范围之内 3 移动窗口位置 这一部分的功能是为保证主视角以玩家控制的赛车为中心 但不超过世界范围 1000 1000 窗口在世界中有它的坐标 窗口坐标在 360 520 范围之内 不可超出 此范围 当赛车超出窗口中心时 窗口坐标则移动以确保赛车在中心处 中心范围为 x 坐标在 200 到 240 y 坐标在 160 到 320 4 绘制赛道 赛道的绘制一定要在颜色识别之前进行 不然 颜色识别将无法进行 本游戏的 赛道种类共有 10 种 外加一个草地 形成游戏的地形 每个位图大小为 200 200 大 小 世界地形是存储在一个二维字符数组里 此字符数组内字符种类为 0 9 和 g 0 9 代表各个种类的赛道 g 代表草地 字符数组的存储如下所示 char world 5 61117 02g30 0ggg0 05g40 91118 计算机信息工程学院毕业设计说明书 11 赛道在游戏世界里的排列如图 2 3 所示 图 2 3 赛道显示图 由图中可以看到有些位图完全在窗口内 有些完全在窗口外 有些部分在窗口内 有两种方法可以将位图绘制在后备缓冲表面 下面是两种方法 第一种方法 可以将所有位图直接绘制在后备缓冲表面 赛道对象为 road 这是 一个 BOB 对象 其中存储了 10 张赛道位图 可遍历字符数组 因为每张图在世界中的 坐标可以算出 都为 200 的倍数 在由世界坐标算出他在窗口的坐标 之后 调用 Draw BOB 左侧位图在数组的 x 位置 x r view x 639 200 右侧位图在数组的 x 位置 y t view y 200 上侧位图在数组的 y 位置 y b view y 479 200 下侧位图在数组的 y 位置 然后依据上述值 将所选中的位图 blt 到后备缓冲表面 5 实行 AI 算法 AI 算法是对所有非玩家控制的赛车进行的 首先 当 gameready 信号为 3 时 打 开引擎 之后对赛车左右两边 30 度距离赛车中心 60 像素的区域进行颜色识别 若为 绿色 那么将方向变化改为相反方向 最后进行边界检测 计算机信息工程学院毕业设计说明书 12 6 检测摩擦力 路面摩擦力为 0 15 草地摩擦力为 0 19 并且 当赛车在草地行驶时 摩擦力会 达到 0 34 所以在路面行驶的加速度会比草地的加速度大 而且 路面速度的最大值 比草地的最大值要大 实际行驶时 在路面行如风 而在草地则非常慢 这是为了不 让玩家从草地走 7 绘制各种物体以及赛车 这一部分十分简单 就是调用 Draw BOB 将地图上的各个物体绘制上去 包括终点 赛车 红绿灯 这些物体都要先计算在窗口的位置 之后绘制 8 判断胜负 本游戏的胜负判断一定要依次通过地图上的 6 个区域 这是为了让玩家走完全程 因 为此赛车游戏的赛道是一个环状赛道 所以 终点也是起点 胜负判断也是判断谁先 走完一圈 其中 终点与起点的判别是一样的 而其余四种则是判断是否走过赛道的 四个角落 这四种的判别十分容易 这里不做说明 由于赛车可以绕过起点线 在草 地上行驶 所以要判断赛车是向上穿过终点或起点 判断穿过只需判断赛车中心进入 终点 而要确保赛车向上穿过可以同时判断赛车此时的方向是否向上 当赛车依次通 过这 6 个区域 就将当时赛车的排名记录下来 保存在此时的赛车对象里 当有三辆 赛车经过终点 则将 game type 赋值 GAME TYPE WIN 进入游戏胜利模块 3 3 3 3 多多人人游游戏戏逻逻辑辑 多人游戏的实现是靠 Socket 网络编程实现的 它分为服务器端和客户端 这两个 的游戏逻辑不一样 主要的游戏数据处理都在服务器端进行 并且进行发送数据和显 示等操作 而客户端则接收数据并发送用户所控制的赛车的引擎状态和方向变化等信 息 3 3 3 3 1 1 多多人人游游戏戏服服务务器器端端逻逻辑辑 多人游戏服务器端流程如图 2 4 所示 图 2 4 多人游戏服务器端流程 计算机信息工程学院毕业设计说明书 13 各个模块的功能如下 1 创建线程 创建一个主线程 用来对 Socket 的设置 创建其他线程用来接收或发送数据 2 链接界面 这部分是显示当前链接上的玩家 在屏幕上显示 player x in 并不断地发送给 相应玩家对应的赛车号码 若检测到有玩家链接 则将下一个赛车控制权转交到新连 接的玩家手中 直到服务器端玩家按下回车键 之后向所有玩家发出游戏开始信号 客户端接收到信号后开始游戏 3 游戏进行 此部分与单人游戏相似 详情可以参照图 2 5 不同之处在两处 下面是不同之 处 1 在检测摩擦力之后进行的是发送数据 将各个玩家控制的赛车数据发给相应 玩家 如赛车的车号 坐标 引擎状态 方向 2 在判断胜负部分里 当有赛车走完一圈时 向所有玩家发送这辆赛车的车号 以及名次 当有三辆赛车到达终点时 向所有玩家发送游戏结束信号 计算机信息工程学院毕业设计说明书 14 图 2 5 服务器端游戏运行流程 3 3 3 3 2 2 多多人人游游戏戏客客户户端端逻逻辑辑 客户端的游戏流程与服务器端类似 可参见图 2 4 但具体实现上有很大差别 下面是客户端各个模块的功能 1 创建线程 创建一个主线程 用来对 Socket 的设置 用来接收或发送数据 2 链接界面 这部分是显示当前链接上的玩家的状态 如果连接上在屏幕上显示 player x in 如果没有链接上 就不显示 3 游戏进行 这一部分只依次进行判断准备 接收输入信号 赛车数据处理 移动窗口 发送 数据和绘图 其中移动窗口是以当前玩家所控制的赛车为主视角 赛车数据处理只进 行赛车声音以及方向的处理 胜负判断是依据服务器发送过来的信号进行的 具体流 程如图 2 6 所示 计算机信息工程学院毕业设计说明书 15 判断准备 赛车数据处理 移动窗口位置 绘制赛道 绘制各种物体以及赛车 判断胜负 发送数据 图 2 6 客户端游戏运行流程 3 3 4 4 显显示示游游戏戏胜胜利利 当游戏判断结束时 游戏将执行这部分 此部分执行时 游戏画面将不动 并在 画面上打出信息 第一行根据不同的名次打出不同的信息 如果是第一名将显示 Y O U W I N 字样 而第 2 3 名显示具体的名次 如 N U M 2 如果是第四名则 显示 Y O U f A I L 字样 第二行打出 PRESS 按下 Escape 键 则进入菜单选择界面 并将游戏数据初始化 3 3 5 5 本本章章小小结结 本章主要介绍了赛车游戏的游戏逻辑 其中包含好几个部分 如单人游戏逻辑和 多人游戏逻辑 游戏逻辑至关重要 因为它将具体实现游戏各个方面的内容 如具体 的图片绘制以及绘制顺序 胜负判别等等 游戏逻辑是运用游戏引擎提供的一些方法 并将其有序的组织起来来具体实现游戏的 计算机信息工程学院毕业设计说明书 16 第第四四章章 赛赛车车碰碰撞撞检检测测技技术术 碰撞检测是赛车游戏设计中最关键的一项技术 一个好的碰撞检测往往会使游戏 变得更真实 而粗略的碰撞算法会出现许多 bug 使玩家无法玩下去 在此毕业设计所 实现的赛车游戏中 涉及到的碰撞检测共有两种 第一种是边界矩形盒方法 第二种 是颜色识别算法 下面将分别介绍 4 4 1 1 边边界界矩矩形形盒盒方方法法 边界矩形盒方法是检测两个矩形是否重叠的方法 矩形可以代表任何东西 在这 里代表赛车 你必须给出他们的左上角坐标以及高度和宽度 如果有重叠 则返回 TRUE 否则返回 FALSE 下面是它的代码 int Collision Test int x1 int y1 int w1 int h1 int x2 int y2 int w2 int h2 this function tests if the two rects overlap get the radi of each rect int width1 w1 1 w1 3 int height1 h1 1 h1 3 int width2 w2 1 w2 3 int height2 h2 1 h2 3 compute center of each rect int cx1 x1 width1 int cy1 y1 height1 int cx2 x2 width2 int cy2 y2 height2 compute deltas int dx abs cx2 cx1 int dy abs cy2 cy1 abs 是取绝对值 test if rects overlap if dx width1 width2 else else no collision return 0 end Collision Test 计算机信息工程学院毕业设计说明书 17 这个函数实现的基本思想是分别计算两个矩形的中心坐标 然后根据中心坐标的 x 和 y 轴的距离判断两个矩形是否重叠 如果两个矩形相交 如图 3 1 所示 X Y 矩形 1 矩形 2 图 3 1 两矩形相交 设这两个矩形的各个数据和函数的参数一样 顶点坐标为 x1 y1 和 x2 y2 矩形 1 的宽为 w1 高为 h1 矩形 2 的宽为 w2 高为 h2 那么两矩形的中点坐标为 x1 w1 2 y1 h1 2 x2 w2 2 y2 h2 2 因为这两个矩形相交 所以 他们的中点坐 标必有如下关系 x1 w1 2 x2 w2 2 w1 w2 2 并且 y1 h1 2 y2 h2 2 1 w1 3 int height1 h1 1 h1 3 int width2 w2 1 w2 3 int height2 h2 1 h2 3 其中 width1 为八分之三 w1 并不是本系统所用的二分之一 这是因为此函数通 常用于位图的碰撞检测 而位图是以长方形载入的 且物体的图像通常在长方形的中 央 但不会占满整个长方形 如图 3 2 所示 计算机信息工程学院毕业设计说明书 18 图 3 2 赛车位图资源 赛车实体与矩形是有区别的 虽然 本系统所列的判别方法可以准确判断矩形重叠 但当判断重叠时 屏幕上所显示的物体并没有发生碰撞 而上述函数所用的方法虽然 不准确 实际矩形重叠但检测不出来 但在游戏运行时 实际看上去效果会好很多 也更加真实 所以用八分之三比用二分之一要好 还有一点 w1 1 w1 3 就是 w1 3 8 但为什么要这么麻烦呢 这主要是 考虑到执行速度 位移与加减法比做乘除法要快的多 游戏要考虑到速率 所以 尽 量用快速的方法 4 4 2 2 颜颜色色识识别别算算法法 颜色识别算法在此游戏中被频繁用到 这是一个非常好用的算法 它没有非常复 杂的原理 只是读出颜色值 然后进行判别 它的速度也很快 对在窗口内的碰撞检 测十分有效 下面是它的具体实现 int Color Scan int x1 int y1 int x2 int y2 UCHAR scan start UCHAR scan end UCHAR scan buffer int scan lpitch this function implements a crude collision technique based on scanning for a range of colors within a rectangle if x1 screen width x1 screen width 1 else if x1 screen width x2 screen width 1 计算机信息工程学院毕业设计说明书 19 else if x2 screen height y1 screen height 1 else if y1 screen height y2 screen height 1 else if y2 0 y2 0 scan the region scan buffer y1 scan lpitch for int scan y y1 scan y y2 scan y for int scan x x1 scan x scan start end for x move down a line scan buffer scan lpitch end for y a scan buffer x2 sprintf s d a Draw Text GDI s 8 8 RGB 255 255 255 lpddsback return failure return 0 end Color Scan 这个函数使用时须要的参数有很多 如下 1 需要扫描的区域 扫描区域是一个矩形 需要传入矩形的左上顶点坐标和右下 计算机信息工程学院毕业设计说明书 20 顶点坐标 即参数列表中的 x1 y1 x2 y2 2 需要给出要寻找的颜色值范围即 scan start 和 scan end 这是 8 位模式下 的状态 它的数据也是应该是 8 位索引值 而 UCHAR 是 8 位 函数会在寻找范围里寻 找从 scan start 到 scan end 的颜色 如果找到则返回 1 否则返回 0 3 UCHAR scan buffer 是要传入一个指向表面的指针 通常是指向后备缓冲表 面的指针 因为主表面通常是进过换页而来的 换页是与后备缓冲表面交换的 即主 表面显示的是当时的前一帧的状态 无法对当前状况作出反应 所以 不用主表面进 行颜色识别 而扫描离屏表面没有任何意义 因为离屏表面是储存位图的表面 所以 也不用离屏表面 绘图的实际操作是在后备缓冲表面上进行的 所以 通常传入指向 后备缓冲表面的指针 4 int scan lpitch 这个参数通常传入的是 lPitch 或 back lpitch 这两个 的只是一样的 即你所在显示模式的水平内存间距 如图 3 3 所示 lPitch 是该显 示模式中每行上的字数 也被称为步幅 stride 或内存宽度 memory width 这 个参数也可以传入一个具体的值 如果当时的显示模式是 640 480 8 那么 该模 式下每行有 640 个像素 每个像素为 8 位 或者说一个字节 因此 实际每行应该 恰为 640 个字节 即传入的值为 640 如果在 640 480 16 模式下 传入的值是 1280 每像素 2 个字节为 640 2 虽然可以传入一个具体的值 但这确有一定危险 lPitch 可以是任何值 视 VRAM 布局而定 因此当逐行访问一个 DirectDraw 显示表面 内存时 这里访问的是后备缓冲表面 必须利用 lPitch 移到下一行 而不是用像素 字节数乘宽度 总之 如果使用 lPitch 来进行内存计算 这样 所写的代码就总是安 全的 计算机信息工程学院毕业设计说明书 21 图 3 3 访问的表面 该函数一开始就对传入的矩形的顶点做判断 保证扫描区域在窗口范围之内 如 果矩形超出扫描范围 则只扫描在窗口范围里的矩形大小 在上述代码中 对x1 的 越界操作为 x1 0 和 x1 screen width 1 这里不将 x1 置为 screen width 是 有理由的 分辨率为 640 480 表示水平方向含有像素数为 640 个 垂直方向像素数 480 个 而在程序里 后备缓冲表面 back buffer 的存储是从 0 开始的 所以 当 x1 为 screen width 时 实际上已不在表面的工作区了 要它的最大边界是 screen width 1 其他坐标点类似 接下来该函数开始逐行访问后备缓冲表面的内存 因为 后备缓冲表面的内存实 际是一个线性数组 所以在换行时需要加上 lPitch 上面所列出的颜色识别函数实际上是在 8 位模式下的才能用的 指向表面的指针 定义为 UCHAR scan buffer 这是一个指向 UCHAR 的指针 而 UCHAR 是 8 位 正巧这 个表面所储存的一个颜色值是一个 8 位索引值 所以 在查找对应像素的颜色时 指 针的下标值就是 lPitch 的整数倍再加上横坐标 这个函数不能在十六位模式下工作 但是如果要在十六位模式下进行颜色识别呢 T3DLIB1 函数库提供了一个工作于 16 位模式下的颜色识别算法 Color Scan16 虽然本游戏没有用到 但还是要说明一下 Color Scan16 与上述所列的 8 位模式 下的函数的实现原理基本相同 不同的只是在颜色比较时 他们的数据类型为 USHORT 16 位 查找时只将存储的颜色值与开始颜色或末尾的颜色值比较 所以只 计算机信息工程学院毕业设计说明书 22 能查找这两种颜色 不能像 8 位那样查找一段颜色范围 这是因为 16 位模式下 是 RGB 编码的像素值 如果要查一个从红色 red 的值为 10 green 的值为 0 blue 的 值为 0 到深一点的红色 red 的值为 11 green 的值为 0 blue 的值为 0 若按 8 位方法查询 就会将其他颜色范围也一并包含进来 如颜色值 0 01010 11110 00000 T3DLIB1 函数库没有给出 24 和 32 位模式下的颜色识别函数 颜色识别也可以在 其他模式下进行 8 位模式 存储一个像素的颜色要一个字节 而 16 位模式下 存储 一个像素的颜色要 2 个字节 同样 24 位要 3 个字节 32 位要 4 个字节 除了 8 位模 式外 其他模式都是 RGB 编码的像素值 如图 3 4 所示 图 3 4 16 24 32 位 RGB 像素编码 因为各个模式下的 RGB 像素编码的模式不同 所以 建立他们时 也要用不同的 算法 基本上可以通过简单的移位和掩码操作来完成此算法 算法表示为如下的宏 this builds a 16 bit color value in 5 5 5 format 1 bit alpha mode define RGB16BIT555 r g b b hThread sok num CreateThread NULL NULL AnswerThread LPVOID AcceptSocket 0 此功能的主要思想是在监听函数调用后 进入循环 循环内先调用 accept 如果没有客户端连接 就等待 这不影响进程的执行 如果有客户端连接 则建立连 接 返回一个套接字 之后对连接数进行判断 决定是否跳出循环 如果连接数在最 大车数内 则建立子线程 并传入分配的套接字 流程可见图 4 6 计算机信息工程学院毕业设计说明书 36 accept 等待连 接 建立子线程 sok num MAX CA R N Y 退出 图 4 6 多线程创建流程 2 子线程要执行的函数很简单 主要实现接收并处理数据的功能 循环调用 recv 函数和 set player data 函数 recv 是用来接收数据的 而 set player data 是处理接受的数据的 2 2 客客户户端端 客户端只创建一个主线程 用来连接并处理数据 不同的游戏状态 对应不同的 处理方式 程序流程如图 4 7 所示 计算机信息工程学院毕业设计说明书 37 multi state 1 开始游戏 是否开始游 戏 Y N Y N 设置数据 设置赛车编 号 socket 的创建与配 置 connect 连接 recv 接收数 据 连接成 功 Y N 回到选择界面 重置 数据 退出 图 4 7 客户端主线程的流程 3 3 客客户户端端与与服服务务器器端端通通信信的的数数据据格格式式及及其其处处理理 1 准备阶段 此时 当客户端连接后 服务器端会向每个连接上的客户端发送对应的赛车号码 具体形式就是一个单独的数字字符如 1 客户端接收到此字符 并将玩家操控的赛 车编号改为当前值 之后 只要服务器端检测到回车键 就向每个连接的客户端发送 字符 a 表示游戏开始 客户端接收到 a 后 也进入游戏运行界面 2 游戏运行时 服务器端每一帧都向每个客户端发送当时各种赛车的状态 数据格式如下 车号 x 坐标 y 坐标 引擎状态 方向 客户端根据 为标识 将数据分割 并将各种数据赋给相应的赛车数据 客户 端每一帧也向服务器发送他所控制的赛车的数据 数据格式如下 计算机信息工程学院毕业设计说明书 38 车号 方向变化 引擎状态 服务器端也按客户端的处理方式将数据分割并赋给将相应的赛车数据 3 胜负判断 当有赛车走过一圈时 服务器端对所有客户端发送 w 赛车号 名次 的消息 如 果游戏结束则发送 s 的消息 客户端检测到 w 后 将后面的数据分割并将对应赛 车号的名次填入 当检测到 s 后 进入结束状态 游戏胜利状态 5 5 4 4 本本章章小小结结 本章讲述了 socket 多线程以及他们的联用方法 这是实现多人游戏的通信方法 是实现多人游戏最关键的部分 socket 网络通信编程实现了局域网内的计算机之间的 通信问题 多线程解决了因使用 socket 而带来的接收等待问题 这两个技术的组合完 美实现了局域网内 C S 模式下的一点对多点的多机通信 再通过约定数据格式就实现 了多人游戏 从最后的游戏效果来看 还是不错的 也说明了这个技术是有效的 计算机信息工程学院毕业设计说明书 39 第第六六章章 游游戏戏调调试试及及运运行行 6 6 1 1 游游戏戏程程序序的的环环境境 首先 本设计所实现的游戏要用到 VC 6 0 除了这个还要 Directx8 0 新建工 程后 工程为 Win32 Application 要将 Direct

温馨提示

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

评论

0/150

提交评论