游戏入门基础]DOS到Windows的 游 戏 移 植(9) 

2007-01-08 10:55 发布

4342 0 0
--- 本 期 我 们 将 讨 论 有 关 图 形 方 面 的 问 题。 和 本 系 列 文 章 的 前 面 文 章 相 类 似, 我 们 还 是 主 要 讨 论 在 Windows 下 编 程 和 在DOS 环 境 下 编 程 的 主 要 差 别。

调 色 板 ---- 在 这 里, 我 们 假 定 程 序 员 使 用 的 是 256 色 设 计。 当 把DOS 游 戏 的 图 形 移 植 到 Windows 时, 有 两 个 关 键 的 调 色 板 问 题 需 要 考 虑。

---- 第 一, 如 果 游 戏 不 要 求 在 全 屏 幕 运 行, 它 将 需 要 与 其 他 有 自 己 的 调 色 板 的 程 序 共 存。 假 设 程 序 显 示 一 个 使 用 150 色 的 位 图。 在 后 台 有 一 个 其 他 的 应 用 程 序 或 桌 面 墙 纸 使 用 了200 色, 并 且 Windows 本 身 也 为 标 题 栏、 菜 单 以 及 其 他 项 目 保 留 了20 色, 那 么 需 要 在 256 色 模 式 下 同 时 显 示 的 颜 色 总 数 将 达 到 370。

---- Windows 如 何 处 理 这 种 需 求 呢 ? 根 本 方 法 是, 它 在 不 同 的 应 用 程 序 之 间 协 调, 做 最 小 的 颜 色 调 整。 换 句 话 说, 把 370 色 减 少 到 256 色。 具 体 做 法 是:

---- 在 前 台 的 应 用 程 序 第 一 次 得 到 在 实 际 的 硬 件 调 色 板 中 选 择 颜 色 集 合 的 机 会。 通 过 给 前 台 应 用 程 序 第 一 个 选 择 调 色 板 颜 色 的 机 会, 系 统 使 用 户 在 大 多 数 时 间 都 心 情 愉 快, 因 为 最 吸 引 用 户 注 意 的 应 用 程 序 得 到 了 选 择 颜 色 集 合 的 机 会。 后 台 的 应 用 程 序 不 得 不 使 用 被 给 予 的 颜 色, 但 是 Windows 还 是 试 图 调 节 它 们 需 要 的 颜 色。 如 果 前 台 应 用 程 序 没 有 用 尽 所 有 可 用 的 硬 件 调 色 板 颜 色, 后 台 应 用 程 序 按 照 先 到 先 服 务 的 原 则 使 用 剩 下 的 颜 色。 当 所 有 的 可 用 颜 色 都 用 尽,Windows 则 试 图 将 后 台 应 用 程 序 所 需 要 的 颜 色 映 射 到 硬 件 中 的 当 前 集 合。 这 种 适 应 造 成 对 后 台 应 用 程 序 图 像 的 影 响, 但 至 少 能 提 供 一 个 尚 可 辨 认 的 图 形。

---- 那 么, 这 些 问 题 对 游 戏 开 发 者 有 什 么 实 际 影 响 呢 ? 如 果 应 用 程 序 在 全 屏 幕 模 式 使 用 DirectDraw, 一 点 影 响 也 没 有。 但 是 对 于 一 个 在 窗 口 内 的 游 戏, 对 颜 色 的 选 择 会 产 生 负 效 应。

---- 几 年 前, 有 一 个 非 常 著 名 的 冒 险 游 戏 叫 做 Loom, 它 是 为 扩 展 图 形 适 配 器 (EGA) 所 写 的。 这 个 游 戏 的 设 计 者 突 破 了 16 色 的 限 制, 方 法 是 用 主 色 彩(thematic hues) 创 建 故 事 场 景。 例 如, 一 个 祖 母 绿 的 城 市 使 用 了64 色 调 色 板 的 所 有 可 用 的 绿 色, 而 丢 弃 了 不 是 保 持 画 面 元 素 所 必 须 的 其 他 颜 色。

---- 如 果 在 基 于 Windows 的 游 戏 中 这 样 做, 也 就 是 说, 使 用 150 种 绿 色 创 建 一 个 非 常 完 美、 真 实 的 森 林, 那 么,Windows 可 能 会 花 费 大 量 的 时 间 来 试 图 映 射 背 景 颜 色 到 可 用 的 调 色 板, 并 且 用 做 桌 面 墙 纸 的 落 日 的 照 片 可 能 会 很 难 看。 同 样, 当 它 在 后 台 时, 森 林 景 象 可 能 变 成 了“ 泥 巴”。 这 也 许 不 算 是 大 问 题, 但 确 是 一 个 要 考 虑 的 负 效 应。

