🎮 从零开始进行 C++ 游戏开发
游戏场景概念
-
什么是场景?
如果将要游戏程序比作是一场有玩家参与的盛大演出,那场景就是演出过程中的一幕。在不同的幕中,会有不同的剧本逻辑,也可能会有不同的角色登场,这些角色即游戏开发中常提到的GameObject
的概念。
不论是玩家、敌人还是子弹、道具等,这些从概念上讲都是GameObject
的范畴。他们接受着不同的场景剧本的指挥,进行着不同逻辑的演出。
了解了这些,我们就可以对程序的流程进行宏观的划分,游戏的主菜单是一个场景,玩家角色选择界面也是一个场景,游戏局内的逻辑也需要放置在一个单独的场景中。
所以我们就可以定义一个Scene
场景基类, 主菜单 、 角色选择 、 局内游戏 作为新类分别继承Scene
类。 -
什么是游戏主循环框架?
游戏程序的主体是一个永不停歇的死循环。在每次循环中,我们读取玩家的操作信息,并根据这些操作,处理玩家数据更新,在最后的绘图阶段将游戏画面根据这些更新后的数据渲染出来。1
2
3
4
5
6
7初始化();
while(true) {
读取操作();
处理数据();
绘制画面();
}
施放资源; -
为什么需要头文件卫士?
如果不使用头文件卫士,可能会导致出现重定义的问题。例如,我们有一个头文件A.h
,有一个头文件B.h
,头文件B.h
中使用了A.h
的内容。当我们在主函数里面使用了A.h
和B.h
的时候,使用#include
时会将头文件中的内容全部 复制 到#include
的部分。这样的话如果不加头文件卫士,就会导致重定义的问题,如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// A.h
int a;
// B.h
int b;
// main.cpp
// int b;
// 出现重定义错误
// 错误信息如下
In file included from B.h:1,
from main.cpp:2:
A.h:1:5: error: redefinition of 'int a'
1 | int a;
| ^
In file included from main.cpp:1:
A.h:1:5: note: 'int a' previously declared here
1 | int a;
| ^MSVC
编译器中,头文件卫士如下:1
1
2
3
4
游戏主循环框架概念
C++ 头文件
场景管理器
游戏程序是一个巨大的死循环,也是一个巨大的状态机。不同的游戏场景代表着不同的状态,管理着这些状态的“状态机”,在游戏开发中有一个特殊的名字——场景管理器。