图书目录

目    录

第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