第一部分 Windows编程基础 2
第1章 学海无涯 2
1.1历史一瞥 2
1.2设计游戏 5
1.3游戏类型 5
1.4集思广益 6
1.5设计文档和情节串联图板 6
1.6使游戏具有趣味性 7
1.7游戏的构成 7
1.8常规游戏编程指导规范 11
1.9使用工具 14
1.10从准备到完成——使用编译器 15
1.11示例:FreakOut 17
1.12小结 30
第2章 Windows编程模型 31
2.1 Windows的起源 31
2.1.1早期版本的Windows 31
2.1.2 Windows 3.x 32
2.1.3 Windows 95 32
2.1.4 Windows 98 33
2.1.5 Windows ME 33
2.1.6 Windows XP 33
2.1.7 Windows NT/2000 33
2.1.8 Windows基本架构:Win9X/NT 34
2.2多任务和多线程 34
2.2.1获取线程的信息 34
2.2.2事件模型 36
2.3按照微软风格编程:匈牙利符号表示法 37
2.3.1变量的命名 38
2.3.2函数的命名 38
2.3.3类型和常量的命名 38
2.3.4类的命名 38
2.3.5参数的命名 39
2.4世界上最简单的Windows程序 39
2.4.1总是从WinMain()开始 40
2.4.2程序剖析 41
2.4.3选择一个信息框 42
2.5现实中的Windows应用程序 44
2.6 Windows类 45
2.7注册Windows类 50
2.8创建窗口 50
2.9事件处理程序 52
2.10主事件循环 57
2.11产生一个实时事件循环 60
2.12打开多个窗口 61
2.13小结 63
第3章 高级Windows编程 64
3.1使用资源 64
3.1.1整合资源 66
3.1.2使用图标资源 66
3.1.3使用光标资源 68
3.1.4创建字符串表资源 71
3.1.5使用.WAV声音资源 73
3.1.6使用编译器创建.RC文件 76
3.2使用菜单 77
3.2.1创建菜单 77
3.2.2装载菜单 79
3.2.3响应菜单事件消息 82
3.3 GDI(图形设备接口)简介 86
3.3.1重拾WM PAINT信息 86
3.3.2视频显示基础和色彩(Video Display Basics and Color) 90
3.3.3 RGB和调色板模式 91
3.3.4基本文本显示 92
3.4处理重要事件 97
3.4.1 Windows操作 97
3.4.2处理键盘事件 101
3.4.3处理鼠标事件 107
3.5自行发送消息 109
3.6小结 111
第4章 Windows GDI、控件和灵感 112
4.1高级GDI绘图 112
4.1.1掀开图形设备描述表的盖头来 112
4.1.2颜色、画笔和画刷 113
4.1.3使用画笔 114
4.1.4使用画刷 116
4.2点、线、平面多边形和圆 117
4.2.1绘制点 118
4.2.2绘制线段 119
4.2.3绘制矩形 120
4.2.4绘制圆 122
4.2.5绘制多边形 123
4.3深入文本和字体 124
4.4定时高于一切 125
4.4.1 WM_TIMER消息 125
4.4.2低层定时操作 127
4.5使用控件 130
4.5.1按钮 131
4.5.2向子控件发送消息 133
4.6获取信息 136
4.7 T3D游戏控制台程序 141
4.8小结 145
第二部分 DirectX和2D基础 148
第5章 DirectX基础知识和令人生畏的COM 148
5.1 DirectX基础 148
5.1.1 HEL和HAL 150
5.1.2更多的DirectX基础类 151
5.2 COM:是微软的杰作,还是魔鬼的杰作 153
5.2.1 COM对象究竟是什么 154
5.2.2接口标识符和GUID的详细内容 156
5.2.3创建一个类COM对象 157
5.2.4 COM的简要回顾 158
5.2.5可运行的COM程序 159
5.3应用DirectX COM对象 162
5.3.1 COM和函数指针 163
5.3.2创建和使用DirectX界面 166
5.3.3接口查询 167
5.4 COM的前景 168
5.5小结 169
第6章 初次邂逅DirectDraw 170
6.1 DirectDraw的接口 170
6.1.1接口的特性 170
6.1.2组合使用接口 172
6.2创建DirectDraw对象 173
6.2.1对DirectDraw进行错误处理 173
6.2.2顺便提一下接口 174
6.3与Windows协作 177
6.4设置模式 180
6.5色彩的奥秘 182
6.6创建显示表面 185
6.6.1创建一个主显示表面 186
6.6.2关联调色板 192
6.6.3绘制像素 192
6.6.4清理资源 201
6.7小结 202
第7章 高级DirectDraw和位图图形 203
7.1使用高彩模式 203
7.1.1 16位高彩模式 204
7.1.2获取像素格式 205
7.1.3 24/32位真彩色模式 211
7.2双缓冲 213
7.3表面动态 217
7.4页面切换 220
7.5显存块移动单元(Blitter) 225
7.5.1使用Blitter进行内存填充 227
7.5.2从一个表面向另一个表面复制位图 232
7.6基础裁剪知识 235
7.6.1将像素按视口裁剪 235
7.6.2位图裁剪技巧 236
7.6.3使用IDirectDrawClipper进行DirectDraw裁剪 241
7.7使用位图 245
7.7.1载入.BMP文件 245
7.7.2使用位图 250
7.7.3载入8位位图 251
7.7.4载入16位位图 252
7.7.5载入24位位图 252
7.7.6总结位图 253
7.8离屏表面 253
7.8.1创建离屏表面 253
7.8.2在离屏表面上进行Blitting 254
7.8.3设置Blitter 255
7.8.4色彩键 255
7.8.5源色彩键 256
7.8.6目标色彩键 258
7.8.7使用Blitter(终于!) 259
7.9位图的旋转和缩放 260
7.10离散采样理论 261
7.11色彩效果 265
7.11.1 256色模式下的色彩动画 265
7.11.2 256色模式下的色彩旋转 270
7.11.3使用RGB模式的技巧 271
7.12手动色彩变换及查询表 272
7.13新的DirectX色彩和Gamma控制接口 272
7.14将GDI和DirectX联用 273
7.15 DirectDraw的庐山真面目 275
7.15.1主DirectDraw对象 275
7.15.2关于表面 277
7.15.3使用调色板 277
7.16在窗口模式下使用DirectDraw 278
7.17小结 285
第8章 矢量光栅化及2D变换 286
8.1绘制线条 286
8.1.1 Bresenham算法 287
8.1.2算法的速度优化 292
8.2基本2D图形裁剪 294
8.2.1利用点斜式计算两条直线的交点 295
8.2.2利用一般式计算两条直线的交点 297
8.2.3利用矩阵式计算两条直线的交点 297
8.2.4裁剪直线 299
8.2.5 Cohen-Sutherland算法 300
8.3线框多边形 306
8.3.1多边形数据结构 307
8.3.2多边形的绘制及裁剪 308
8.4 2D平面里的变换 310
8.4.1平移 310
8.4.2旋转 312
8.4.3缩放 319
8.5矩阵引论 320
8.5.1单位矩阵 322
8.5.2矩阵加法 322
8.5.3矩阵乘法 323
8.5.4使用矩阵进行变换 325
8.6平移 326
8.7缩放 327
8.8旋转 327
8.9填充实心多边形 329
8.9.1三角形和四边形类型 330
8.9.2绘制三角形和四边形 332
8.9.3三角形解构详述 334
8.9.4四边形光栅化的一般性讨论 341
8.9.5多边形的三角化 341
8.10多边形碰撞检测 345
8.10.1接近度、边界球/圆 345
8.10.2边界盒 348
8.10.3点包含 350
8.11深入定时和同步 351
8.12卷轴和摇镜头 353
8.12.1页面卷轴引擎 353
8.12.2均匀平铺(Tile)显示引擎 354
8.12.3稀疏位图平铺显示引擎 358
8.13伪3D等轴测引擎 359
8.13.1方法1:基于单元,全二维 359
8.13.2方法2:基于全屏,具有一些二维或三维的碰撞网络 361
8.13.3方法3:采用全三维数学运算,使用一个固定的相机视角 362
8.14 T3DLIB1函数库 363
8.14.1引擎架构 363
8.14.2新的游戏编程控制台程序 364
8.14.3基本定义 370
8.14.4可用的宏 371
8.14.5数据类型和结构 372
8.14.6全局定义 375
8.14.7 DirectDraw接口 376
8.14.8 2D多边形函数 379
8.14.9 2D基本图元函数 381
8.14.10数学和误差函数 385
8.14.11位图函数 386
8.14.12调色板函数 390
8.14.13实用工具函数 392
8.15BOB引擎 393
8.16小结 400
第9章 DirectInput输入和力反馈 401
9.1输入循环 401
9.2 DirectInput序曲 402
9.2.1 DirectInput组件 404
9.2.2设置DirectInput的一般步骤 404
9.2.3数据采集模式 405
9.2.4创建主DirectInput对象 406
9.2.5 101键盘 407
9.2.6读数据过程中的问题:重获取 413
9.2.7捕捉鼠标 414
9.2.8使用游戏杆 418
9.2.9将输入消息化 428
9.3力反馈 431
9.3.1力反馈的物理原理 431
9.3.2设置力反馈 431
9.3.3力反馈演示程序 432
9.4编写一个广泛适用的输入系统:T3DLIB2.CPP 433
9.5小结 437
第10章 用DirectSound和DirectMusic演奏乐曲 438
10.1在PC上对声音编程 438
10.2从此有了声音 439
10.3数码声音与MIDI比较——音质好且存储省 441
10.3.1数码声音——从“位”开始 442
10.3.2合成声音与MIDI 443
10.3.3 MIDI概述 444
10.4发声硬件 444
10.4.1波表合成 444
10.4.2波导合成 445
10.5数码录音:设备和技术 445
10.5.1录制声音 446
10.5.2处理声音 446
10.6 DirectSound中的麦克风 446
10.7初始化DirectSound 448
10.7.1理解协作等级 449
10.7.2设定协作等级 450
10.8主声音缓冲区与辅助声音缓冲区 450
10.8.1使用辅助缓冲区 450
10.8.2创建辅助声音缓冲区 451
10.8.3把数据写入辅助声音缓冲区 453
10.9渲染声音 454
10.9.1播放声音 455
10.9.2停止播放 455
10.9.3控制音量 455
10.9.4调整频率 456
10.9.5调整声道平衡 456
10.10用DirectSound反馈信息 456
10.11从磁盘中读取声音数据 458
10.11.1 .WAV文件格式 458
10.11.2读取.WAV文件 458
10.12 DirectMusic:伟大的试验 462
10.13 DirectMusic的体系结构 463
10.14初始化DirectMusic 464
10.14.1初始化COM 464
10.14.2创建一个演奏对象 464
10.14.3给演奏对象增加端口 465
10.15加载一个MIDI段 466
10.15.1创建一个加载程序 466
10.15.2加载MIDI文件 466
10.16操作MIDI段 469
10.16.1播放一个MIDI段 469
10.16.2停止一个MIDI段 469
10.16.3检查MIDI段的状态 469
10.16.4释放一个MIDI段 470
10.16.5关闭DirectMusic 470
10.16.6一些DirectMusic的实例 470
10.17 T3DLIB3声音和乐曲库 470
10.17.1头文件 471
10.17.2类型 471
10.17.3全局变量 472
10.17.4 DirectSound API封装 472
10.17.5 DirectMusic API封装 476
10.18小结 478
第三部分 核心游戏编程 480
第11章 算法、数据结构、内存管理和多线程 480
11.1数据结构 480
11.1.1静态结构和数组 480
11.1.2链表 481
11.2算法分析 487
11.3递归 489
11.4树结构 490
11.4.1建立二分查找树(BST) 493
11.4.2搜索BST 495
11.5优化理论 497
11.5.1运用你的头脑 497
11.5.2数学技巧 498
11.5.3定点运算 499
11.5.4循环体展开 502
11.5.5查找表 502
11.5.6汇编语言 503
11.6制作演示 504
11.6.1预先记录的演示 504
11.6.2由人工智能控制的演示 505
11.7保存游戏的手段 505
11.8实现多人游戏 506
11.8.1轮流 506
11.8.2分屏 506
11.9多线程编程技术 507
11.9.1多线程编程的术语 508
11.9.2为何要在游戏中使用线程 509
11.9.3取得一个线程 510
11.9.4线程间的消息传递 516
11.9.5等待合适时机 520
11.9.6多线程和DirectX 526
11.9.7高级多线程编程 526
10.10小结 527
第12章 人工智能 528
12.1人工智能初步 528
12.2确定性AI算法 529
12.2.1随机运动 530
12.2.2跟踪算法 531
12.2.3反跟踪:闪避算法 534
12.3模式以及基本控制脚本的编写 535
12.3.1基本模式 535
12.3.2具备条件逻辑处理的模式 539
12.4行为状态系统建模 540
12.4.1基本状态机 541
12.4.2加入更多表现个性的行为 544
12.5用软件对记忆和学习进行建模 546
12.6计划树和决策树 548
12.6.1计划编程 549
12.6.2实现真正的计划生成器 552
12.7寻路 553
12.7.1试探法(Trial and Error) 554
12.7.2轮廓跟踪 555
12.7.3碰撞规避跟踪 555
12.7.4路点寻路 556
12.7.5一个赛车例子 559
12.7.6可靠的寻路 559
12.8高级AI脚本 563
12.8.1设计脚本语言 563
12.8.2使用C/C++编译器 565
12.9人工神经网络 568
12.10遗传算法 571
12.11模糊逻辑 573
12.11.1普通集合论 573
12.11.2模糊集合理论 574
12.11.3模糊语言变量及其规则 575
12.11.4模糊流形与成员关系 577
12.11.5模糊关联矩阵 581
12.11.6用模糊化的输入处理FAM 583
12.11.7暖融融 589
12.12为游戏创造真正的AI 589
12.13小结 589
第13章 基本物理建模 590
13.1基本物理学定律 591
13.1.1质量(m) 591
13.1.2时间(t) 591
13.1.3位置(s) 592
13.1.4速率(v) 593
13.1.5加速度(a) 594
13.1.6力(F) 597
13.1.7多维空间中的力 598
13.1.8动量(P) 598
13.2线性动量的物理性质:守恒与传递 599
13.3模拟万有引力效果 601
13.3.1模拟重力井 603
13.3.2模拟炮弹弹道 604
13.4讨厌的摩擦力 607
13.4.1摩擦基本概念 607
13.4.2斜面上的摩擦力(高级) 609
13.5基本的特殊碰撞反应 611
13.5.1简单的x,y反弹物理 611
13.5.2计算任意方向上的平面碰撞反应 614
13.5.3矢量反射示例 616
13.5.4线段的交点 617
13.6实际2D物体间的精确碰撞响应(高级) 621
13.7解决n-t坐标系统 624
13.8简单运动学 630
13.8.1求解正向运动学问题 631
13.8.2解决反向运动学问题 633
13.9粒子系统 634
13.9.1每颗粒子都需要的东西 635
13.9.2设计粒子引擎 635
13.9.3粒子引擎软件 636
13.9.4产生初始条件 640
13.9.5整合微粒系统 642
13.10创建游戏的物理模型 643
13.10.1物理建模的数据结构 643
13.10.2基于帧的模拟与基于时间的模拟 643
13.11小结 645
第14章 文字时代 646
14.1什么是文字游戏 647
14.2文字游戏如何工作 647
14.3从外部世界获得输入 650
14.4语言分析和解析 651
14.4.1词法分析 655
14.4.2句法分析 660
14.4.3语义分析 662
14.5组成游戏世界 663
14.5.1表示场景 663
14.5.2放置物体 665
14.5.3让事情发生 666
14.5.4自由移动 666
14.5.5物品系统 666
14.6.实现视觉、听觉和嗅觉 666
14.6.1听觉 667
14.6.2嗅觉 668
14.6.3视觉 668
14.7实时响应 670
14.8错误处理 671
14.9造访Shadow Land 671
14.10 Shadow Land中使用的语言 671
14.11编译和运行Shadow Land 673
14.12小结 674
第15章 综合运用 675
15.1 Outpost的设计初稿 675
15.1.1游戏背景 675
15.1.2设计游戏玩法 676
15.2用于编写游戏的工具 676
15.3游戏场景:在太空中卷动 677
15.4玩家控制的飞船:鬼怪号 678
15.5小行星带 680
15.6敌人 681
15.6.1边哨(Outpost) 681
15.6.2捕食者太空雷 682
15.6.3战舰 682
15.7“宝物” 685
15.8 HUD 685
15.9粒子系统 688
15.10玩游戏 689
15.11编译Outpost 689
15.12结束语 690
第四部分 附录 694
附录A 光盘内容简介 694
附录B 安装DirectX和使用C/C++编译器 696
附录C 数学和三角学回顾 699
附录D C++入门 709
附录E 游戏编程资源 727
附录F ASCII表 731