img
share 分享

Python游戏编程快速上手(第4版)

作者:[美]Al Sweigart(斯维加特)

出版社:人民邮电出版社

ISBN:9787115466419

VIP会员免费 (仅需0.8元/天) ¥ 44.16

温馨提示: 价值40000元的1000本电子书,VIP会员随意看哦!

电子书推荐

更多资源 展开

游戏编程精粹4--随书光盘源代码 评分:

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《游戏编程精粹4》一书的随书光盘代码 游戏编程精粹4 基本信息 原书名: Game Programming Gems 4 原出版社: Delmar Thomson Learning 作者: (美)Andrew Kirmse 译者: 沙鹰等 丛书名: 游戏编程精粹 出版社:人民邮电出版社 ISBN:7115136351 上架时间:2005-9-23 出版日期:2005 年9月 开本:16开 页码:537 版次:1-1 所属分类:计算机 > 游戏 > 游戏编程 编辑推荐   本书是著名技术丛书"游戏编程精粹"的第4卷,由全球数十位优秀游戏程序员撰写的文章汇集而成。文章的选题既紧跟游戏开发的时代脉搏,内容亦不流于表面,先进性和实用性俱佳,由于全部作者都来自于亲手打造当今优秀游戏的经验丰富的开发者们,读者在文章中不但可以找到针对疑难问题的有效解决方案,而且常能找到令人玩味再三的深刻见解。它们将激起读者探索的欲望和创意的火花。 内容简介   本书是著名技术丛书"游戏编程精粹"的第4卷,由全球数十位优秀游戏程序员撰写的文章汇集而成。书中有62篇长度中等难度适中的技术文章,分为通用编程、数学、物理、人工智能、图形图像、网络和多人游戏、音频共7章,并在随书光盘中提供了源程序和演示实现。文章的选题既紧跟游戏开发的时代脉搏,内容亦不流于表面,先进性和实用性俱佳。    本书适合游戏开发专业人员阅读,专家级开发人员可以立刻用书中介绍的方法和技巧,而初中级程序员通过阅读本书将增强其技能和知识。    本书秉承了“游戏编程精粹”系列的一贯作风,挟60余篇崭新的技术文章以飨读者。它将再次无可争议地成为一本游戏开发者不可多得的参考书。由于全部作者都来自于亲手打造当今优秀游戏的经验丰富的开发者们,读者在文章中不但可以找到针对疑难问题的有效解决方案,而且常能找到令人玩味再三的深刻见解。它们将激起读者探索的欲望和创意的火花。    过去数年中,在游戏行业中发生的开拓与革新是有目共睹的。因此本系列丛书所覆盖的领域也随之而拓宽了。考虑到各种新型游戏平台的出现,书中增加了非主流程序设计语言以及第三方api方面的内容。虽然绝大部分的代码依然以c++写成,但是用到了一些解释语言(如java和python)。图形部分的文章则涉及opengl、directx及一些shader语言。在本书中还有全新的关于物理的章节,其中探讨了一些创建emergent gameplay 的新颖的实时物理实现方法。    新一卷的“游戏编程精粹”对于游戏程序员来说,无疑是一本宝贵的参考书! 作译者   Andrew Kirmse是Meridian 59(1996)的开发总监和设计者之一。他也是Star:Starfighter(2001)的图形程序员。他在麻省理工学院(Massachusetts lnstitute of Technology,MIT)获得物理、数学和计算机科学的学位。Andrew曾为每一卷“游戏编程精粹”撰稿。他目前在LucasArts工作。 目录 封面 -54 封底 -53 彩插 -52 内容提要 -44 序 -43 前言 -40 致谢 -38 关于封面图案 -37 作者简介 -36 翻译和审校人员 -18 目录 -16 第1章 通用编程 1 简介 Chris Corry 2 1.1 调试游戏程序的学问 Steve Rabin 4 1.1.1 五步调试法 4 1.1.2 第一步:始终如一地重现问题 4 1.1.3 第二步:搜集线索 5 1.1.4 第三步:查明错误的源头 6 1.1.5 第四步:纠正问题 7 1.1.6 第五步:对所作的修改进行测试 7 1.1.7 高级调试技巧 8 1.1.8 困难的调试情景和模式 10 1.1.9 理解底层系统 12 1.1.10 增加有助于调试的基础设施 12 1.1.11 预防bug 13 1.1.12 结论 14 1.1.13 致谢 15 1.1.14 参考文献 15 1.2 一个基于HTML的日志和调试系统 James Boer 16 1.2.1 于日志系统的优势 16 1.2.2 究竟什么是事件日志? 16 1.2.3 HTML和调用堆栈 17 1.2.4 工作原理 18 1.2.5 一些有用的心得 21 1.2.6 结论 21 1.3 时钟:游戏的脉搏尽在掌握 Noel Llopis 23 1.3.1 关于时间的基础 23 1.3.2 时钟系统的组成 24 1.3.3 避免失真 25 1.3.4 结论 29 1.4 设计和维护大型跨平台库 David Etherton 30 1.4.1 设计 30 1.4.2 Build系统 32 1.4.3 细节 33 1.4.4 结论 35 1.4.5 参考文献 35 1.5 利用模版化的空闲块列表克服内存碎片问题 Paul Glinker 36 1.5.1 内存操作 36 1.5.2 解决方案 37 1.5.3 实现细节 37 1.5.4 有效地使用我们的Freelist 40 1.5.5 结论 40 1.5.6 参考文献 41 1.6 一个用C++实现的泛型树容器类 Bill Budge 42 1.6.1 可重用的库 42 1.6.2 树的概念 43 1.6.3 树的实现 43 1.6.4 利用STL 46 1.6.5 结论 49 1.6.6 参考文献 49 1.7 弱引用和空对象 Noel Llopis 51 1.7.1 使用指针 51 1.7.2 弱引用 52 1.7.3 空对象 55 1.7.4 结论 56 1.7.5 参考文献 57 1.8 游戏中的实体管理系统 Matthew Harmon 58 1.8.1 概述 58 1.8.2 实体消息 60 1.8.3 实体代码 61 1.8.4 类的代码 63 1.8.5 实体管理器 63 1.8.6 基于消息的游戏循环 65 1.8.7 开始:消息类 65 1.8.8 从小处着手:基本实体消息 66 1.8.9 游戏和环境消息 67 1.8.10 系统成长:一些高级消息 67 1.8.11 处理碰撞 69 1.8.12 扩展到多玩家 69 1.8.13 开发和调试消息 70 1.8.14 好处 70 1.8.15 光盘中的内容 71 1.8.16 总结 71 1.9 Windows和Xbox平台上地址空间受控的动态数组 Matt Pritchard 72 1.9.1 传统的动态数组管理 72 1.9.2 深入观察 73 1.9.3 地址空间管理 != 存储管理 73 1.9.4 重新思考关于数组增大的问题 74 1.9.5 新的增长规则 74 1.9.6 使用地址空间受控的数组 75 1.9.7 结论 79 1.10 用临界阻尼实现慢入慢出的平滑 Thomas Lowe 80 1.10.1 可用的技术 80 1.10.2 阻尼弦与临界阻尼 82 1.10.3 实践 82 1.10.4 设置平滑速率的上限 84 1.10.5 结论 85 1.10.6 参考文献 85 1.11 一个易用的对象管理器 Natalya Tatarchuk 86 1.11.1 对象管理的传统做法 86 1.11.2 灵活的对象管理器 87 1.11.3 结论 91 1.11.4 参考文献 92 1.12 使用自定义的RTTI属性对对象进行流操作及编辑 Frederic My 93 1.12.1 扩展的RTTI 93 1.12.2 属性 95 1.12.3 编辑属性 97 1.12.4 保存 99 1.12.5 载入 100 1.12.6 与旧版本文件的兼容性问题:类的描述 101 1.12.7 与旧版本文件的兼容性问题:匹配 102 1.12.8 “函数”属性 103 1.12.9 技巧和提示 103 1.12.10 思考 104 1.12.11 结论 104 1.12.12 参考文献 104 1.13 使用XML而不牺牲速度 Mark T. Price 106 1.13.1 为什么要使用XML呢? 106 1.13.2 简单介绍XDS Meta格式 107 1.13.3 XDS工具集 108 1.13.4 使用XDS工具集 109 1.13.5 整合 115 1.13.6 总结 115 1.13.7 参考文献 115 第2章 数学 117 简介 Jonathan Blow 118 2.1 使用马其赛特旋转的Zobrist散列法 Toby Jones 120 2.1.1 Zobrist散列 120 2.1.2 实现Zobrist散列 121 2.1.3 马其赛特旋转(Mersenne Twister) 122 2.1.4 马其赛特旋转的实现 123 2.1.5 结论 124 2.1.6 参考文献 124 2.2 抽取截锥体和camera信息 Waldemar Celes 125 2.2.1 平面变换(Plane Transformation) 125 2.2.2 抽取锥体信息 127 2.2.3 抽取camera信息 128 2.2.4 任意投影变换 130 2.2.5 实现 131 2.2.6 结论 132 2.2.7 参考文献 132 2.3 解决大型游戏世界坐标中的精度问题 Peter Freese 133 2.3.1 问题描述 133 2.3.2 可能的解决方式 135 2.3.3 偏移位置 137 2.3.4 渲染流水线变化 140 2.3.5 对性能的思考 143 2.3.6 结论 143 2.3.7 参考文献 144 2.4 非均匀样条 Thomas Lowe 145 2.4.1 样条的种类 145 2.4.2 三次样条的基础理论 146 2.4.3 圆形的非均匀样条 147 2.4.4 平滑非均匀样条 149 2.4.5 时控的非均匀样条 151 2.4.6 计算起始和最终节点速率 152 2.4.7 在样条上获取速率和加速度 153 2.4.8 优化 153 2.4.9 结论 153 2.4.10 参考文献 154 2.5 用协方差矩阵计算更贴切的包围对象 Jim Van Verth 155 2.5.1 协方差矩阵 155 2.5.2 特征值和特征向量 158 2.5.3 计算协方差矩阵的特征向量 159 2.5.4 创建包围对象 159 2.5.5 结论 161 2.5.6 参考文献 162 2.6 应用于反向运动的雅可比转置方法 Marco Spoerl 163 2.6.1 我们的测试环境 163 2.6.2 雅可比矩阵是什么? 164 2.6.3 雅可比转置矩阵简介 165 2.6.4 实现算法 166 2.6.5 结果和比较 168 2.6.6 结论 171 2.6.7 参考文献 171 第3章 物理 173 简介 Graham Rhodes 174 3.1 死神的十指:战斗中的命中算法 Roger Smith、Don Stoner 176 3.1.1 射击带状物(Ribbon) 176 3.1.2 射击靶心 177 3.1.3 射击矩形 178 3.1.4 使用霰弹枪射击小目标 179 3.1.5 移动炮兵的攻击命中 179 3.1.6 死亡的4种主要形式 180 3.1.7 化学武器、火球及区域性魔法 182 3.1.8 弹片的楔入 182 3.1.9 攻击丛林 183 3.1.10 攻击有猎物分布的丛林 183 3.1.11 结论 184 3.1.12 参考文献 184 3.2 在低速CPU系统中交通工具的物理模拟 Marcin Pancewicz、Paul Bragiel 185 3.2.1 技术的概要和前提假设 185 3.2.2 交通工具沿当前行驶方向上的加速及减速 186 3.2.3 方向控制 188 3.2.4 把所有要素结合起来 189 3.2.5 地形的影响 189 3.2.6 实现中遇到的问题 190 3.2.7 可以改进的地方 191 3.2.8 结论 192 3.3 编写基于Verlet积分方程的物理引擎 Nick Porcino 193 3.3.1 关于物理引擎 193 3.3.2 刚体 194 3.3.3 积分器 194 3.3.4 物理引擎 196 3.3.5 针对特定平台的考虑 199 3.3.6 扩展引擎的功能 199 3.3.7 结论 200 3.3.8 参考文献 200 3.4 刚体动力学中的约束器 Russ Smith 201 3.4.1 基本要点 201 3.4.2 约束器构造模块 202 3.4.3 创建有用的游戏约束器 205 3.4.4 光盘中的内容 209 3.4.5 结论 209 3.4.6 参考文献 209 3.5 在动力学模拟中的快速接触消除法 ádám Moravánszky、Pierre Terdiman 210 3.5.1 减少接触 210 3.5.2 对预处理的详细分析 213 3.5.3 对接触的分组群的详细分析 215 3.5.4 对持续性的详细分析 217 3.5.5 结论 217 3.5.6 参考文献 218 3.6 互动水面 Jerry Tessendorf 219 3.6.1 线性的波浪 220 3.6.2 垂直导数操作符 221 3.6.3 波浪的传播 222 3.6.4 可以互动的障碍物及其发生源 224 3.6.5 环境波浪 225 3.6.6 网格的边界 225 3.6.7 表面张力 226 3.6.8 结论 226 3.6.9 参考文献 226 3.7 用多层物理模拟快速变形 Thomas Di Giacomo、Nadia Magnenat-Thalmann 228 3.7.1 基于物理的动画LOD及相关的工作 228 3.7.2 使用分层的质量块弹簧物理的快速变形 230 3.7.3 结论 235 3.7.4 参考文献 236 3.8 快速且稳定的形变之模态分析 James F. O'Brien 237 3.8.1 模式分解 239 3.8.2 模式的理解和丢弃 241 3.8.3 模态模拟 242 3.8.4 总结 244 3.8.5 结论 244 3.8.6 参考文献 245 第4章 人工智能 247 简介 Paul Tozour 248 4.1 第三人称视角摄像镜头的运动规则 Jonathan Stone 250 4.1.1 Camera定位及运动 250 4.1.2 Camera与场景边界 253 4.1.3 Camera遮断 256 4.1.4 简化场景 258 4.1.5 结论 258 4.1.6 参考文献 258 4.2 叙述战斗:利用AI增强动作游戏中的张力 Borut Pfeifer 260 4.2.1 戏剧张力 260 4.2.2 系统概述 263 4.2.3 设计者的控制部分 263 4.2.4 难度计算 264 4.2.5 难度调节 265 4.2.6 系统评价 266 4.2.7 结论 267 4.2.8 参考文献 267 4.3 非玩家角色决策:处理随机问题 Karén Pivazyan 268 4.3.1 概要 4.3.2 动态规划算法 269 4.3.3 代码 273 4.3.4 优化 275 4.3.5 DP算法的其他应用 275 4.3.6 结论 276 4.3.7 参考文献 276 4.4 一个基于效用的面向对象决策架构 John Hancock 277 4.4.1 决策树 278 4.4.2 基于对象的更好的体系结构 278 4.4.3 期望值 280 4.4.4 其他的决策准则 281 4.4.5 结论 282 4.4.6 参考文献 283 4.5 一个分布式推理投票架构 John Hancock 284 4.5.1 分布式推理 284 4.5.2 操纵仲裁者(Steering Arbiter)范例 286 4.5.3 选择投票空间 289 4.5.4 结论 291 4.5.5 参考文献 291 4.6 吸引子和排斥子 John M. Olsen 292 4.6.1 合力 292 4.6.2 引力曲线 293 4.6.3 吸引曲线的和 294 4.6.4 对应于特定配对的特定曲线 295 4.6.5 动态曲线 295 4.6.6 点、线、面 297 4.6.7 AI控制的层次 298 4.6.8 动画系统的交互 298 4.6.9 移动(Steering) 299 4.6.10 结论 299 4.6.11 参考文献 299 4.7 高级RTS游戏造墙算法 Mario Grimani 301 4.7.1 算法 301 4.7.2 算法改进 302 4.7.3 输出链表的形式 306 4.7.4 结论 307 4.7.5 参考文献 307 4.8 利用可编程图形硬件处理人工神经元网络 Thomas Rolfes 308 4.8.1 CPU与GPU系统架构 308 4.8.2 人工神经元网络 309 4.8.3 实现 310 4.8.4 结论 311 4.8.5 参考文献 311 第5章 图形图像 313 简介 Alex Vlachos 314 5.1 具有海报质量的屏幕截图 Steve Rabin 316 5.1.1 提高分辨率 316 5.1.2 提升像素质量 318 5.1.3 使用一个磁盘均衡采样分布 320 5.1.4 为抗锯齿调整像素的采样宽度 321 5.1.5 增加分辨率同增加像素质量相结合 321 5.1.6 结论 323 5.1.7 参考文献 324 5.2 非封闭网络模型的GPU容积阴影构架 Warrick Buchanan 325 5.2.1 回到制图板 325 5.2.2 在顶点阴影中实现这项技术 326 5.2.3 需要注意的事项 330 5.2.4 结论 330 5.2.5 参考文献 330 5.3 透视阴影贴图 Marc Stamminger 331 5.3.1 引言 331 5.3.2 后透视空间 332 5.3.3 后透视空间中的光 334 5.3.4 透视阴影贴图 335 5.3.5 实现 338 5.3.6 结论 339 5.3.7 参考文献 340 5.4 结合使用深度和基于ID的阴影缓冲 Kurt Pelzer 341 5.4.1 已有的阴影映射技术 341 5.4.2 深度和基于ID的阴影缓冲 342 5.4.3 结合深度和ID缓冲 343 5.4.4 组合的阴影缓冲概述 344 5.4.5 第一次:从光照的视点渲染 345 5.4.6 第二次:阴影检测 347 5.4.7 在DX9 2.0级的阴影中的实现 351 5.4.8 结论 353 5.4.9 参考文献 353 5.5 在场景中投射静态阴影 Alex Vlachos 355 5.5.1 前期工作 355 5.5.2 光束基本知识 355 5.5.3 高级算法 356 5.5.4 T型连接 357 5.5.5 网格模型最优算法 358 5.5.6 实现细节 359 5.5.7 阴影中的动态物体 360 5.5.8 结果 360 5.5.9 结论 361 5.5.10 参考文献 361 5.6 为阴影体和优化的网格模型调整实时光照 Alex Vlachos、Chris Oat 362 5.6.1 光照问题 362 5.6.2 在面法线上操作 362 5.6.3 调整漫射光照 364 5.6.4 结论 366 5.6.5 参考文献 366 5.7 实时半调色法:快速而简单的样式化阴影 Bert Freudenberg、Maic Masuch、Thomas Strothotte 367 5.7.1 引言 367 5.7.2 原理 368 5.7.3 实例的实现 371 5.7.4 结论 372 5.7.5 参考文献 372 5.8 在3D模型中应用团队色的各种技术 Greg Seegert 373 5.8.1 什么是团队色? 373 5.8.2 团队色的算法 373 5.8.3 一个实际的例子 378 5.8.4 光盘中的内容 379 5.8.5 结论 379 5.9 快速的棕褐色色调转换 Marwan Y. Ansari 380 5.9.1 背景 380 5.9.2 常规的方法 380 5.9.3 优化 381 5.9.4 结论 382 5.9.5 参考文献 382 5.10 使用场景亮度采样实现动态的Gamma  Michael Dougherty、Dave McCoy 383 5.10.1 光照系数 383 5.10.2 有限的动态范围 383 5.10.3 图像的优化 384 5.10.4 易变的光灵敏度 385 5.10.5 转换 386 5.10.6 算法 388 5.10.7 结论 392 5.11 热和薄雾的后处理效果 Chris Oat、Natalya Tatarchuk 393 5.11.1 热和闪光的薄雾 393 5.11.2 高级算法 393 5.11.3 计算失真值 395 5.11.4 失真值的解释 394 5.11.5 结论 400 5.11.6 参考文献 400 5.12 用四元数的硬件蒙皮 Jim Hejl 401 5.12.1 蒙皮的概念 402 5.12.2 四元数参数化 404 5.12.3 硬件实现 405 5.12.4 结论 407 5.12.5 参考文献 407 5.13 动作捕捉数据的压缩 Sφren Hannibal 409 5.13.1 处理的计划 409 5.13.2 组织数据通道 410 5.13.3 减少已储存的键的数量 410 5.13.4 包装剩余的键 412 5.13.5 运行时解压缩 412 5.13.6 未来的改进 413 5.13.7 结论 413 5.13.8 参考文献 413 5.14 基于骨骼的有关节的3D角色的快速碰撞检测 Oliver Heim、Carl S. Marshall、Adam Lake 414 5.14.1 碰撞检测与碰撞分解 414 5.14.2 术语 414 5.14.3 将碰撞检测集成到3D游戏引擎中 415 5.14.4 基于骨骼的快速碰撞检测算法 416 5.14.5 结论 423 5.14.6 感谢 423 5.14.7 参考文献 423 5.15 使用地平线进行地形的遮挡剔除 Glenn Fiedler 424 5.15.1 引言 424 5.15.2 地平线剔除基础 425 5.15.3 蛮力地平线剔除 426 5.15.4 近似值 426 5.15.5 近似地平线直线 427 5.15.6 一个更好的近似值 427 5.15.7 最小二次方线 428 5.15.8 将它放入到第三维中 429 5.15.9 最小二次方平面 430 5.15.10 用近似值的地平线剔除 431 5.15.11 被地形遮挡的对象 432 5.15.12 使它成为动态的 432 5.15.13 未来的方向 433 5.15.14 结论 433 5.15.15 参考文献 433 第6章 网络和多人游戏 435 简介 Pete Isensee 436 6.1 设计与开发游戏大厅 Shekhar Dhupelia 437 6.1.1 状态-事件系统的设计 437 6.1.2 探讨大厅的子系统 438 6.1.3 高级大厅子系统 439 6.1.4 结论 441 6.1.5 参考文献 442 6.2 支持成千上万个客户端的服务器 Adam Martin 443 6.2.1 服务器设计中的门槛 443 6.2.2 问题 444 6.2.3 主要技术 446 6.2.4 服务器设计 451 6.2.5 结论 452 6.2.6 参考文献 452 6.3 大型多人游戏状态的有效存储 Justine Quimby 454 6.3.1 MMP的问题 454 6.3.2 Qualities理论 455 6.3.3 Qualities API 456 6.3.4 使用Qualities的好处 459 6.3.5 结论 459 6.3.6 参考文献 460 6.4 在客户/服务器环境下运用并行状态机 Jay Lee 461 6.4.1 独立状态 461 6.4.2 角色状态管理器 463 6.4.3 使用CharacterStateMgr 464 6.4.4 保持客户端和服务器端的同步 464 6.4.5 状态依赖的子系统 466 6.4.6 结论 467 6.4.7 参考文献 467 6.5 位打包:一种网络压缩技术 Pete Isensee 468 6.5.1 一个实例 468 6.5.2 难点 469 6.5.3 位打包 469 6.5.4 用于可打包数据类型的通用接口 471 6.5.5 用于可打包数据类型的具体接口 471 6.5.6 编解码器 472 6.5.7 评价折衷 473 6.5.8 改进 473 6.5.9 结论 473 6.5.10 参考文献 474 6.6 多服务器网络游戏的时间和同步管理 石卫东(Larry Shi)、Tao Zhang 475 6.6.1 为什么需要时间和同步管理 475 6.6.2 时钟同步 475 6.6.3 同步和响应 476 6.6.4 用多时间管理来一石二鸟地实现同步和响应 476 6.6.5 实现 476 6.6.6 何时应使用多时管理 482 6.6.7 总结 482 6.6.8 致谢 482 6.6.9 参考文献 482 第7章 音频 485 简介 Eddie Edwards 486 7.1 OpenAL简介 Joe Valenzuela 487 7.1.1 OpenAL API 487 7.1.2 有关OpenAL的实现 493 7.1.3 实现一致性指南 495 7.1.4 未来OpenAL的发展蓝图 496 7.1.5 总结 496 7.1.6 参考文献 496 7.2 简单的实时Lip-Synching系统 Jake Simpson 497 7.2.1 实现 497 7.2.2 动画方面需要注意的事项 498 7.2.3 声音音量的水印标记 499 7.2.4 注意 500 7.2.5 总结 500 7.3 动态变量和音频编程 James Boer 501 7.3.1 动态变量是什么? 501 7.3.2 动态变量类 501 7.3.3 在音频编程中使用动态变量 503 7.3.4 其他改进 506 7.3.5 结论 506 7.3.6 参考文献 506 7.4 创建一个音频脚本系统 Borut Pfeifer 507 7.4.1 游戏中音频的类别 508 7.4.2 工具 510 7.4.3 基于XML的音频标记库 510 7.4.4 脚本系统组件 512 7.4.5 进一步的工作 515 7.4.6 总结 515 7.4.7 参考文献 515 7.5 使用EAX和ZoomFX API的环境音效解决方案 Scott Velasquez 516 7.5.1 什么是环境音效 516 7.5.2 音频引擎的系统要求 517 7.5.3 潜在可听集(PAS,Potentially Audible Set) 518 7.5.4 EAX介绍 520 7.5.5 总结 528 7.5.6 参考文献 528 7.6 在游戏的物理引擎中控制实时声音 Frank Luchs 529 7.6.1 游戏引擎 529 7.6.2 混合声音合成 531 7.6.3 可听见对象的属性 532 7.6.4 对象形状的影响 532 7.6.5 对象材质的影响 533 7.6.6 撞击和碰撞 533 7.6.7 演示 533 7.6.8 总结 534 7.6.9 参考文献 534 附录 536 前言   作者:Andrew Kirmse,LucasArts Entertainment 公司   E-mail:ark@alum.mit.edu   在最近几年中我们见到了越来越多的有关游戏开发的实用书籍,其中不乏“游戏编程精粹”系列的功劳。本系列,包括你正在阅读的这一卷,是为数不多的专业游戏开发者向外人详细披露秘密的地方之一。我们希望你能够体会文字背后的这些当今最先进、销量最大的游戏软件的开发经验,并将学来的技术和方法运用到你的日常工作中。   汇编一本实用的书,需要很好的平衡,既要有能够立即付诸实用的高端知识,也要能高瞻远瞩。由于游戏开发已变得非常专门化,我们特地邀请了7位业界专家来筛选和编辑7个主题的文章,他们是:   ● 通用编程:Chris Corry,LucasArts Entertainment Company   ● 数学:Jonathan Blow   ● 物理:Graham Rhodes,Applied Research Associates,Inc.   ● 人工智能:Paul Tozour,Retro Studios/Nintendo   ● 图形图像:Alex Vlachos,ATI Research,Inc.   ● 网络和多人游戏:Pete lsensee,Microsoft   ● 音频:Eddie Edwards,Sony Computer Entertainment Europe   物理部分第一次在“游戏编程精粹”系列中出现,这也反映了在当前许多游戏中实时模拟和动力学的重要性的增长。曾几何时,物理模拟还只是飞行模拟游戏和驾驶模拟游戏的专利,但今日物理已在大多数出现交通工具及具有关节的角色的游戏中扮演着重要的角色。该部分的文章涵盖所有方面,从“游戏程序员的物理知识”直到有关物体实时变形的最新内容。   在本书中还有别的第一:第一位女性作者(恭喜你!):更多的来自高校及研究院的稿件;在图形图像部分首次出现了有关最新硬件支持的pixel和vertex shader技术的讨论。将这一卷中的彩色插图与《游戏编程精粹1》相比较,你就能看出在短短3年间,这一领域的进展是如何之快。阴影是特别热门的研究领域之一,在本书的图形图像部分详细介绍了新的阴影技术。有了新的硬件支持,一些极具视觉冲击力的新特效只需要要一点点小聪明就能做到。   如何利用本书   我们努力创造这样一本书,你会将它放在书桌上,而不是书架上。当你遇到 新问题的时候,你会查阅本书,看是否这个问题已被他人解决。在多数情况下, 你可以改编或者直接利用光盘上的源代码。如果你是某个领域的专家,你会愿意 首先阅读对应的章节,但其他部分(特别是通用编程部分)可能也会包含对那个 困扰你游戏已久的问题的解决方案。也可能你将在下一个项目中负责不同的部分, 因此你会回来阅读本书中的其他章节。   在每一部分里,文章基本上是按照复杂度递增的顺序排列的。但编程老手们仍能从顺序靠前的文章中获益,新手也会找到顺序靠后的文章中所探讨方法的实际用途。当你逐章阅读下去的时候,这些特意安排的文章将使你越来越熟悉这个专题,其中涉及的数学知识也更为复杂。线性代数在数学和物理部分中特别有用,其他一些文章还用到了微积分初步、差分方程和数值计算方法。   随着本系列丛书涵盖的内容越来越广,用到的语言和第三方API的种类也越来越繁多。大多数代码是用C++写的,此外也用到了一些解释语言,如Java和Python。图形部分的文章涉及了OpenGL、DirectX以及各种shader语言。我们尽量以与特定API无关的方式描述问题与方法。   生生不息   有许多在几年前开始从事游戏开发的同行仍然记得那激发自己从事游戏开发的冲动的时刻。对我个人而言,一切都是从我六年级时懂得可以用一种叫“几何学”的神奇“玩意”在计算机屏幕上画圆开始的。从那时起,我们自学了许多书,那些书现在早已翻旧了,其中有高德纳先生(Donald E.Knuth)的The Are Of Computer Programming、Sedgwick的Algorithms、Graphics Gems系列,也许还有James D.Foley和Andries van Dam合著的Computer Graphios一书中圆的Bresenham算法。就在数年之前,我曾在一次面试中被要求推导出该算法,这令我甜蜜地回想起六年级时在Atari 800计算机上绘制圆的情景。   如果你是一名专业游戏工作者,我希望此书能够唤醒你的求知欲。如果你刚刚起步,我希望你能够在本书中找到能够让你穷尽一生去追求和发现的美好事物。 序言   感谢你选择《游戏编程精粹4》!在这“游戏编程精粹”系列的最新一卷中,众多作者将一如既往地对游戏程序员会遇到的大量问题进行探讨。或许他们中有人已经解决了你正在苦苦思索的技术难题。何必重复劳动呢?若你能(通过采用他们的解决方案)站在巨人的肩膀上,你就有机会成为下一位巨人。希望你对学会的算法进行扩展与改进,然后将你的结果公之于众。这样的知识传递,正是我们行业进步的关键所在,也是每一位游戏程序员对自己每天从事的工作保持不灭热情的关键所在。   为了反映你今日面临的挑战,我们在这一卷中增加了专门讨论游戏中物理问题的一章。随着游戏平台的机能日益强大,在游戏中实现实时物理的想法正广受关注。有一些正在开发的游戏已经开始无声无息地增加了一定的物理模拟,许多物体正开始按照玩家所能预料的那种符合物理原理的方式动作。从而,突显玩点(Emergent Gameplay)将成为可能,且为游戏增添前所未有的趣味。瞧,手里没有武器吗?那好,拾起一把折凳朝僵尸丢过去吧。   本书中的文字悉经Andrew Kirmse精心策划。早在1996年,Andrew就参与开发了第一款3D多人在线角色扮演游戏Meridian 59!现在Andrew是LucasArts公司的主程序员,开发的游戏如Star Wars:'Starfighter等。他也是《游戏编程精粹3》网络和多人游戏部分的编辑,并曾为“游戏编程精粹”系列的第一卷和第二卷撰稿。   业界的现状   当本书付印之时,我们正期盼着有关下一代游戏主机的信息。我们不由得猜疑,需要学哪些技术才能有效地在下一代主机上进行开发呢?然而,它们将带来的新的功能仍然是个谜。   近在眼前的是便携式游戏设备掀起的高潮。任天堂公司的GameBoy已经以其各种型号独领风骚十多年了,但其他的公司正纷纷携各自有竞争力的产品进入这个市场。从Nokia的N-GageTM到Tapwave的ZodiacTM到索尼的PSP,也许微软心中也自有妙计,手持游戏市场已到了爆发的时候了。   时机选得正好,家用游戏机上的游戏软件开发费用昂贵而且风险也很大,因此有另一种开发成本较低的平台无疑是件好事。如果你也是一名“蜗居”在车库中的游戏开发者,这对你一定是天大的好消息。今时今日,除了那些大发行商之外,又有谁能负担得起开发一个高质量游戏所需的至少1500万美元呢。   开发游戏的成本逐年上升,这在业界造成了不少麻烦问题,逐渐多见的炒冷饭问题只是其中之一。你又怎能埋怨游戏发行商不愿意承担风险呢?如果你有1500万美元钱用于投资,难道你不会倾向于较安全可靠的途径吗?今日的市场上,有着许多的续集、已有的游戏的克隆版以及各种各样的官方特许产品。这都是可以理解的,但并不令人满意。如果你是一名游戏玩家,重复玩雷同的游戏多半无法使你兴奋起来。   出路在何方?怎样才能把我们这些开发者从枷锁中释放出来,使我们有更大余地创新?我无法给你现成的答案,但我有个有益的建议。贡献   常有人问我这样的问题,是什么原因让那些作者坚持为“游戏编程精粹”系列撰稿呢?难道他们不正是在将自己宝贵的技术成果泄漏给竞争对手么?这样问我,一定是从未在其他行业中见到类似的情况——可口可乐公司就绝对不会把它的绝密配方和百事可乐公司共享!那么,面对那些开发与你的游戏竞争的开发者和发行商,为什么你会将你的算法与之共享呢?   从这个角度看问题吧。如果你每次开发游戏都把代码从头写过,那就意味着每次都要重写保存游戏的函数库,对不对?可是你愿意每次都推倒重来吗?你一定会找个方法来节约时间,也免得让那些重复劳动逼得你发疯。那么在写完这个函数库之后,让你的朋友也使用它吧。也许你会问,我干吗要把自己辛苦好久才写出来的东西给别人用呢?答案是,你的朋友和你所处的情况一模一样。他已经重写了好多遍消除内存碎片的功能模块,这些重复劳动让他也一样很郁闷。如果你俩能共享各自的函数库,你们就都能事半功倍。这不是一件值得做的事情吗?   在较高层次来看,譬如说你为一家发行商工作,目前正在配合两家开发工作室工作。这两家工作室都正在从零开始编写全部代码。他们将各自编写功能完全相同的两套底层函数库。难道你不会倾向于将两者的开发工作在某种程度上予以合并,从而减少成本吗?一个游戏的基本模块并不会对游戏有太大的影响,何必要为两家工作室各自开发同样的东西而付双份钱呢?又譬如你为其中一家游戏工作室工作,合并部分模块工作的做法,将节约你的时间,使你能够更专注与朝游戏中增添feature,而正是feature将使你的游戏鹤立鸡群。而且,既然发行商因其对工作室提供的服务而将抽取游戏销售收入中的大部分,那么若能在履行合同之余顺便获得一些有用的代码,不是很划算吗?   让我们在更高的层次看这个问题。我们是一个大行业,其中有着上千个游戏开发工作室。上千个工作室正在重复地开发着相同功能的函数库,这又是何苦呢?这正是诸如STL那样的库存在的理由:节约每个人的时间,也就等于节约每个工作室的开发成本。何不让这些工作室在某种抽象的层次进行协作,使其各自能将更多时间用来开发自己的游戏中独特的部分?今时今日,似乎无人有时间来创作革新的游戏,每个人都把如此多的时间耗在底层代码的重写上了(也变得与时俱进地复杂)以至于无法在日程中塞进更多创新的工作。充分共享   于是你会说:好啊,那真是非常好。我只要等别人写完代码并“泄”(share)出来,随便拿来用就奸。这样子一来,我既不用泄出一行自己的代码,又可以从中获益匪浅。对不起,这不符合游戏规则。若每个人都这么想,那就不会有会议、书、杂志等等的存在,也不存在任何性质的信息共享了。为了共享体系能够正常运行,每个人都应当出一份力。   你可以拿这个体系和税务体系相比拟。若没有人缴税,政府就会失去经济来源。道路龟裂不会有人来修,桥梁也会年久失修甚至断裂,冬天街上的积雪也不会有人从中开辟出通路。或许,你也能够自己来打理这一切,维护自己住的地方的附近区域。但是,更有效率的做法是缴一些税金,然后由各方面的专家为所有人解决一切。在软件开发上也是类似的。当你贡献出部分自己特别擅长的资源后,你就能从其他业界专家贡献出的资源中受益。   在一个税务制度完善的社会里,每一个要求权利但不愿同时履行缴税义务的人,在一定程度上侵犯了这个社会的利益。因为有这些拖欠税款的人的存在,其他人就需要缴更多的税。在技术领域也是类似的。这些不向群体做贡献的人,是拒绝分享自己的聪明才智。而同时,他人就不得不耗费较多时间,无谓地重写他们本来已经写好的完美的记忆卡函数库。在这种情况下,他们又有什么权利来抱怨业界缺乏创新精神呢?是你使得好多人不得不重头编写那可怜的记忆卡函数库!他们又怎会有时间来创新!   所以,简单说来这就是共享体系的根基,也是为何这对我们开发者团体来说是如此重要。在从他人的成果中获益的同时,每个向团体作出贡献的人也能得到各种形式的正面反馈,也许团体中的其他人进一步改进了相关代码,也许你获得了声望,甚至可能是一份酬金。   诚然,你也可能有一些不能与他人共享的商业机密,这是可以理解的。若你刚开发了一个效果美轮美奂的pixel shader,那么等到你使用该shader的游戏发售之后再共享该shader也是可以理解的。事实上,在你的游戏发售以后,对于任何细心分析你的游戏的人来说,其中的技术就不再是秘密了。因此,何不公开共享呢?日积月累,这样做的人们积累了较多的信息,也提高了复杂度。这推动了许多像本书——《游戏编程精粹4》一样的书的出现。精粹丛书之所以存在于今日,与全世界范围内巨大数量的支持者是分不开的。至今已有多达200人曾为游戏编程精粹系列撰稿,他们来自美国、加拿大、英国、法国、德国、瑞士、澳大利亚、巴西等地。显然,许多人都认同这一共享体系。   请认真考虑一下,你也能为游戏开发团体作出一份贡献。无论是向游戏编程精粹系列投稿、向杂志投稿、写书、在自己的网站上发表文章或披露部分你上一款游戏中的代码都行。比起什么都不做,只有给予能给你带来更多的获取。阅读他人的想法正是我们学习计算机科学的方式,也是未来的游戏开发者们学习实用有效的技术、从而避免重复开发的方式。这终将释放我们大家的创新力,带来前所未有的愉快体验。作为游戏开发者,也作为游戏玩家的一份子,这难道不正是我们真心希望的吗?

...展开详情
上传时间:2012-09 大小:42.27MB
热门图书