---- 要 考 虑 的 第 二 个 问 题 是 个 大 问 题。Windows 为 其 自 身 保 留 的 20 个 系 统 或“ 静 态” 颜 色。 它 非 常 妒 忌 地 保 护 着 这 些 颜 色, 如 果 游 戏 使 用 了 256 种 不 同 的 颜 色, 那 对 程 序 员 来 说 就 太 糟 了。 因 为 这 些 颜 色 中 的 20 个 将 映 射 到 保 留 的 颜 色, 结 果 是 看 起 来 可 能 舒 服, 也 可 能 不 舒 服。 所 以 程 序 员 不 得 不 要 么 把 颜 色 减 少 为 236 种, 要 么 确 信 该 静 态 颜 色 在 每 一 个 场 景 的 调 色 板 中 都 存 在。 为 了 得 到 最 好 的 性 能, 还 要 确 信 静 态 颜 色 是 在 Windows 能 够 找 到 的 调 色 板 槽 中。 详 细 应 用 请 参 阅“ 一 致 调 色 板”("identity palette") 方 面 的 书 籍。

---- 在 Windows 平 台 下 还 有 许 多 的 调 色 板 管 理 问 题, 所 以 建 议 程 序 员 如 果 要 移 植 一 个 有 大 量 图 形 的 游 戏, 最 好 仔 细 阅 读 有 关 书 籍,Thompson 的 书 是 极 优 秀 的 入 门 指 南。

图 形 字 体 与 TrueType 字 体 的 比 较 ---- 要 在DOS 游 戏 中 显 示 文 本, 需 创 建 一 个 或 多 个 大 的 字 母 位 图, 使 用 一 个 算 法 来 在 字 体 中 查 找 字 符 并 以 正 确 的 比 例 间 距 显 示 它 们。 这 种 技 术 在 Windows 下 仍 然 能 够 工 作, 当 然, 要 把 字 体 放 在 其 自 身 DirectDraw 表 面 缓 冲 区 的 位 置, 以 便 很 快 变 为 幕 后 显 示 缓 冲 区。

---- 另 一 个 方 法 是 TrueType, 这 是Windows 所 具 有 的 可 缩 放 的 字 体 技 术。 程 序 员 可 能 会 在 标 准 对 话 框 中 使 用 TrueType 字 体, 也 可 以 把 它 作 为 图 形 屏 幕 的 一 部 分。 其 好 处 是 字 体 已 经 造 好 并 且 具 有 可 缩 放 性; 缺 点 是 只 能 使 用 Windows 95 所 带 的 标 准 字 体 类 型, 而 不 能 使 用 任 何 其 他 想 要 与 游 戏 一 同 许 可 和 发 行 的 字 体。

---- Moby Dick 包 含 了 一 个 非 常 简 单 的 示 例 把 TrueType 文 本 直 接 放 置 在 位 图 中。 任 何 DirectDraw 表 面 都 可 以 被 作 为 图 形 设 备 接 口(GDI) 的 绘 制 表 面 而 处 理, 在 传 统 的 Windows 编 程 中, 图 形 设 备 接 口(GDI) 是 一 个 函 数 的 集 合, 用 于 显 示 文 本 和 图 形。 当 Moby Dick 的 图 形 被 初 始 化 时, 一 些 文 本 被 放 置 到 保 持 大 海 图 形 的 主 副 本 的 DirectDraw 表 面 中。 这 些 文 本 变 成 了 大 海 位 图 的 一 部 分。 当 该 图 形 被 blitted 到 后 备 缓 冲 区 中 时, 或 从 后 备 缓 冲 区 到 原 始 表 面 时, 该 文 本 与 图 形 是 在 一 起 的。

---- 下 面 的 代 码 设 置 大 海 的 图 形 并 向 其 中 写 文 本:




// 创 建 chart 表 面



lpDDS_Map =



    DDLoadBitmap(lpDD, MAKEINTRESOURCE(IDB_MAP), 0, 0);    



// 为 它 获 取 一 个 设 备 上 下 文, 这 也 会 锁 定 该 表 面。



lpDDS_Map->GetDC(&hdc);



// 设 置 透 明 模 式, 这 样 文 本 不 会 超 出 整 个 矩 形 框。



SetBkMode(hdc, TRANSPARENT);



// “ 创 建”( 选 择) 所 需 字 体



hFont = EzCreateFont(hdc, "Times New Roman", 150, 0, EZ_ATTR_ITALIC, 0);



// 选 择 它 到 设 备 上 下 文



SelectObject(hdc, hFont);



// 写 文 本



TextOut(hdc, 50, 50, "Here be Whales", 14);



// 删 除 字 体 对 象。



DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));



// 释 放 设 备 上 下 文, 并 且 解 除 锁 定 该 表 面



lpDDS_Map->ReleaseDC(hdc);



