我正在协助一个反编译视频游戏的项目。
游戏有设置事件摄像机的功能:
SetActiveCam(LevelIds level, int16_t cam)
“LevelIds”只是一个具有 int16_t 值的枚举类(从 0 到 15 的完整集合)。
我想对摄像头 ID 执行类似的操作:
SetActiveCam(LevelIds level, CameraIds cam)
但是,凸轮 ID 值与上下文相关,具体取决于级别。
例如,CamID #2 可能是“菜单”级别中的选项菜单,但完全是“森林”级别中的其他内容。
下面我创建了一个 CameraIds union ,其中包含枚举中命名的所有“菜单”摄像头:
union CameraIds
{
enum class Menu : int16_t
{
eMainMenu_1 = 1,
eOptions_2 = 2,
eGamespeakGamepad_3 = 3,
eMotions_4 = 4,
eSound_5 = 5,
eLoad_6 = 6,
eMotionsGamespeakGamepad_7 = 7,
eCopyright_10 = 10,
eLoading_21 = 21,
eFmvSelect_30 = 30,
eLvlSelect_31 = 31,
eGamespeakKeyboard_33 = 33,
eMotionsGamespeakKeyboard_37 = 37,
eController_40 = 40,
eControllerConfig_41 = 41
} menu;
enum class Forest : int16_t
{
eForestStart_1 = 1,
eForestSecretScreen_23 = 23
} forest;
int16_t raw;
};
但是,下面的函数调用...
SetActiveCam(LevelIds::eMenu_0, CameraIds::Menu::eOptions_2);
导致以下错误消息:
No suitable constructor exists to convert from "CameraIds::Menu" to "CameraIds"
有什么想法吗?
这个想法是通过为其中一些相机 ID 提供适当的名称来减少魔数(Magic Number)。
“CameraIds::LEVEL::SCREEN”格式是我非常喜欢的一种格式 - 但我在使其工作时遇到了麻烦...
我是否遗漏了一些明显的东西?选角可能是这样……但这是好的做法吗?
编辑:添加了另一个枚举以减轻一些困惑。
最佳答案
您只想传递枚举,但您的参数类型是整个 union 。您需要将第二个参数类型从 CameraIDs 更改为 CameraIDs::Menu。
关于c++ - 将 union 枚举传递到 C++ 中的函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67616251/