登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入   新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書

『簡體書』Windows游戏编程大师技巧(第2版)

書城自編碼: 1994544
分類:簡體書→大陸圖書→計算機/網絡圖形圖像/多媒體
作者: [美]拉莫斯
國際書號(ISBN): 9787115292483
出版社: 人民邮电出版社
出版日期: 2012-11-01
版次: 1 印次: 1
頁數/字數: 734/1362000
書度/開本: 16开 釘裝: 平装

售價:HK$ 318.6

我要買

share:

** 我創建的書架 **
未登入.


新書推薦:
汉语副词研究论集(第六辑)
《 汉语副词研究论集(第六辑) 》

售價:HK$ 107.8
干戈之影:商代的战争观念、武装者与武器装备
《 干戈之影:商代的战争观念、武装者与武器装备 》

售價:HK$ 74.8
镶嵌之美:古希腊罗马的马赛克艺术
《 镶嵌之美:古希腊罗马的马赛克艺术 》

售價:HK$ 305.8
后希腊化哲学:从斯多亚学派到奥利金的发展研究
《 后希腊化哲学:从斯多亚学派到奥利金的发展研究 》

售價:HK$ 76.8
别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!)
《 别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!) 》

售價:HK$ 64.9
第二人生:找到重新定义人生的智慧
《 第二人生:找到重新定义人生的智慧 》

售價:HK$ 96.8
唐朝三百年
《 唐朝三百年 》

售價:HK$ 107.8
反操纵心理学:夺回人生主导权 拒绝被操纵
《 反操纵心理学:夺回人生主导权 拒绝被操纵 》

售價:HK$ 54.8

 

建議一齊購買:

+

HK$ 109.2
《游戏开发的数学和物理》
+

