CppGamingDEV_PVZ_BASE_EASYX

🎮 从零开始进行 C++ 游戏开发

[TOC]

游戏场景概念

  • 什么是场景?
    如果将要游戏程序比作是一场有玩家参与的盛大演出,那场景就是演出过程中的一幕。在不同的幕中,会有不同的剧本逻辑,也可能会有不同的角色登场,这些角色即游戏开发中常提到的 GameObject 的概念。
    不论是玩家、敌人还是子弹、道具等,这些从概念上讲都是 GameObject 的范畴。他们接受着不同的场景剧本的指挥,进行着不同逻辑的演出。
    了解了这些,我们就可以对程序的流程进行宏观的划分,游戏的主菜单是一个场景,玩家角色选择界面也是一个场景,游戏局内的逻辑也需要放置在一个单独的场景中。
    所以我们就可以定义一个 Scene 场景基类,主菜单角色选择局内游戏 作为新类分别继承 Scene 类。

游戏主循环框架概念

  • 什么是游戏主循环框架?
    游戏程序的主体是一个永不停歇的死循环。在每次循环中,我们读取玩家的操作信息,并根据这些操作,处理玩家数据更新,在最后的绘图阶段将游戏画面根据这些更新后的数据渲染出来。
    1
    2
    3
    4
    5
    6
    7
    初始化();
    while(true) {
    读取操作();
    处理数据();
    绘制画面();
    }
    施放资源;

C++ 头文件

  • 为什么需要头文件卫士?
    如果不使用头文件卫士,可能会导致出现重定义的问题。例如,我们有一个头文件 A.h ,有一个头文件 B.h,头文件 B.h 中使用了 A.h 的内容。当我们在主函数里面使用了 A.hB.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
    #include "A.h"
    int b;

    // main.cpp
    #include "A.h" // int a;
    #include "B.h" // int a;
    // 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
    #pragma once
    在其他的一些编译器中,常写为这样:
    1
    2
    3
    4
    #ifndef __HEADER_H__
    #define __HEADER_H__

    #endif

场景管理器

游戏程序是一个巨大的死循环,也是一个巨大的状态机。不同的游戏场景代表着不同的状态,管理着这些状态的“状态机”,在游戏开发中有一个特殊的名字——场景管理器。