1、2D 赛 车 游 戏 的 设 计 与 实 现摘 要随 着 电 脑 的 普 及 , 游 戏 已 成 为 大 多 数 年 青 人 的 主 要 休 闲 方 式 , 赛 车 价 格 比 较 昂 贵 ,而 赛 车 游 戏 则 可 以 让 那 些 想 玩 赛 车 却 没 法 玩 的 人 体 验 一 把 。 爱 好 赛 车 竞 速 游 戏 的 玩 家们 以 体 验 比 赛 中 的 刺 激 为 乐 趣 , 玩 家 唯 一 的 真 实 目 的 就 是 “最 快 ”。本 设 计 所 实 现 的 赛 车 游 戏 是 基 于 C 语 言 设 计 开 发 的 , 所 选 用 的 游 戏 引 擎 是 基 于Directx
2、8.0 编 写 的 。 能 进 行 赛 车 、 赛 道 以 及 各 种 图 片 的 绘 制 , 实 现 各 种 游 戏 音 效 , 获取 键 盘 输 入 , 单 人 游 戏 时 , 可 与 电 脑 控 制 的 赛 车 竞 速 , 多 人 游 戏 时 可 与 其 他 玩 家 或 电脑 AI 竞 速 。与 其 他 类 似 游 戏 相 比 , 本 设 计 所 采 用 的 碰 撞 检 测 算 法 , 像 边 界 矩 形 盒 算 法 和 颜 色 识别 算 法 , 不 仅 速 度 快 , 而 且 检 测 灵 敏 。 多 人 游 戏 的 实 现 是 靠 socket 网 络 编 程 与 多 线程 的 联 用
3、 , socket 提 供 C/S 模 式 下 数 据 的 可 靠 传 输 , 多 线 程 解 决 了 socket 等 待 问 题 ,两 者 结 合 使 得 在 局 域 网 内 的 多 人 游 戏 运 行 比 较 流 畅 。关 键 词 : 2D, DirectX, 赛 车 , 游 戏AbstractDesign and Implementation of 2D Racing GameAbstractWith the popularity of computer games has become a major leisure activity for most young people ,
4、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 langua
5、ge 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 p
6、layers 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
7、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目 录第 一 章 绪 论 .11.1 研 究 背 景
8、 及 意 义 .11.2 赛 车 游 戏 开 发 环 境 和 语 言 .11.3 赛 车 游 戏 的 主 要 功 能 .11.4 赛 车 游 戏 开 发 的 主 要 步 骤 .2第 二 章 DIRECTX、 游 戏 引 擎 和 游 戏 结 构 .32.1 DIRECTX 概 述 .32.2 游 戏 引 擎 .32.2.1 选 用 的 游 戏 引 擎 结 构 .42.3 游 戏 结 构 .52.4 本 章 小 结 .6第 三 章 游 戏 逻 辑 .83.1 游 戏 主 逻 辑 .83.2 单 人 游 戏 逻 辑 .93.3 多 人 游 戏 逻 辑 .133.3.1 多 人 游 戏 服 务 器 端
9、 逻 辑 .133.3.2 多 人 游 戏 客 户 端 逻 辑 .153.4 显 示 游 戏 胜 利 .153.5 本 章 小 结 .16第 四 章 赛 车 碰 撞 检 测 技 术 .174.1 边 界 矩 形 盒 方 法 .174.2 颜 色 识 别 算 法 .194.3 本 章 小 结 .24第 五 章 SOCKET 网 络 通 信 实 现 多 人 游 戏 .255.1 SOCKET 简 介 .255.1.1 什 么 是 Socket.25计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书II5.1.2 Windows Socket 编 程 模 型 .255.1.3 游 戏 所
10、 使 用 的 Socket 模 型 .315.2 粘 包 问 题 .325.2.1 粘 包 出 现 的 原 因 .325.2.2 粘 包 问 题 解 决 办 法 .335.2.3 关 闭 优 化 算 法 .345.3 多 线 程 与 SOCKET 组 合 实 现 多 人 游 戏 .345.3.1 多 线 程 的 使 用 .345.3.2 多 线 程 与 socket 的 联 用 .365.4 本 章 小 结 .39第 六 章 游 戏 调 试 及 运 行 .406.1 游 戏 程 序 的 环 境 .406.2 游 戏 运 行 界 面 .40结 论 .42致 谢 .43参 考 文 献 .44计 算
11、 机 信 息 工 程 学 院 毕 业 设 计 说 明 书1第 一 章 绪 论1.1 研 究 背 景 及 意 义游 戏 可 以 锻 炼 我 们 的 大 脑 , 提 高 大 脑 思 维 的 敏 捷 性 和 灵 活 性 , 让 我 们 暂 时 抛 开 自己 的 烦 恼 , 缓 解 现 实 生 活 给 予 我 们 的 压 力 。 玩 游 戏 可 以 让 我 们 适 当 的 放 松 , 缓 解 精 神疲 劳 。中 国 的 游 戏 产 业 在 多 年 里 迅 猛 的 发 展 。 一 开 始 主 要 依 靠 国 外 代 理 , 而 现 在 自 主 研发 的 游 戏 已 经 占 了 大 部 分 的 市 场 份
12、 额 , 现 在 的 游 戏 产 业 , 在 中 国 的 经 济 发 展 中 发 挥 着不 可 替 代 的 作 用 。随 着 国 际 国 内 的 游 戏 产 业 的 发 展 , 三 维 游 戏 逐 渐 成 为 游 戏 市 场 中 的 主 要 形 式 , 但2D 游 戏 因 为 自 己 的 独 特 的 优 点 并 没 有 退 出 人 们 的 视 野 , 反 而 在 网 页 游 戏 、 娱 乐 休 闲 游戏 等 领 域 快 速 的 发 展 。 和 欧 美 、 日 韩 游 戏 产 业 发 展 比 较 成 熟 的 国 家 相 比 , 中 国 的 3D技 术 并 不 成 熟 , 很 多 游 戏 公 司
13、的 精 力 主 要 放 在 技 术 方 面 的 处 理 , 想 尽 量 模 仿 国 外 优 秀游 戏 的 处 理 技 术 , 而 且 3D 游 戏 的 投 资 比 较 大 , 只 有 一 小 部 分 大 型 公 司 有 实 力 进 行 开 发 。与 此 相 对 的 是 , 因 为 2D 游 戏 的 技 术 处 理 难 度 比 较 低 , 游 戏 公 司 不 仅 可 以 将 精 力 放 在 技术 处 理 方 面 , 还 可 以 多 花 些 精 力 在 游 戏 策 划 方 面 , 以 丰 富 游 戏 的 内 容 , 它 的 整 体 开 发周 期 短 , 投 入 的 资 金 少 得 多 , 这 些
14、优 点 使 得 2D 游 戏 非 常 适 合 在 中 国 发 展 。从 中 国 游 戏 玩 家 的 反 应 来 看 , 3D 游 戏 的 吸 引 力 比 2D 游 戏 强 的 多 , 玩 家 都 更 加 喜欢 画 面 质 量 优 秀 的 游 戏 。 大 多 数 2D 游 戏 通 常 比 较 轻 松 、 休 闲 、 操 作 难 度 低 , 并 且 对 硬件 和 系 统 没 什 么 要 求 , 非 常 适 合 那 些 喜 欢 休 闲 娱 乐 、 交 友 的 人 。 现 在 的 2D 游 戏 中 也利 用 不 少 的 3D 处 理 技 术 来 优 化 游 戏 画 面 , 如 粒 子 系 统 、 水
15、波 特 效 、 爆 炸 特 效 等 。 所 以 ,中 国 的 2D 游 戏 还 是 有 比 较 好 的 发 展 前 途 的 , 尤 其 是 在 手 机 游 戏 中 , 在 电 脑 游 戏 里 也 不会 被 取 代 , 因 此 , 2D 游 戏 的 开 发 是 我 们 值 得 关 注 和 研 究 的 问 题 。1.2 赛 车 游 戏 开 发 环 境 和 语 言本 设 计 所 用 的 语 言 是 C语 言 实 现 的 , 软 件 使 用 的 是 VC+6.0, 还 要 Directx8.0。DirectX是 微 软 公 司 开 发 的 基 于 Windows系 统 的 多 媒 体 编 程 接 口
16、, 编 写 的 语 言 是C+,并 且 遵 循 COM。 它 可 以 提 高 在 window平 台 运 行 的 游 戏 或 者 多 媒 体 程 序 的 运 行 速 度 ,有 很 强 的 3D图 像 处 理 能 力 , 并 且 支 持 2D 3D图 形 加 速 。 使 得 开 发 人 员 在 创 建 3D场 景 时不 需 要 考 虑 硬 件 的 类 型 , 只 需 要 通 过 Direct3D调 用 设 备 接 口 就 可 以 操 作 图 形 设 备 , 简化 了 游 戏 开 发 难 度 。1.3 赛 车 游 戏 的 主 要 功 能本 设 计 可 实 现 较 真 实 的 游 戏 音 效 、 键
17、 盘 接 口 、 局 域 网 内 通 信 等 功 能 。 所 设 计 的 游戏 可 以 进 行 两 种 类 型 的 游 戏 即 单 人 和 多 人 游 戏 , 游 戏 包 括 赛 车 创 建 、 赛 道 载 入 、 碰 撞检 测 、 控 制 在 跑 赛 车 、 赛 车 数 据 处 理 。 单 人 游 戏 中 有 电 脑 控 制 的 赛 车 可 以 与 玩 家 进 行计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书2赛 车 , 多 人 游 戏 是 可 以 各 自 控 制 赛 车 , 在 不 同 的 赛 道 上 有 不 同 的 速 度 , 第 一 个 到 终 点胜 利 。 编 译 通
18、 过 或 找 出 查 出 的 问 题 , 进 行 最 终 调 试 , 完 成 游 戏 。1.4 赛 车 游 戏 开 发 的 主 要 步 骤本 游 戏 利 用 现 在 比 较 常 用 的 Visual C+ 6.0 工 具 , 基 于 DirectX 8.0, 用 C 语 言实 现 , 进 行 系 统 的 分 析 , 从 玩 家 的 角 度 去 思 考 , 怎 么 实 现 开 赛 车 时 的 快 感 与 激 情 。实 现 赛 车 的 控 制 、 赛 道 载 入 、 碰 撞 检 测 、 赛 车 数 据 处 理 和 多 人 游 戏 等 。 主 要 步 骤为 :( 1) 设 计 并 画 游 戏 的 场
19、 景 ;( 2) 设 计 界 面 ;( 3) 游 戏 逻 辑 的 设 计 与 实 现 ;( 4) 游 戏 功 能 模 块 设 计 与 实 现 ;( 5) 游 戏 测 试 ;计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书3第 二 章 DirectX、 游 戏 引 擎 和 游 戏 结 构DirectX 是 PC 平 台 上 开 发 游 戏 的 事 实 上 的 标 准 , 而 游 戏 引 擎 能 使 开 发 游 戏 的 工 作量 大 大 的 减 少 , 本 毕 业 设 计 所 使 用 的 游 戏 引 擎 是 在 Directx8.0 上 编 写 的 。 下 面 是Directx8.0
20、、 游 戏 引 擎 的 一 些 介 绍 。2.1 DirectX 概 述Microsoft 公 司 的 DirectX 是 一 个 多 媒 体 应 用 编 程 接 口 , 它 实 际 上 是 一 种 软 件 系统 , 抽 象 出 音 频 、 输 入 、 视 频 、 网 络 以 及 安 装 等 内 容 , 由 C+语 言 实 现 , 遵 循COM( 组 件 对 象 模 型 ) 。 你 可 以 使 用 相 同 的 代 码 , 而 不 管 计 算 机 的 具 体 硬 件 配 置 怎 么 样 。另 外 , DirectX 比 Windows 系 统 自 带 的 GDI 要 快 很 多 , 而 且 系
21、统 更 稳 定 。DirectX 的 主 要 组 件 有DirectDraw、 DirectGraphic、 DirectInput、 DirectPlay、 DirectMusic 和DirectSound。 不 同 的 API 负 责 完 成 DirectX 内 核 中 不 同 的 功 能 。 DirectX 中 的 每 个API 都 可 以 通 过 硬 件 加 速 。 这 意 味 着 只 要 是 DirectX 支 持 的 硬 件 , 都 可 以 用 程 序 访 问到 , 而 不 用 关 心 它 的 具 体 实 现 。 下 面 是 它 的 主 要 组 件 和 功 能 :DirectDra
22、w: 主 要 负 责 2D 图 像 加 速 , 所 有 图 像 的 绘 制 都 要 用 到 它 , 因 此 它 是 十 分重 要 的 。 在 8.0 之 后 的 版 本 已 没 有 了 。DirectGraphic: 主 要 负 责 向 屏 幕 上 渲 染 二 维 图 形 和 三 维 图 形 。 它 实 际 是DirectDraw 和 Direct3D 合 并 起 来 的 。DirectInput: 它 可 以 直 接 使 用 所 有 与 计 算 机 关 联 的 输 入 设 备 。 这 些 设 备 包 括 键 盘 、鼠 标 、 游 戏 控 制 杆 、 操 作 杆 、 空 间 定 位 球 等 设
23、 备 。 重 要 的 是 , DirectInput 可 以 和 所有 现 在 的 或 将 来 的 输 入 设 备 对 话 。DirectPlay: 可 以 通 过 因 特 网 、 调 制 解 调 器 或 直 接 连 接 来 建 立 抽 象 的 连 接 。DirectMusic: 支 持 MIDI。DirectSound: 声 音 组 件 , 支 持 数 字 化 声 音 ( WAV) , 但 不 支 持 MIDI。DirectX 目 前 已 经 发 展 到 到 DirectX12, 一 开 始 , DirectX 1 很 不 成 功 , 当 到 了DirectX 8 时 , 它 引 发 了 显
24、 卡 革 命 , 引 入 像 素 渲 染 概 念 。 DirectX 11 增 加 了 新 的 计 算shader 技 术 , 它 允 许 GPU 从 事 更 多 的 计 算 工 作 , 而 不 仅 是 3D 运 算 , 这 可 以 将 GPU 作为 并 行 处 理 器 使 用 。 DirectX 11 还 支 持 tessellation 镶 嵌 化 技 术 , 这 有 助 于 开 发 人员 创 建 更 为 细 腻 流 畅 的 模 型 , 实 现 高 质 量 实 时 渲 染 和 预 渲 染 场 景 。 DirectX 11 另 外 一大 亮 点 是 可 以 更 好 地 利 用 多 线 程 资
25、 源 , 从 而 使 游 戏 更 有 效 地 利 用 多 核 处 理 器 。 目 前 ,已 更 新 到 DirectX12, 毫 无 疑 问 DirectX 给 游 戏 业 带 来 了 巨 大 的 发 展 。 2.2 游 戏 引 擎游 戏 引 擎 是 游 戏 中 与 游 戏 具 体 实 现 无 关 的 核 心 技 术 部 分 , 可 以 说 是 游 戏 的 心 脏 ,计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书4而 游 戏 的 部 分 就 是 场 景 模 型 、 角 色 模 型 、 动 画 、 声 音 等 其 他 控 制 部 分 。 经 过 几 十 年 不断 的 发 展 ,
26、现 在 的 游 戏 引 擎 已 经 发 展 成 一 个 由 多 个 子 系 统 共 同 构 成 的 复 杂 系 统 。 游 戏引 擎 就 是 为 了 降 低 游 戏 开 发 者 们 重 复 劳 动 , 节 省 开 发 时 间 和 开 发 费 用 而 诞 生 的 , 它 封装 了 很 多 在 游 戏 制 作 中 常 用 的 功 能 , 让 我 们 能 直 接 调 用 这 些 功 能 而 不 用 再 从 头 编 写 。下 面 是 游 戏 引 擎 主 要 的 结 构 。2.2.1 选 用 的 游 戏 引 擎 结 构毕 业 设 计 所 设 计 的 赛 车 游 戏 中 所 使 用 的 的 游 戏 引 擎
27、 由 3 个 库 函 数 组 成 :T3DLIB1、 T3DLIB2、 T3DLIB3。1、 T3DLIB1: 这 是 一 个 相 当 简 单 的 二 维 8/16 位 色 , 并 具 有 后 备 缓 冲 的 Directx引 擎 , 支 持 任 何 分 辨 率 , 并 且 不 在 意 是 否 为 窗 口 模 式 。 主 要 包 含 :( 1) Direct 接 口 函 数 如 :DDraw_Init(int width, int height, int bpp, int windowed=0): 启 动 并 初 始化 DirectDraw, 可 以 选 择 任 何 分 辨 率 和 颜 色 色
28、 深 , windowed 为 0 表 示 全 屏 , 若 想 为窗 口 模 式 , 应 置 1, 并 且 不 可 选 择 分 辨 率 和 颜 色 深 度 。DDraw_Shutdown(void): 关 闭 Directdraw 并 释 放 所 有 接 口 。DDraw_Attach_Clipper()给 发 送 的 表 面 关 联 一 个 裁 剪 器 等 等 。( 2) 2D 多 边 形 函 数包 含 点 、 线 、 多 边 形 的 绘 制 以 及 绘 制 GDI 文 字 等 。(3)数 学 和 误 差 函 数包 含 计 算 两 点 间 的 距 离 、 打 开 误 差 文 件 等 。( 4
29、) 位 图 函 数包 括 加 载 位 图 函 数 、 释 放 位 图 函 数 、 创 建 内 存 位 图 、 绘 制 位 图 等( 5) 调 色 板 函 数这 些 函 数 只 用 于 256 色 , 即 8 位 模 式 , 包 含 读 取 调 色 板 函 数 、 更 新 调 色 板 、 保 存调 色 板 等 。( 6) 实 用 工 具 函 数如 Get_Clock()、 Start_Clock()等 时 间 函 数 以 及 矩 形 碰 撞 检 测 和 颜 色 检 测 函 数 。( 7) BOB 对 象 ( 类 似 精 灵 ) 及 其 处 理 函 数包 含 对 BOB 操 作 的 各 种 函 数
30、 。2、 T3DLIB2:输 入 系 统 。 此 系 统 比 较 简 单 主 要 功 能 如 下 :( 1) 初 始 化 DirectInput 系 统 。( 2) 设 置 并 获 取 键 盘 、 鼠 标 、 游 戏 杆 。( 3) 从 输 入 设 备 中 读 取 数 据 。( 4) 关 闭 设 备 。计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书53、 T3DLIB3: 声 音 控 制 。 包 含 DirectSound 和 DirectMusic:( 1) DirectSound 实 现 .wav 格 式 的 波 形 声 音 数 据 的 播 放 控 制 , 它 的 API
31、封 装 功能 如 下 :DirectSound 的 初 始 化 及 关 闭 。用 11kHz、 8 声 道 载 入 .WAV 文 件 。播 放 加 载 的 声 音 文 件 。停 止 播 放 。检 测 声 音 的 播 放 状 态 。改 变 音 量 、 回 放 速 率 或 立 体 声 的 声 道 平 衡 。删 除 声 音 数 据 。( 2) DirectMusic 实 现 MIDI 文 件 的 播 放 控 制 , 其 API 封 装 功 能 如 下 :DirectMusic 的 初 始 化 及 关 闭 。加 载 MIDI 文 件 。播 放 MIDI 文 件 。停 止 正 在 播 放 的 MIDI
32、文 件 。检 测 声 音 播 放 状 态 。如 果 DirectSound 已 被 初 始 化 , 则 自 动 连 接 DirectSound。删 除 MIDI。2.3 游 戏 结 构所 有 的 游 戏 本 质 上 是 一 个 持 续 不 断 的 while循 环 , 它 执 行 逻 辑 并 在 屏 幕 上 不 间 断 的绘 制 更 新 图 像 , 通 常 以 3060帧 每 秒 速 度 不 断 的 绘 制 , 本 设 计 所 实 现 的 赛 车 游 戏 也 是 如此 , 但 图 像 是 以 30帧 每 秒 的 速 度 绘 制 。 本 设 计 所 实 现 的 赛 车 游 戏 流 程 如 图 2
33、-1, 下 面是 游 戏 的 每 个 子 流 程 的 说 明 。计 算 机 信 息 工 程 学 院 毕 业 设 计 说 明 书6WinMian()CreateWindow();GameInit();主 事 件 循 环Game_Shutdown();GameInit()WinProc()Process MessagesGame_mian()Game_Shutdown()Game_main()输 入人 工 智 能 和 逻 辑.渲 染图 2-1 游 戏 程 序 流 程 图( 1) Game_Init()初 始 化在 这 一 部 分 中 , 游 戏 执 行 初 始 化 操 作 , 此 赛 车 游 戏
34、主 要 的 初 始 化 工 作 有 对 三 角 函数 、 DirectDraw、 DirectSound、 DirectInput的 初 始 化 、 键 盘 的 初 始 化 、 声 音 的 载 入 、创 建 裁 剪 器 、 游 戏 开 始 画 面 载 入 与 绘 制 、 各 个 位 图 ( 包 括 赛 车 、 终 点 、 赛 道 、 指 示 灯 、菜 单 画 面 ) 的 载 入 。( 2) Game_main()这 一 部 分 是 游 戏 的 主 要 部 分 , 包 括 获 取 玩 家 的 输 入 信 息 、 执 行 人 工 智 能 、 游 戏 逻辑 、 绘 制 。( 3) Game_Shut
35、down ()此 部 分 是 在 退 出 游 戏 循 环 后 执 行 的 , 用 来 释 放 资 源 。 先 释 放 各 种 位 图 资 源 ( 如 赛车 、 终 点 、 指 示 灯 等 ) , 再 将 DirectDraw对 象 释 放 掉 , 这 两 个 的 顺 序 不 能 搞 错 , 删 除 所有 声 音 , 释 放 DirectSound对 象 , 释 放 键 盘 设 备 。2.4 本 章 小 结本 章 主 要 介 绍 了 DirectX8.0、 游 戏 引 擎 和 游 戏 基 本 结 构 。 在 列 举 的 Directx8.0的 主 要 组 件 中 , DirectDraw、 DirectInput、 DirectMusic 和 DirectSound 是 和 本 毕 业设 计 所 设 计 的 游 戏 相 关 的 , 并 且 是 选 用 的 游 戏 引 擎 的 基 础 。 所 列 出 的 游 戏 引 擎 中 的 功能 模 块 是 本 毕 业 设 计 主 要 用 到 的 , 是 实 际 编 写 过 程 中 必 须 要 调 用 的 部 分 。 本 设 计 的 游