系 统 字 体 的 大 小 ---- 当 程 序 员 在DOS 下 使 用 标 准 系 统 字 体 时, 可 以 很 自 信 在 开 发 环 境 中 所 看 到 的 就 是 最 终 用 户 所 看 到 的。 但 在 Windows 下 不 是 这 样。 就 算 不 考 虑 游 戏 可 能 会 在 不 同 的 分 辨 率 下 运 行 这 一 事 实, 某 个 用 户 可 能 会 选 择 更 高 分 辨 率 的 大 的 或 小 的 系 统 字 体, 那 么 程 序 中 的 系 统 字 体 都 会 相 应 的 变 化。 有 的 计 算 机 游 戏 曾 经 忽 略 这 个 事 实, 结 果 导 致 在 一 个 使 用 大 字 体 的 系 统 中, 文 本 不 能 正 确 对 齐 或 与 窗 口 的 显 示 区 不 匹 配。

---- 既 然 在 任 何 Win32 系 统 下 至 少 标 准 的 TrueType 字 体 是 可 用 的, 真 的 没 有 任 何 原 因 要 在 游 戏 中 使 用 系 统 字 体。 但 是 如 果 这 样 做 了, 那 么 一 定 要 同 时 在 大 的 和 小 的 字 体 情 况 下 进 行 设 计 和 测 试。

使 用 DirectDraw 的 动 画 ---- 如 果 游 戏 中 有 大 量 动 画, 根 本 就 不 用 想 其 的 方 案。 因 为DirectDraw 提 供 了 巨 大 的 好 处, 在 性 能 方 面 超 过 了 GDI 或 WinG, 其 性 能 等 于 甚 至 超 过 在DOS 下 所 能 实 现 的, 这 当 然 要 依 靠 用 户 计 算 机 的 可 用 硬 件 的 性 能。 但 是, 运 时 文 件 占 用 了 大 量 的 空 间, 所 以 对 于 共 享 软 件 游 戏 开 发 者 来 说,DirectX 现 在 还 不 是 一 个 实 用 的 工 具。

---- 在 将 现 存 的DOS 图 形 代 码 移 植 到 DirectDraw 时, 需 要 注 意 下 列 事 宜。

  • 不 需 要 任 何 特 定 的 代 码 来 处 理 透 明 问 题。DirectDraw 不 仅 能 自 动 处 理 这 个 问 题, 而 且, 它 甚 至 还 可 以 通 过 检 查“ 捣 蛋 鬼”(sprite) 的 左 上 角 像 素 计 算 出 该 颜 色 的 键 值( 就 是 透 明 颜 色)。 参 阅 Moby Dick 文 件 的 示 例 DRAW.CPP。
  • 内 存 管 理 在 Windows 和 DirectDraw 下 是 不 同 的。 程 序 员 可 以 忘 掉 扩 充 内 存、 扩 展 内 存、 高 端 内 存、 低 端 内 存 等 等, 但 是 可 能 会 想 知 道 DirectDraw 如 何 利 用 图 形 卡 上 的 存 储 器 的 优 势 以 加 快 速 度。 可 以 把 经 常 使 用 的 图 形 存 储 在 图 形 卡 上 而 不 是 系 统 内 存 中, 从 而 优 化 其 性 能。

---- 作 为 DirectDraw 的 应 用 程 序,Moby Dick 的 Windows 版 有 一 个 特 殊 的 特 征, 那 就 是 它 不 是 全 屏 幕 的。 因 为 大 多 数 DirectDraw 教 材 都 讨 论 的 是 全 屏 幕 游 戏, 所 以 在 这 里 指 出 一 些 不 同 之 处:

  • 程 序 员 不 能 在 一 个 窗 口 化 的 应 用 程 序 中 翻 转 表 面(DirectDraw 翻 转 与DOS 下 的 视 频 页 翻 转 一 样)。 位 图 只 能 从 一 个 表 面 复 制 到 另 一 个 表 面。
  • 遵 循 上 一 个 规 则, 没 有 后 台( 就 是 翻 转) 表 面 连 接 到 原 始 表 面。 在 创 建 原 始 表 面 时 不 能 使 用 DDSD_BACKBUFFERCOUNT 标 志。
  • 原 始 表 面 不 知 道 有 关 应 用 程 序 的 客 户 区 位 置 的 任 何 事 情。Blt 方 法 写 屏 幕 坐 标, 所 以 要 使 用 GetClientRect 和 ClientToScreen 来 得 到 客 户 区 的 位 置 和 大 小。
  • 要 保 持 没 有 任 何 东 西 被 画 在 客 户 区 之 外, 需 要 创 建 一 个 绘 图 区 对 象(clipper object), 并 且 把 它 连 接 到 窗 口 和 DirectDraw 原 始 表 面。
B Color Smilies

你可能喜欢

游戏入门基础]DOS到Windows的 游 戏 移 植(9) 
联系
我们
快速回复 返回顶部 返回列表