C++游戏编程入门(零基础学C++) 说明
# C++游戏编程入门(零基础学C++) 说明
# 翻译说明
如果你连C++基础语法都不熟悉,并且想学习C++,或者想学习游戏开发,那么本专栏特别适合你。
本专栏适合没有任何C++语言基础的同学,也适合其他编程语言想往C++语言转的读者。
在这个专栏中,我们将使用C++开发4个流行的小游戏。
本专栏翻译自《Beginning C++ Game Programming——Learn C++ from scratch by building fun games》(第三版)。
限于水平有限,若发现翻译有不当之处。欢迎交流。
# 目录
第1章:欢迎阅读《C++游戏编程入门(第三版)》
- 我们将制作的游戏
- 《木材!!!》
- 《乒乓》
- 《僵尸竞技场》
- 平台游戏
- 为何在2024年应使用C++学习游戏编程
- SFML库
- 微软Visual Studio
- Mac和Linux系统呢?
- 安装Visual Studio 2022
- 设置SFML
- 在Visual Studio 2022中创建新项目
- 配置项目属性
- 规划Timber!!!
- 项目资源
- 制作自己的音效
- 将资源添加到项目中
- 探索资源
- 理解屏幕坐标和内部坐标
- 开始编写游戏代码
- 用注释让代码更清晰
- 主函数
- 代码呈现与语法
- 从函数返回值
- 运行游戏
- 使用SFML打开窗口
- 引入SFML的功能
- 面向对象编程、类和对象
- 使用命名空间sf
- SFML的VideoMode和RenderWindow
- 运行游戏
- 游戏循环
- while循环
- C风格的代码注释
- 输入、更新、绘制、重复
- 检测按键
- 清除并绘制场景
- 运行游戏
- 绘制游戏背景
- 使用纹理准备精灵
- 对背景精灵进行双缓冲处理
- 运行游戏
- 处理错误
- 配置错误
- 编译错误
- 链接错误
- 程序bug
- 总结
- 常见问题解答
- 我们将制作的游戏
第2章:变量、运算符和判断:为精灵制作动画
全面学习C++变量
- 变量类型
- 用户定义类型
声明和初始化变量
声明变量
初始化变量
一步完成声明和初始化
常量
统一初始化
声明和初始化用户定义类型
操作变量
- C++算术运算符和赋值运算符
- 用表达式实现功能
- 赋值
- 自增和自减
添加云朵、嗡嗡叫的蜜蜂和一棵树
- 准备树
- 准备蜜蜂
- 准备云朵
- 绘制树、蜜蜂和云朵
随机数
- 在C++中生成随机数
使用if和else进行判断
- 逻辑运算符
- C++中的
if
和else
- 如果他们过桥,就射击!
- 否则执行其他操作
- 读者挑战
计时
- 帧率问题
- SFML的帧率解决方案
移动云朵和蜜蜂
- 让蜜蜂动起来
- 飘动的云朵
总结
常见问题
第3章:C++字符串、SFML时间:玩家输入与平视显示器
- 暂停和重新开始游戏
- C++字符串
- 声明字符串
- 给字符串赋值
- 字符串拼接
- 获取字符串长度
- 用StringStream以另一种方式操作字符串
- SFML文本和字体
- 添加分数和消息
- 添加时间条
- 总结
- 常见问题
第4章:循环、数组、switch语句、枚举和函数:实现游戏机制
- 循环
while
循环- 跳出循环
for
循环
- 数组
- 声明数组
- 初始化数组元素
- 快速初始化数组元素
- 这些数组对我们的游戏有什么实际作用?
- 用switch语句进行判断
- 枚举
- 函数入门
- 谁设计了这些奇怪又让人抓狂的语法?为什么是这样的?
- 函数返回类型
- 函数名
- 函数参数
- 函数体
- 函数原型
- 组织函数
- 函数作用域
- 关于函数的最后一点说明(目前为止)
- 生成树枝
- 准备树枝
- 每一帧更新树枝精灵
- 绘制树枝
- 移动树枝
- 总结
- 常见问题
- 循环
第5章:碰撞、声音和结束条件:让游戏可玩
- 准备玩家(和其他精灵)
- 绘制玩家和其他精灵
- 处理玩家输入
- 处理新游戏设置
- 检测玩家砍伐动作
- 检测按键释放
- 为砍伐的原木和斧头制作动画
- 处理死亡情况
- 简单音效
- SFML音效的工作原理
- 何时播放音效
- 添加音效代码
- 改进游戏和代码
- 总结
- 常见问题
第6章:面向对象编程 - 开始制作乒乓球游戏
- 面向对象编程
- 封装
- 多态
- 继承
- 为什么使用面向对象编程?
- 类究竟是什么?
- 乒乓球拍的理论
- 声明类、变量和函数
- 类函数定义
- 使用类的实例
- 创建乒乓球项目
- 编写
Bat
类- 编写
Bat.h
- 构造函数
- 继续解释
Bat.h
- 编写
Bat.cpp
- 编写
- 使用
Bat
类并编写主函数 - 总结
- 常见问题
- 面向对象编程
第7章:轴对齐包围盒碰撞检测和物理 - 完成《乒乓》游戏
- 编写
Ball
类 - 使用
Ball
类 - 碰撞检测和计分
- 运行游戏
- 学习C++的箭头运算符
- 总结
- 常见问题解答
- 编写
第8章:SFML视图 - 开始制作《僵尸射击》游戏
- 规划并开始制作《僵尸竞技场》游戏
- 创建新项目
- 项目资源
- 探索资源
- 将资源添加到项目中
- 面向对象编程与《僵尸竞技场》项目
- 构建层级 - 第一个类
- 编写Player类头文件
- 编写Player类函数定义
- 用SFML视图控制游戏相机
- 启动《僵尸竞技场》游戏引擎
- 管理代码文件
- 开始编写主游戏循环
- 总结
- 常见问题解答
- 规划并开始制作《僵尸竞技场》游戏
第9章:C++引用、精灵表和顶点数组
- 理解C++引用
- 总结引用
- SFML顶点数组和精灵表
- 什么是精灵表?
- 什么是顶点数组?
- 用图块构建背景
- 构建顶点数组
- 使用顶点数组进行绘制
- 创建随机生成的滚动背景
- 使用背景
- 总结
- 常见问题解答
- 理解C++引用
第10章:指针、标准模板库和纹理管理
- 学习指针
- 指针语法
- 声明指针
- 初始化指针
- 重新初始化指针
- 解引用指针
- 指针用途广泛且功能强大
- 动态分配内存
- 将指针传递给函数
- 声明并使用指向对象的指针
- 指针和数组
- 指针总结
- 学习标准模板库
- 什么是vector?
- 声明vector
- 向vector添加数据
- 访问vector中的数据
- 从vector中删除数据
- 检查vector的大小
- 遍历vector的元素
- 什么是map?
- 声明map
- 向map添加数据
- 在map中查找数据
- 从map中删除数据
- 检查map的大小
- 检查map中是否存在键
- 遍历map的键值对
- 什么是vector?
auto
关键字- 标准模板库总结
- 总结
- 常见问题解答
- 学习指针
第11章:编写
TextureHolder
类并创建一群僵尸- 实现
TextureHolder
类- 编写
TextureHolder
头文件 - 编写
TextureHolder
函数定义 - 我们通过
TextureHolder
类实现了什么?
- 编写
- 创建一群僵尸
- 编写
Zombie.h
文件 - 编写
Zombie.cpp
文件 - 使用
Zombie
类创建一群僵尸 - 让这群僵尸“活起来”
- 编写
- 为所有纹理使用
TextureHolder
类- 更改背景获取纹理的方式
- 更改
Player
类获取纹理的方式
- 总结
- 常见问题解答
- 实现
第12章:碰撞检测、拾取物和子弹
- 编写
Bullet
类- 编写
Bullet
头文件 - 编写
Bullet
源文件 - 编写
shoot
函数- 在
shoot
函数中计算斜率 - 在
shoot
函数中使斜率为正 - 在
shoot
函数中计算X和Y之间的比例 - 完成对
shoot
函数的讲解
- 在
- 更多子弹函数
Bullet
类的update
函数
- 编写
- 让子弹飞起来
- 包含
Bullet
类 - 控制变量和子弹数组
- 重新装填枪支
- 发射子弹
- 在每一帧更新子弹
- 在每一帧绘制子弹
- 给玩家添加准星
- 包含
- 编写拾取物类
- 编写拾取物头文件
- 编写拾取物类函数定义
- 使用拾取物类
- 检测碰撞
- 僵尸被击中了吗?
- 玩家被僵尸碰到了吗?
- 玩家碰到拾取物了吗?
- 总结
- 常见问题解答
- 编写
第13章:分层视图和实现HUD
- 添加所有文本和HUD对象
- 更新HUD
- 绘制平视显示器(HUD)、主界面和升级界面
- 总结
第14章:音效、文件输入/输出和完成游戏
- 保存和加载高分
- 准备音效
- 允许玩家升级并生成新一波敌人
- 重新开始游戏
- 播放其余音效
- 在玩家重新装填时添加音效
- 制作射击音效
- 在玩家被击中时播放音效
- 在玩家拾取物品时播放音效
- 在僵尸被击中时制作溅血音效
- 总结
- 常见问题解答
第15章:运行!
- 关于这款游戏
- 创建项目
- 编写主函数
- 处理输入
- 编写
Factory
类 - 高级面向对象编程:继承和多态
- 继承
- 扩展类
- 多态
- 抽象类:虚函数和纯虚函数
- 设计模式
- 实体组件系统模式
- 为什么管理多种不同类型的对象很困难
- 使用通用
GameObject
改善代码结构 - 优先使用组合而非继承
- 工厂模式
- C++智能指针
- shared_ptr
- unique_ptr
- 转换智能指针
- 编写
GameObject
类 - 编写
Component
类 - 编写
Graphics
类 - 编写
Update
类 - 运行代码
- 接下来做什么?
- 总结
第16章:音效、游戏逻辑、对象间通信和玩家
- 编写
SoundEngine
类 - 编写游戏逻辑
- 编写
LevelUpdate
类
- 编写
- 编写玩家相关内容:第一部分
- 编写
PlayerUpdate
类 - 编写
PlayerGraphics
类
- 编写
- 编写
Animator
类- 记住纹理坐标
- 运行游戏
- 总结
- 编写
第17章:图形、相机、动作
- 相机、绘制所有内容和SFML视图
- 编写相机类
- 编写
CameraUpdate
类 - 编写
CameraGraphics
类(第一部分) - SFML的
View
类 - 编写
CameraGraphics
类(第二部分)
- 编写
- 向游戏中添加相机实例
- 运行游戏
- 总结
第18章:编写平台、玩家动画和控制代码
- 编写平台相关代码
- 编写
PlatformUpdate
类- 编写
PlatformUpdate
类的update
函数
- 编写
- 编写
PlatformGraphics
类 - 在工厂中构建一些平台
- 编写
- 运行游戏
- 为玩家添加功能
- 编写玩家控制代码
- 运行游戏
- 编写
Animator
类 - 编写玩家动画
- 运行游戏
- 总结
- 编写平台相关代码
第19章:构建菜单并实现下雨效果
- 构建交互式菜单
- 编写
MenuUpdate
类 - 编写
MenuGraphics
类 - 在工厂类中构建菜单
- 编写
- 运行游戏
- 实现下雨效果
- 编写
RainGraphics
类 - 在工厂类中实现下雨效果
- 编写
- 运行游戏
- 总结
- 构建交互式菜单
第20章:火球和空间化
- 什么是空间化?
- 发射器、衰减和收听者
- 使用SFML处理空间化
- 升级SoundEngine类
- 火球
- 编写
FireballUpdate
类 - 编写
FireballGraphics
类- 编写
FireballGraphics.h
文件 - 编写
FireballGraphics.cpp
文件
- 编写
- 在工厂中构建一些火球
- 编写
- 运行游戏
- 总结
- 什么是空间化?
第21章:视差背景和着色器
- 学习 OpenGL、着色器和 GLSL
- 可编程管线和着色器
- 编写一个假设的片段着色器
- 编写一个假设的顶点着色器
- 完成
CameraGraphics
类的编写- 拆分新的绘制代码
- 为游戏编写着色器
- 运行完整的游戏
- 总结
- 进一步阅读
- 学习 OpenGL、着色器和 GLSL