HK$ 332.8
《游戏引擎架构(迈向现代游戏之路完美入口 业界万众企盼 隆重推》
+

HK$ 259.7
《逐梦旅程:Windows游戏编程之从零开始》
+

HK$ 436.6
《3D游戏编程大师技巧(上、下册,附光盘)(3D游戏开发经典之》
編輯推薦:
游戏界传奇人物大师Andre LaMothe力作
《3D游戏开发大师技巧》姊妹篇
Windows游戏程序员的入行必读书
中国较早一代游戏开发者中的代表人物之一沙鹰翻译
姚晓光、史晓明等专业人士重磅推荐
內容簡介:
《Windows游戏编程大师技巧第2版》是著名游戏程序设计大师André
LaMothe的代表作。全书分为4个部分,共计15章和6个附录。作者循循善诱地从程序设计的角度介绍了在Windows环境下进行游戏开发所需的全部知识,包括Win32编程以及DirectX中所有主要组件包括DirectDraw、DirectSound、DirectInput和DirectMusic。书中还用单独的章节详细讲授了2D图形学和光栅化技术、游戏算法、多线程编程、文本游戏和解析、人工智能包括模糊逻辑、神经网络和遗传算法、物理建模完全碰撞反应、动量传递和正反向运动学及实时模拟等游戏程序开发中的关键技术。附录部分介绍了本书光盘的内容,如何安装DirectX,回顾了数学和三角学的基础知识、C++编程的基础知识,还给出了游戏编程资源以及ASCII表。《Windows游戏编程大师技巧第2版》所附光盘上带有本书中所有程序的源代码、关于Direct3D和General
3D的文章和在线书籍以及众多免费的素材。《Windows游戏编程大师技巧第2版》适合想要学习Windows游戏编程的人员阅读,对于有一定经验的专业游戏开发人员,也具有较高的参考价值。
關於作者:
本书作者Andre
LaMothe有25年的计算行业从业经验,拥有数学、计算机科学和电子工程等学位,是20岁时就在NASA做研究工作的少数几人之一。作者的著作以及参与策划的套系,都成为游戏设计和开发领域的经典。
目錄
第一部分 Windows编程基础
第1章 学海无涯 
1.1 历史一瞥 
1.2 设计游戏 
1.3 游戏类型 
1.4 集思广益 
1.5 设计文档和情节串联图板 
1.6 使游戏具有趣味性 
1.7 游戏的构成 
1.8 常规游戏编程指导规范 
1.9 使用工具 
1.10 从准备到完成——使用编译器 
1.11 示例:FreakOut 
1.12 小结 
第2章 Windows编程模型 
2.1 Windows的起源 
2.1.1 早期版本的Windows 
2.1.2 Windows 3.x 
2.1.3 Windows 95 
2.1.4 Windows 98 
2.1.5 Windows ME 
2.1.6 Windows XP 
2.1.7 Windows NT2000 
2.1.8 Windows 基本架构:Win9XNT 
2.2 多任务和多线程 
2.2.1 获取线程的信息 
2.2.2 事件模型 
2.3 按照微软风格编程:匈牙利符号表示法 
2.3.1 变量的命名 
2.3.2 函数的命名 
2.3.3 类型和常量的命名 
2.3.4 类的命名 
2.3.5 参数的命名 
2.4 世界上最简单的Windows程序 
2.4.1 总是从WinMain开始 
2.4.2 程序剖析 
2.4.3 选择一个信息框 
2.5 现实中的Windows应用程序 
2.6 Windows类 
2.7 注册Windows类 
2.8 创建窗口 
2.9 事件处理程序 
2.10 主事件循环 
2.11 产生一个实时事件循环 
2.12 打开多个窗口 
2.13 小结 
第3章 高级Windows编程 
3.1 使用资源 
3.1.1 整合资源 
3.1.2 使用图标资源 
3.1.3 使用光标资源 
3.1.4 创建字符串表资源 
3.1.5 使用.WAV声音资源 
3.1.6 使用编译器创建.RC文件 
3.2 使用菜单 
3.2.1 创建菜单 
3.2.2 装载菜单 
3.2.3 响应菜单事件消息 
3.3 GDI图形设备接口简介 
3.3.1 重拾WM_PAINT信息 
3.3.2 视频显示基础和色彩Video Display Basics and Color 
3.3.3 RGB和调色板模式 
3.3.4 基本文本显示 
3.4 处理重要事件 
3.4.1 Windows操作 
3.4.2 处理键盘事件 
3.4.3 处理鼠标事件 
3.5 自行发送消息 
3.6 小结 
第4章 Windows GDI、控件和灵感 
4.1 高级GDI绘图 
4.1.1 掀开图形设备描述表的盖头来 
4.1.2 颜色、画笔和画刷 
4.1.3 使用画笔 
4.1.4 使用画刷 
4.2 点、线、平面多边形和圆 
4.2.1 绘制点 
4.2.2 绘制线段 
4.2.3 绘制矩形 
4.2.4 绘制圆 
4.2.5 绘制多边形 
4.3 深入文本和字体 
4.4 定时高于一切 
4.4.1 WM_TIMER消息 
4.4.2 低层定时操作 
4.5 使用控件 
4.5.1 按钮 
4.5.2 向子控件发送消息 
4.6 获取信息 
4.7 T3D游戏控制台程序 
4.8 小结 
第二部分 DirectX和2D基础
第5章 DirectX基础知识和令人生畏的COM 
5.1 DirectX基础 
5.1.1 HEL和HAL 
5.1.2 更多的DirectX基础类 
5.2 COM:是微软的杰作,还是魔鬼的杰作 
5.2.1 COM对象究竟是什么 
5.2.2 接口标识符和GUID的详细内容 
5.2.3 创建一个类COM对象 
5.2.4 COM的简要回顾 
5.2.5 可运行的COM程序 
5.3 应用DirectX COM对象 
5.3.1 COM和函数指针 
5.3.2 创建和使用DirectX界面 
5.3.3 接口查询 
5.4 COM的前景 
5.5 小结 
第6章 初次邂逅DirectDraw 
6.1 DirectDraw的接口 
6.1.1 接口的特性 
6.1.2 组合使用接口 
6.2 创建DirectDraw对象 
6.2.1 对DirectDraw进行错误处理 
6.2.2 顺便提一下接口 
6.3 与Windows协作 
6.4 设置模式 
6.5 色彩的奥秘 
6.6 创建显示表面 
6.6.1 创建一个主显示表面 
6.6.2 关联调色板 
6.6.3 绘制像素 
6.6.4 清理资源 
6.7 小结 
第7章 高级DirectDraw和位图图形 
7.1 使用高彩模式 
7.1.1 16位高彩模式 
7.1.2 获取像素格式 
7.1.3 2432位真彩色模式 
7.2 双缓冲 
7.3 表面动态 
7.4 页面切换 
7.5 显存块移动单元Blitter 
7.5.1 使用Blitter进行内存填充 
7.5.2 从一个表面向另一个表面复制位图 
7.6 基础裁剪知识 
7.6.1 将像素按视口裁剪 
7.6.2 位图裁剪技巧 
7.6.3 使用IDirectDrawClipper进行DirectDraw裁剪 
7.7 使用位图 
7.7.1 载入.BMP文件 
7.7.2 使用位图 
7.7.3 载入8位位图 
7.7.4 载入16位位图 
7.7.5 载入24位位图 
7.7.6 总结位图 
7.8 离屏表面 
7.8.1 创建离屏表面 
7.8.2 在离屏表面上进行Blitting 
7.8.3 设置Blitter 
7.8.4 色彩键 
7.8.5 源色彩键 
7.8.6 目标色彩键 
7.8.7 使用Blitter终于! 
7.9 位图的旋转和缩放 
7.10 离散采样理论 
7.11 色彩效果 
7.11.1 256色模式下的色彩动画 
7.11.2 256色模式下的色彩旋转 
7.11.3 使用RGB模式的技巧 
7.12 手动色彩变换及查询表 
7.13 新的DirectX色彩和Gamma控制接口 
7.14 将GDI和DirectX联用 
7.15 DirectDraw的庐山真面目 
7.15.1 主DirectDraw对象 
7.15.2 关于表面 
7.15.3 使用调色板 
7.16 在窗口模式下使用DirectDraw 
7.17 小结 
第8章 矢量光栅化及2D变换 
8.1 绘制线条 
8.1.1 Bresenham算法 
8.1.2 算法的速度优化 
8.2 基本2D图形裁剪 
8.2.1 利用点斜式计算两条直线的交点 
8.2.2 利用一般式计算两条直线的交点 
8.2.3 利用矩阵式计算两条直线的交点 
8.2.4 裁剪直线 
8.2.5 Cohen-Sutherland算法 
8.3 线框多边形 
8.3.1 多边形数据结构 
8.3.2 多边形的绘制及裁剪 
8.4 2D平面里的变换 
8.4.1 平移 
8.4.2 旋转 
8.4.3 缩放 
8.5 矩阵引论 
8.5.1 单位矩阵 
8.5.2 矩阵加法 
8.5.3 矩阵乘法 
8.5.4 使用矩阵进行变换 
8.6 平移 
8.7 缩放 
8.8 旋转 
8.9 填充实心多边形 
8.9.1 三角形和四边形类型 
8.9.2 绘制三角形和四边形 
8.9.3 三角形解构详述 
8.9.4 四边形光栅化的一般性讨论 
8.9.5 多边形的三角化 
8.10 多边形碰撞检测 
8.10.1 接近度、边界球圆 
8.10.2 边界盒 
8.10.3 点包含 
8.11 深入定时和同步 
8.12 卷轴和摇镜头 
8.12.1 页面卷轴引擎 
8.12.2 均匀平铺Tile显示引擎 
8.12.3 稀疏位图平铺显示引擎 
8.13 伪3D等轴测引擎 
8.13.1 方法1:基于单元,全二维 
8.13.2 方法2:基于全屏,具有一些二维或三维的碰撞网络 
8.13.3 方法3:采用全三维数学运算,使用一个固定的相机视角 
8.14 T3DLIB1函数库 
8.14.1 引擎架构 
8.14.2 新的游戏编程控制台程序 
8.14.3 基本定义 
8.14.4 可用的宏 
8.14.5 数据类型和结构 
8.14.6 全局定义 
8.14.7 DirectDraw接口 
8.14.8 2D多边形函数 
8.14.9 2D基本图元函数 
8.14.10 数学和误差函数 
8.14.11 位图函数 
8.14.12 调色板函数 
8.14.13 实用工具函数 
8.15 BOB引擎 
8.16 小结 
第9章 DirectInput输入和力反馈 
9.1 输入循环 
9.2 DirectInput序曲 
9.2.1 DirectInput组件 
9.2.2 设置DirectInput的一般步骤 
9.2.3 数据采集模式 
9.2.4 创建主DirectInput对象 
9.2.5 101键盘 
9.2.6 读数据过程中的问题:重获取 
9.2.7 捕捉鼠标 
9.2.8 使用游戏杆 
9.2.9 将输入消息化 
9.3 力反馈 
9.3.1 力反馈的物理原理 
9.3.2 设置力反馈 
9.3.3 力反馈演示程序 
9.4 编写一个广泛适用的输入系统:T3DLIB2.CPP 
9.5 小结 
第10章 用DirectSound和DirectMusic演奏乐曲 
10.1 在PC上对声音编程 
10.2 从此有了声音… 
10.3 数码声音与MIDI比较——音质好且存储省 
10.3.1 数码声音——从“位”开始 
10.3.2 合成声音与MIDI 
10.3.3 MIDI概述 
10.4 发声硬件 
10.4.1 波表合成 
10.4.2 波导合成 
10.5 数码录音:设备和技术 
10.5.1 录制声音 
10.5.2 处理声音 
10.6 DirectSound中的麦克风 
10.7 初始化DirectSound 
10.7.1 理解协作等级 
10.7.2 设定协作等级 
10.8 主声音缓冲区与辅助声音缓冲区 
10.8.1 使用辅助缓冲区 
10.8.2 创建辅助声音缓冲区 
10.8.3 把数据写入辅助声音缓冲区 
10.9 渲染声音 
10.9.1 播放声音 
10.9.2 停止播放 
10.9.3 控制音量 
10.9.4 调整频率 
10.9.5 调整声道平衡 
10.10 用DirectSound反馈信息 
10.11 从磁盘中读取声音数据 
10.11.1 .WAV文件格式 
10.11.2 读取.WAV文件 
10.12 DirectMusic:伟大的试验 
10.13 DirectMusic的体系结构 
10.14 初始化DirectMusic 
10.14.1 初始化COM 
10.14.2 创建一个演奏对象 
10.14.3 给演奏对象增加端口 
10.15 加载一个MIDI段 
10.15.1 创建一个加载程序 
10.15.2 加载MIDI文件 
10.16 操作MIDI段 
10.16.1 播放一个MIDI段 
10.16.2 停止一个MIDI段 
10.16.3 检查MIDI段的状态 
10.16.4 释放一个MIDI段 
10.16.5 关闭DirectMusic 
10.16.6 一些DirectMusic的实例 
10.17 T3DLIB3声音和乐曲库 
10.17.1 头文件 
10.17.2 类型 
10.17.3 全局变量 
10.17.4 DirectSound API封装 
10.17.5 DirectMusic API封装 
10.18 小结 
第三部分 核心游戏编程
第11章 算法、数据结构、 内存管理和多线程 
11.1 数据结构 
11.1.1 静态结构和数组 
11.1.2 链表 
11.2 算法分析 
11.3 递归 
11.4 树结构 
11.4.1 建立二分查找树BST 
11.4.2 搜索BST 
11.5 优化理论 
11.5.1 运用你的头脑 
11.5.2 数学技巧 
11.5.3 定点运算 
11.5.4 循环体展开 
11.5.5 查找表 
11.5.6 汇编语言 
11.6 制作演示 
11.6.1 预先记录的演示 
11.6.2 由人工智能控制的演示 
11.7 保存游戏的手段 
11.8 实现多人游戏 
11.8.1 轮流 
11.8.2 分屏 
11.9 多线程编程技术 
11.9.1 多线程编程的术语 
11.9.2 为何要在游戏中使用线程 
11.9.3 取得一个线程 
11.9.4 线程间的消息传递 
11.9.5 等待合适时机 
11.9.6 多线程和DirectX 
11.9.7 高级多线程编程 
10.10 小结 
第12章 人工智能 
12.1 人工智能初步 
12.2 确定性AI算法 
12.2.1 随机运动 
12.2.2 跟踪算法 
12.2.3 反跟踪:闪避算法 
12.3 模式以及基本控制脚本的编写 
12.3.1 基本模式 
12.3.2 具备条件逻辑处理的模式 
12.4 行为状态系统建模 
12.4.1 基本状态机 
12.4.2 加入更多表现个性的行为 
12.5 用软件对记忆和学习进行建模 
12.6 计划树和决策树 
12.6.1 计划编程 
12.6.2 实现真正的计划生成器 
12.7 寻路 
12.7.1 试探法Trial and Error 
12.7.2 轮廓跟踪 
12.7.3 碰撞规避跟踪 
12.7.4 路点寻路 
12.7.5 一个赛车例子 
12.7.6 可靠的寻路 
12.8 高级AI脚本 
12.8.1 设计脚本语言 
12.8.2 使用CC++编译器 
12.9 人工神经网络 
12.10 遗传算法 
12.11 模糊逻辑 
12.11.1 普通集合论 
12.11.2 模糊集合理论 
12.11.3 模糊语言变量及其规则 
12.11.4 模糊流形与成员关系 
12.11.5 模糊关联矩阵 
12.11.6 用模糊化的输入处理FAM 
12.11.7 暖融融 
12.12 为游戏创造真正的AI 
12.13 小结 
第13章 基本物理建模 
13.1 基本物理学定律 
13.1.1 质量m 
13.1.2 时间t 
13.1.3 位置s 
13.1.4 速率v 
13.1.5 加速度a 
13.1.6 力F 
13.1.7 多维空间中的力 
13.1.8 动量P 
13.2 线性动量的物理性质:守恒与传递 
13.3 模拟万有引力效果 
13.3.1 模拟重力井 
13.3.2 模拟炮弹弹道 
13.4 讨厌的摩擦力 
13.4.1 摩擦基本概念 
13.4.2 斜面上的摩擦力高级 
13.5 基本的特殊碰撞反应 
13.5.1 简单的x,y反弹物理 
13.5.2 计算任意方向上的平面碰撞反应 
13.5.3 矢量反射示例 
13.5.4 线段的交点 
13.6 实际2D物体间的精确碰撞响应高级 
13.7 解决n-t坐标系统 
13.8 简单运动学 
13.8.1 求解正向运动学问题 
13.8.2 解决反向运动学问题 
13.9 粒子系统 
13.9.1 每颗粒子都需要的东西 
13.9.2 设计粒子引擎 
13.9.3 粒子引擎软件 
13.9.4 产生初始条件 
13.9.5 整合微粒系统 
13.10 创建游戏的物理模型 
13.10.1 物理建模的数据结构 
13.10.2 基于帧的模拟与基于时间的模拟 
13.11 小结 
第14章 文字时代 
14.1 什么是文字游戏 
14.2 文字游戏如何工作 
14.3 从外部世界获得输入 
14.4 语言分析和解析 
14.4.1 词法分析 
14.4.2 句法分析 
14.4.3 语义分析 
14.5 组成游戏世界 
14.5.1 表示场景 
14.5.2 放置物体 
14.5.3 让事情发生 
14.5.4 自由移动 
14.5.5 物品系统 
14.6 实现视觉、听觉和嗅觉 
14.6.1 听觉 
14.6.2 嗅觉 
14.6.3 视觉 
14.7 实时响应 
14.8 错误处理 
14.9 造访Shadow Land 
14.10 Shadow Land中使用的语言 
14.11 编译和运行Shadow Land 
14.12 小结 
第15章 综合运用 
15.1 Outpost的设计初稿 
15.1.1 游戏背景 
15.1.2 设计游戏玩法 
15.2 用于编写游戏的工具 
15.3 游戏场景:在太空中卷动 
15.4 玩家控制的飞船:鬼怪号 
15.5 小行星带 
15.6 敌人 
15.6.1 边哨Outpost 
15.6.2 捕食者太空雷 
15.6.3 战舰 
15.7 “宝物” 
15.8 HUD 
15.9 粒子系统 
15.10 玩游戏 
15.11 编译Outpost 
15.12 结束语 
第四部分 附录
附录A 光盘内容简介 
附录B 安装DirectX和使用CC++编译器 
附录C 数学和三角学回顾 
附录D C++入门 
附录E 游戏编程资源 
附录F ASCII表 
內容試閱
记得我爱上计算机是在1983年,那时我在Apple
IIe计算机上编写Logo语言程序(感谢Woz!)。那段经历带来的成就感让我非常着迷,并深深印在了我的脑海里。计算机可以做任何我要它做的事。即使是在无数次的循环之后,它仍然不知疲倦,更不会质疑我要它完成的任何一项具体任务的理由。它只是默默地完成工作。这一段经历,和一部叫做“War
Games”的电影,以及一个名为Andrè LaMothe的作者,对我的职业生涯起到了举足轻重的作用。
在1994年我购买了第一本Andrè LaMothe的书,书名是《Sams Teach Yourself Game
Programming in 21
Days》。我从来没有想过,原来编写视频游戏也能成为一种职业。于是,我发现了在我对编程的热爱和对视频游戏的迷恋之间,存在着这样一种联系。从前谁能想像我花在玩Galaga(小蜜蜂)这个游戏上的那么多时间在现在也可被视为是一种研究呢?Andrè的写作风格和教学方式鼓励了我,并且让我相信其实我也能够编写视频游戏。我还记得当时我给他打了电话(直到现在我仍然觉得难以置信,他真的公布了自己的电话号码,并且和我这样的读者谈话。),求助我为物理课准备的一个简单程序,那是建立在他的一个气体模型演示程序的基础上的。当时我无论如何都无法使那个程序运行起来。他当即检查了一下我的程序,很快,他对我说“Richard,你可真要命,你必须在每行语句的结尾打上分号!”原来这就是问题所在,于是我的第一个游戏程序很快完成并正常运作了。
几年过后,我有幸和Andrè一起制作一个名叫“Rex
Blade”的游戏。我的工作是工具程序员和关卡设计。这对我来说是一个棒极了的学习经历。我疯狂地工作(因为Andrè简直就是个严厉的奴隶监工),同时也乐趣无穷,(可以去看电影,玩射击,滑雪,还有很多你意想不到的东西,比如0.51口径的‘沙漠之鹰’手枪,很酷吧)。最后我们终于完成了一个3D互动视频游戏三部曲!Rex
Blade从策划构思到正式销售仅仅只花了短短6个月的时间!(当然,Rex可作为一份有意思的开发手记的题材)。开发Rex让我了解了,制作一个真正的视频游戏所需要的步骤;而和Andrè的合作让我知道了,什么是昼夜不停的工作——那真是毫不夸张啊。当我一开始听他说,他一个星期通常工作100小时以上的时候,我还以为他是开玩笑呢。
在软件工程学里,很少有别的领域能象游戏编程那样对硬件、软件、和程序员自己提出那么高的要求。实在是有很多错综复杂的部分必须完美的结合并且在一起运作:数学、物理、人工智能、图形学、音响、音乐、图形用户界面、数据库结构和其他种种。这就是为什么《Windows游戏编程大师技巧》能够在现在和未来,在视频游戏制作这个领域里成为经典的原因。
这本书将带领你到达游戏编程技术的另一个层次。光是人工智能那部分就很让人着
迷了—那个演示简直酷极了。你还能从哪里获得如此详尽的介绍,教你把模糊逻辑学、神经网络、和遗传法则运用到视频游戏上去呢?本书还将介绍有关DirectX的主要组成成分,包括DirectDraw、DirectInput(包括力反馈作用!),DirectSound,以及最新最棒的DirectMusic技术。
然后是物理建模的部分。最后,一部分学有所成的人,可以去钻研一下完全碰撞反应、动量传递和正向运动学,并进行实时模拟。想像一下,你所创造的东西将会有学习能力;物体将会象在真实世界里那样碰撞运动;而你游戏里的敌人将会记住上次遭遇战里,你是如何打败他们的。这些都将是,未来那些了不起的游戏里的基础部分。
我真的必须感谢Andrè创作了这本书。他经常说,如果他不写,谁来写?的确,对他来说,用他20多年的艰苦工作所取得的经验,以及获得的秘诀和技巧去帮助别人真的是件很棒的事。
生活在这样一个技术日新月异的伟大时代真是让人兴奋,尤其在你是一个游戏程序员的时候。似乎每几个月总会有新的CPU、显卡或者其他新的硬件上市,把我们原先能想象得到的技术极限不断向前推进。(比方说,我们曾经很难想像VoodooIII每秒能运算700亿次!)诚然,最新最好的技术和产品的价格也是相当的昂贵。但即使这样,在我们运用这些技术于当前开发的游戏的同时,人们对未来视频游戏的期望却变得更高。似乎就在不远的将来,可以局限游戏创作的因素,可能惟有我们的知识和想像力了。
想到下一代的游戏程序员能够从这本书里获取灵感和知识让我感到很激动。Andrè应该也希望,21世纪的某天能有人接替他,继续他的工作,教授人们游戏编程这有如黑魔法般充满魅力的技能,因为,他真的需要放个长假休息一下了!
Richard
Benson
3D
Programmer
梦工厂(DreamWorks Interactive)、电子艺界(Electronic Arts)
章 高级Windows编程
"Are you sure this sweet machine isn''t going to waste?"
—Dade, Hackers (电影《骇客》) 
并不非得是火箭专家才能体会Windows编程是很大的一个主题。但Windows
编程很绝的地方在于,你不用了解太多细节,就可以完成很多工作。因此,本章主要提供开发一个完整的Windows应用程序所需的一些最重要的内容。本章主要内容有:
? 使用资源(如图标、光标和声音)
? 菜单
? 基本的图形设备接口(GDI)和视频系统
? 输入设备
? 发送消息
使用资源
Windows创建者提出的一个主要设计目标就是,在一个Windows应用程序中除程序代码外还能储存更多的资源(甚至Mac程序也是如此)。他们详尽论述了程序的数据也应当驻留在该程序的.EXE文件中。有很多理由支持这个想法,简列如下:
? 一个同时含有代码和数据的.EXE文件更容易发布。
? 如果没有外部数据文件的话,就不会丢失这些数据。
? 外力不能很容易地访问、任意删改、添加、和分配你的数据文件(例如,.BMP文件、.WAV文件等等)。
为了支持这种数据库技术,Windows程序支持称之为资源的功能。这只是与你的程序代码结合在一起的多块数据,这部分数据在运行时中可被程序本身加载。图3-1描述了这个概念。
那我们讨论的是哪一种资源呢?实际上对于想编译进程序中的数据类型并没有什么限制,因为Windows程序支持用户定义的资源类型。不过,有几种预定义的类型能满足你大部分的日常需要:
?
图标—小的位图图形,可以用于许多方面,例如放在目录下表示一个程序,用户单击以运行该程序。图标使用.ICO文件扩展名。
? the .CUR file extension.
光标—一个表示鼠标指针的位图。Windows允许以各种方式操作光标。例如,可在光标于窗口之间移动时改变它。光标使用.CUR文件扩展名。
?
字符串—字符串作为资源的意义可能是较不明显的。你可能会这样说:“我经常将字符串写在我的代码或者一个数据文件中。”我知道你的意思。然而,Windows允许将字符串表作为一种资源放到你的程序中,并且通过ID来访问它们。
?
声音—大部分Windows程序都通过.WAV文件来使用声音。因此,.WAV文件也可被加为一种资源。这是一个让某些觊觎你的音效的人无从下手的好办法。
?
位图—这是标准的位图,可以是单色、4位、8位、16位、24位或32位格式的矩形像素矩阵。在图形操作系统(如Windows)中是非常常用的对象,因此也可以将位图作为一种资源。位图使用.BMP文件扩展名。
?
对话框—对话框在Windows中也很常用,设计者可以让对话框作为一种资源,而不是在外部装载它们。好主意!因此,你可以在程序中即时地创建对话框,也可以用编辑器设计它们,然后作为一种资源来存储。
? 图元文件—图元文件相对高级。它们允许将一系列图像操作作为一个序列记录在一个文件中,然后再回放它。
现在你已经了解了资源的定义以及存在形式,下一步就是如何将它们集成在一起?事实上,有一个叫做资源编译器(Resource
Compiler)的程序,它接受一个扩展名为.RC的ASCII文本资源文件作为输入。该文件是一个CEnglish类似结构的文件—描述了编译到单个数据文件中的所有资源。之后该资源编译器装载所有的资源,并将所有资源放置在一个具有.RES扩展名的大数据文件中。
这个.RES文件包含了你在.RC文件中定义的诸如图标、光标、位图、声音等所有资源的二进制数据。该.RES文件和.CPP、.H、.LIB、.OBJ等等文件一样都可以编译成一个.EXE文件。图3-2显示了可能的数据流程。

图3-2 编译及连接时的资源数据流程
整合资源
以前可以使用一个外部资源编译器,如RC.EXE将所有的资源编译到一起。但是现在你可以使用编译器IDE来做这些工作。因此,如果在程序中添加一种资源的话,可以简单地通过IDE中的“文件”菜单中选择“新建”菜单项(大多数情况下),然后选择想要添加的资源类型(后面将详细讨论)来添加资源。
让我们回顾一下如何处理资源:可以向程序中添加许多数据类型和对象,然后它们以资源的形式和实际程序代码一起驻留在.EXE文件中(一般在文件的尾端)。在运行过程中,可以访问这个资源数据库,并且可以从程序本身(而不是作为一个单独的文件从磁盘中)装载资源数据。要创建该资源文件,必须有一个以ASCII文本形式的资源描述文件,名称为*.RC。然后将该文件传递到编译器中(一起访问该资源),并且产生一个*.RES文件。然后将该.RES文件和所有的其他程序对象连接到一起,创建一个最终的.EXE文件。就这么简单!好,这样我就变成了一个亿万富翁了。
知道了这些,下面就让我们讨论一下众多的资源对象,学会如何创建并将其装载到程序中。我不打算重复上面提到过的所有的资源,但是你应当能够对付任何其他的资源。它们都以相同的方式运行,只是在数据类型、句柄或使用难度上有少少不同。
使用图标资源
使用资源只需要创建两个文件:一个是.RC文件,如果想对.RC文件中的符号标识符进行引用的话,可能还需要创建一个.H文件。在下面内容中将详细讨论。当然,最终要产生一个.RES文件,但是我们让IDE编译器来做这个工作。
举一个创建图标(ICON)资源的例子,让我们看一下如何改变任务栏上的应用程序使用的图标以及窗口上系统菜单旁边的图标。如果你还记得的话,我们在Windows类的创建过程中使用过如下代码设置这些图标:
winclass.hIcon = LoadIconNULL,
IDI_APPLICATION;
winclass.hIconSm = LoadIconNULL, IDI_APPLICATION;
这两行代码为这些普通图标票和小版本的图标加载默认的应用图标程序。实际上可以通过使用已经编译进资源文件的图标,将所需要的图标装载到这些资源槽(Slot)中。
首先需要一个图标,我已经创建了一个很酷的图标用于本书中所有的应用程序。该图标名为T3DX.ICO,如图3-3所示。我使用VC++6.0的图像编辑器(如图3-4所示)创建了该图标。当然你可以使用任何你想使用的程序(只要该程序支持该种输出类型)来创建图标、光标和位图等等。
T3DX.ICO具有32像素×32像素尺寸,16色。图标的尺寸可从16×16到64×64的,最高可以具有256色。但是大多数图标都是32×32以及16色彩的,所以我们也采用这种格式。
一旦你有了想要放入一个资源文件中的图标,就需要创建一个资源文件来放置该图标。为了简单起见,让我们手工编写。(当然IDE编译器完全可以做这些工作,但是那样的话,你就什么也学不到了,不是吗?)
.RC文件包含所有资源的定义,也就是说在程序中可以使用多个资源。
NOTE
在阅读以下代码之前,我想指出关于资源的非常重要的一点。Windows可以使用ASCII文本字符串或者是整数标识符来表示资源。在大多数情况下,你可以在.RC文件中同时使用这两种方式,但是应当注意一些资源只允许使用其中的一种。无论是哪种情况,资源必须以稍微不同的方式来加载,并且如果涉及到标识符的话,在你的工程中必须包含一个额外的包含符号交叉引用的.H文件。

图3-4 VC++ 6.0中的图像编辑器
下面是如何在.RC脚本文件中定义一个ICON资源:
方法一:使用字符串名
icon_name ICON FILENAME.ICO
例:
windowicon ICON star.ico
MyCoolIcon ICON cool.ico

方法二:使用整型标识符
icon_id ICON FILENAME.ICO
例:
windowicon ICON star.ico
124 ICON ship.ico
这是令人迷惑不解的部分:注意方法一中根本没有任何注解。这是个容易给你带来麻烦的问题,因此要仔细听。应当能注意到:ICON定义的每一种方法的第一个例子看上去完全一样。但是,一个理解为字符串“windowicon”,而另一个是一个符号windowicon。这样就导致在.RC文件(及应用程序的.CPP代码文件)中必须包含一个附加的文件来定义符号常量。当资源编译器解析下面代码时,
windowicon ICON star.ico
资源编译器首先检索已在include头文件定义的符号。如果该符号已经存在,资源编译器就通过整型标识符来引用该符号所指向的资源。否则,资源编译器就假定它是个字符串,通过字符串“windowicon”来引用ICON。
因此,如果想在.RC资源脚本中定义符号ICON的话,也需要一个.H文件来解析该符号索引。要想在.RC脚本中包含.H文件,应当使用标准CC++的#include关键字。
例如,假定你想在.RC文件RESOURCES.RC中定义三个符号图标,同时也需要一个.h文件RESOURCES.H。下面是两个文件各自的内容:
RESOURCES.H的内容:
#define ID_ICON1 100
these numbers are arbitrary
#define ID_ICON2 101
#define ID_ICON3 102
RESOURCES.RC的内容:
#include "RESOURCES.H"
here are the icon defines, note the use of C++ comments
ID_ICON1 ICON star.ico
ID_ICON2 ICON ball.ico
ID_ICON3 ICON cross.ico
就是这样。然后可以将RESOURCES.RC添加到你的工程中,确认应用程序文件中有#include
RESOURCES.H,然后你就大功告成了。当然,.ICO文件必须放在工程的工作目录下,以便于资源编译器能够找到它们。
如果没有为图标定义(#define)符号,也没有包含一个.H文件,资源编译器将只能假定符号ID_ICON1、ID_ICON2和ID_ICON3是字符串。如果这样,你就得在程序以“ID_ICON1”、“ID_ICON2”和“ID_ICON3”的形式引用它们。
似乎我已经完全颠覆了时空连续统,颠三倒四地讨论这些东西。现在让我们回顾一下想做的工作—仅仅是加载一个简单的图标!
欲使用字符串名来载入图标,按下面步骤进行:
在.RC文件中:
your_icon_name ICON filename.ICO
在程序代码中:
Notice the use of hinstance instead of NULL.
winclass.hIcon =
LoadIconhinstance, "your_icon_name";
winclass.hIconSm = LoadIconhinstance, "your_icon_name";
要通过符号参考来载入资源,可以如前面例子那样#include包含符号参考的头文件。
在.H文件中:
#define ID_ICON1 100
these numbers are arbitrary
#define ID_ICON2 101
#define ID_ICON3 102
在.RC文件中:
here are the icon defines, note the use of C++ comments
ID_ICON1 ICON star.ico
ID_ICON2 ICON ball.ico
ID_ICON3 ICON cross.ico
之后,程序代码看起来像这样:
Notice the use of hinstance instead of NULL.
use the MAKEINTRESOURCE macro to reference
symbolic constant resource properly
winclass.hIcon =
LoadIconhinstance,MAKEINTRESOURCEID_ICON1;
winclass.hIconSm =
LoadIconhinstance,MAKEINTRESOURCEID_ICON1;
注意这里用了宏MAKEINTRESOURCE。该宏将整数转换为一个字符串指针,但是不必担心该操作—对于已经#define的符号常数时就应用这个宏。
……

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.hk
Copyright © 2013 - 2024 (香港)大書城有限公司  All Rights Reserved.