目 录
第1章 欢迎阅读《C++游戏编程入门》(第3版) 1
1.1 我们将构建的游戏 2
1.1.1 Timber!!! 2
1.1.2 Pong 2
1.1.3 Zombie Arena 3
1.1.4 Run 3
1.2 为什么要学习C++游戏编程 4
1.2.1 SFML 5
1.2.2 Microsoft Visual Studio 6
1.2.3 在Mac或Linux操作系统下使用本书的方法 7
1.2.4 安装Visual Studio 2022 7
1.3 搭建SFML环境 8
1.4 新建Visual Studio项目 10
1.5 规划Timber!!!项目 15
1.6 项目资源 17
1.6.1 定制音效 18
1.6.2 在项目中添加资源 18
1.6.3 浏览项目资源 18
1.7 理解屏幕及内部坐标 19
1.8 开始编写游戏 21
1.8.1 注释让代码变得更清晰 21
1.8.2 main函数 21
1.8.3 代码的形式与语法概览 22
1.8.4 从函数返回一个值 22
1.8.5 运行游戏 23
1.9 使用SFML启动一个窗口 23
1.9.1 引入SFML功能 24
1.9.2 OOP、类与对象 24
1.9.3 命名空间与using语句 26
1.9.4 SFML VideoMode类与RenderWindow类 26
1.9.5 运行游戏 27
1.10 游戏循环 27
1.10.1 while循环 28
1.10.2 C风格代码注释 28
1.10.3 输入、更新、绘制、重复 29
1.10.4 检测按键动作 29
1.10.5 清空并绘制场景 29
1.10.6 运行游戏 30
1.11 绘制游戏背景 30
1.11.1 让精灵与纹理图协同工作 30
1.11.2 背景精灵与双重缓冲区 32
1.11.3 运行游戏 32
1.12 处理错误 33
1.12.1 配置错误 33
1.12.2 编译错误 34
1.12.3 链接错误 34
1.12.4 缺陷 34
1.13 本章小结 34
1.14 常见问题 35
第2章 变量、运算符与决策——让精灵动起来 37
2.1 系统学习C++变量 37
2.1.1 变量类型 38
2.1.2 声明并初始化变量 39
2.2 熟悉操作变量的方法 41
2.2.1 C++算术运算符与赋值运算符 42
2.2.2 使用表达式完成工作 43
2.3 添加云朵、蜜蜂和树 45
2.3.1 准备树 46
2.3.2 准备蜜蜂 47
2.3.3 准备云朵 48
2.3.4 绘制树、蜜蜂和云朵 49
2.4 随机数 50
2.5 用if与else制定决策 51
2.5.1 逻辑运算符 51
2.5.2 C++的if与else 52
2.5.3 如果敌军过了桥,就开枪 52
2.5.4 else定义了另一种行为 53
2.5.5 一次改错挑战 54
2.6 计时功能 55
2.6.1 帧率问题 55
2.6.2 SFML的帧率方案 56
2.7 移动云朵与蜜蜂 57
2.7.1 为蜜蜂赋予生命 58
2.7.2 吹动云朵 60
2.8 本章小结 64
2.9 常见问题 64
第3章 C++字符串、SFML时间、玩家输入与HUD 67
3.1 暂停与重新开始游戏 67
3.2 C++字符串 69
3.2.1 声明字符串 69
3.2.2 将值赋给字符串变量 70
3.2.3 连接字符串 70
3.2.4 获取字符串的长度 71
3.2.5 通过stringstream操作字符串 71
3.2.6 SFML的Text类与Font类 72
3.3 增加分数与提示信息 73
3.4 增加时间棒 77
3.5 本章小结 82
3.6 常见问题 82
第4章 循环、数组、switch、枚举与函数——实现游戏机制 83
4.1 循环 83
4.1.1 while循环 84
4.1.2 跳出循环 86
4.1.3 for循环 87
4.2 数组 88
4.2.1 声明一个数组 89
4.2.2 初始化数组的元素 89
4.2.3 数组对我们游戏的作用 90
4.3 通过switch制定决策 91
4.4 枚举类 93
4.5 函数初探 95
4.5.1 函数语法的设计理念 96
4.5.2 函数返回类型 97
4.5.3 函数名 100
4.5.4 函数参数 101
4.5.5 函数体 101
4.5.6 函数原型 102
4.5.7 组织函数 102
4.5.8 函数作用域 103
4.5.9 本章关于函数的结语 103
4.6 长出枝杈 104
4.6.1 准备枝杈 105
4.6.2 在每帧中更新枝杈精灵 105
4.6.3 绘制枝杈 107
4.6.4 移动枝杈 107
4.7 本章小结 109
4.8 常见问题 110
第5章 碰撞、音效及终止条件:让游戏能玩起来 111
5.1 准备玩家和其他精灵 111
5.2 绘制玩家和其他精灵 112
5.3 处理玩家输入 113
5.3.1 开始新游戏的处理方式 114
5.3.2 检测玩家砍树 115
5.3.3 检测按键释放 118
5.3.4 让砍下的木料以及斧头动起来 119
5.4 处理死亡 121
5.5 简单音效 123
5.5.1 SFML声音的工作原理 123
5.5.2 何时播放声音 123
5.5.3 添加音频代码 124
5.6 改进游戏代码 127
5.7 本章小结 128
5.8 常见问题 129
第6章 面向对象编程—— 开启Pong游戏 131
6.1 面向对象编程 131
6.1.1 封装 132
6.1.2 多态 132
6.1.3 继承 133
6.1.4 使用OOP的理由 133
6.1.5 类的基本概念 134
6.2 Pong球拍理论 134
6.2.1 声明类、变量与函数 134
6.2.2 类函数定义 137
6.2.3 使用类的实例 138
6.3 创建Pong项目 139
6.4 编写Bat类 140
6.4.1 编写Bat.h 140
6.4.2 构造函数 141
6.4.3 继续解释Bat.h 142
6.4.4 编写Bat.cpp 142
6.5 使用Bat类,并编写main函数 145
6.6 本章小结 148
6.7 常见问题 149
第7章 AABB碰撞检测与物理学——完成Pong游戏 151
7.1 编写Ball类 151
7.2 使用Ball类 154
7.3 碰撞检测与计分 155
7.4 运行游戏 158
7.5 学习C++宇宙飞船运算符 158
7.6 本章小结 159
7.7 常见问题 159
第8章 SFML View类—— 开启僵尸射手游戏 161
8.1 规划并启动Zombie Arena游戏 161
8.1.1 创建新项目 163
8.1.2 项目素材 164
8.1.3 探索项目素材 164
8.1.4 向项目添加素材 165
8.2 OOP与Zombie Arena项目 165
8.3 构建玩家类 166
8.3.1 编写Player类的头文件 167
8.3.2 编写Player类函数的定义 170
8.4 通过SFML View类控制游戏摄像机 178
8.5 启动Zombie Arena游戏引擎 179
8.6 管理代码文件 182
8.7 开始编码游戏主循环 184
8.8 本章小结 191
8.9 常见问题 191
第9章 C++引用、精灵表单与顶点数组 193
9.1 理解C++引用 193
9.2 SFML顶点数组及精灵表单 196
9.3 顶点数组的概念 197
9.3.1 利用图元构建背景图 198
9.3.2 构建顶点数组 198
9.3.3 使用顶点数组进行绘制 199
9.4 随机创建可滚动的背景图 200
9.5 使用背景图 204
9.6 本章小结 206
9.7 常见问题 206
第10章 指针、标准模板库与纹理管理初探 209
10.1 学习指针 209
10.1.1 指针语法 210
10.1.2 指针声明 210
10.1.3 指针初始化 211
10.1.4 指针重新始化 212
10.1.5 指针解引用 212
10.1.6 指针功能多样且效果强大 213
10.1.7 指针与数组 216
10.1.8 指针总结 216
10.2 学习标准模板库 217
10.2.1 vector的概念 218
10.2.2 map的概念 219
10.2.3 关键字auto 221
10.2.4 STL总结 222
10.3 本章小结 222
10.4 常见问题 222
第11章 编写TextureHolder类并构建僵尸群 223
11.1 实现TextureHolder类 223
11.1.1 编写TextureHolder类的头文件 223
11.1.2 定义TextureHolder成员函数 225
11.1.3 TextureHolder类真正的实现效果 226
11.2 构建僵尸群 226
11.2.1 编写Zombie.h 226
11.2.2 编写Zombie.cpp文件 228
11.2.3 使用Zombie类构建僵尸群 232
11.2.4 让僵尸群活过来(或者复活) 235
11.3 使用TextureHolder类管理所有纹理 239
11.3.1 修改获取背景纹理的方法 239
11.3.2 修改Player类获取纹理的方法 239
11.4 本章小结 240
11.5 常见问题 240
第12章 碰撞检测、拾取包与子弹 241
12.1 编写代表子弹的Bullet类 241
12.1.1 编写头文件Bullet.h 242
12.1.2 编写Bullet源代码文件 243
12.1.3 编写shoot函数 244
12.1.4 Bullet类的更多函数 247
12.1.5 Bullet类的update函数 247
12.2 让子弹飞起来 248
12.2.1 Bullet类的include指令 248
12.2.2 控制变量和子弹数组 248
12.2.3 为枪械重新装弹 249
12.2.4 射击 250
12.2.5 在每帧画面中更新子弹 251
12.2.6 在每帧画面中绘制子弹 252
12.2.7 为玩家提供准星 253
12.3 编写拾取包类 255
12.3.1 编写头文件Pickup.h 256
12.3.2 编写Pickup类各成员函数的定义 258
12.4 使用Pickup类 262
12.5 碰撞检测 264
12.5.1 僵尸与子弹之间的碰撞检测 265
12.5.2 玩家与僵尸的碰撞检测 267
12.5.3 玩家与拾取包的碰撞检测 268
12.6 本章小结 269
12.7 常见问题 269
第13章 借助分层视图实现HUD 271
13.1 添加所有Text对象与HUD对象 271
13.2 更新HUD 274
13.3 绘制HUD、主屏幕与升级屏幕 275
13.4 本章小结 279
第14章 音效、文件I/O操作与完成游戏 281
14.1 保存并载入高分纪录 281
14.2 准备音效 283
14.3 允许玩家升级以及新建一波僵尸 284
14.4 重新开始游戏 286
14.5 播放其余音效 287
14.5.1 在玩家装弹时添加音效 287
14.5.2 制作射击音效 287
14.5.3 在玩家被僵尸攻击时播放音效 288
14.5.4 在捡到拾取包时播放音效 288
14.5.5 制作击中僵尸时的啪嗒声 289
14.6 本章小结 290
14.7 常见问题 290
第15章 Run! 291
15.1 关于本游戏 292
15.2 新建项目 294
15.3 编写main函数 295
15.4 处理输入 299
15.5 编写Factory类 303
15.6 高级OOP:继承与多态 304
15.6.1 继承 304
15.6.2 扩展一个类 304
15.6.3 多态 306
15.6.4 抽象类:虚函数和纯虚函数 307
15.7 设计模式 308
15.8 实体组件系统 309
15.8.1 多种类型的对象难以管理的原因 309
15.8.2 使用泛型的GameObject类改进代码结构 309
15.8.3 组合优于继承 310
15.8.4 工厂模式 311
15.8.5 C++智能指针 313
15.8.6 转换智能指针 315
15.9 编写游戏对象 316
15.9.1 编写GameObject类 316
15.9.2 编写Component类 318
15.9.3 编写Graphics类 319
15.9.4 编写Update类 320
15.9.5 运行代码 321
15.9.6 下一步的工作 321
15.10 本章小结 321
第16章 声音、游戏逻辑、对象间通信与玩家 323
16.1 编写SoundEngine类 323
16.2 编写游戏逻辑 326
16.3 编写玩家类(初版) 335
16.3.1 编写PlayerUpdate类 335
16.3.2 编写PlayerGraphics类 338
16.4 编写工厂类以使用所有新类型 342
16.5 运行游戏 344
16.6 本章小结 346
第17章 图像、摄像机与动作 347
17.1 摄像机、draw函数调用与SFML View类 347
17.2 编写摄像机相关类 348
17.2.1 编写CameraUpdate类 348
17.2.2 编写CameraGraphics类(第一部分) 352
17.2.3 SFML View类 354
17.2.4 编写CameraGraphics类(第二部分) 355
17.3 为游戏添加摄像机实例 359
17.4 运行游戏 361
17.5 本章小结 362
第18章 编写平台、玩家动画与控制机制 363
18.1 实现平台 363
18.1.1 编写PlatformUpdate类 363
18.1.2 编写PlatformGraphics类 367
18.1.3 在工厂中创建平台 369
18.2 运行游戏 370
18.3 为玩家添加新功能 371
18.4 运行游戏 375
18.5 编写Animator类 376
18.6 编写玩家动画 378
18.7 运行游戏 384
18.8 本章小结 385
第19章 创建菜单与实现下雨效果 387
19.1 构建交互式菜单 387
19.1.1 编写MenuUpdate类 388
19.1.2 编写MenuGraphics类 392
19.1.3 在工厂中构建菜单 395
19.2 运行游戏 396
19.3 实现下雨效果 397
19.3.1 编写RainGraphics类 398
19.3.2 在工厂中实现下雨效果 401
19.4 运行游戏 402
19.5 本章小结 403
第20章 火球与空间化 405
20.1 空间化的概念 405
20.2 利用SFML实现空间化 406
20.3 升级SoundEngine类 408
20.4 火球 410
20.4.1 编写FireballUpdate类 410
20.4.2 编写FireballGraphics类 415
20.4.3 在工厂中创建一些火球实例 419
20.5 运行代码 420
20.6 本章小结 421
第21章 视差背景与着色器 423
21.1 学习OpenGL、着色器与GLSL 423
21.1.1 可编程流水线与着色器 423
21.1.2 编写假想的片段着色器 424
21.1.3 编写假想的顶点着色器 425
21.2 完成CameraGraphics类 426
21.3 为游戏实现着色器 431
21.4 运行完成的游戏 431
21.5 本章小结 432
21.6 延伸阅读 432