Programming 版 (精华区)
发信人: superman (☆风雨无阻☆), 信区: Programming
标 题: [转载] DOS到Windows的 游 戏 移 植(9)
发信站: 紫 丁 香 (Sat Aug 29 07:35:59 1998), 站内信件
【 以下文字转载自 cnprogram 讨论区 】
【 原文由 Young_Yang@bbs.ustc.edu.cn 所发表 】
从DOS 到Windows 的 游 戏 移 植(9)
谭 翁
_________________________________________________________________
---- 本 期 我 们 将 讨 论 有 关 图 形 方 面 的 问 题。 和 本 系 列 文
章 的 前 面 文 章 相 类 似, 我 们 还 是 主 要 讨 论 在 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 原 始 表 面。
_________________________________________________________________
--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: poster.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:214.442毫秒