【发布时间】:2021-10-29 18:54:55
【问题描述】:
假设我有一些游戏的类层次结构。像这样: PhysicalObject 是 BaseUnit 的父级 是 BaseArcher 的父级,依此类推... 每个层级都会添加自己的统计信息。
任何 PhysicalObject - 具有速度和大小。 任何 BaseUnit - 生命值。
我希望它用作枚举,所以:
enum class PhysicalObjectStats { speed, size };
enum class BaseUnitStats { hitpoints };
当然,BaseArcher 必须包含 PhysicalObject 和 BaseUnit 的统计信息。 如何制作这样的架构? 我试图以一种简单的方式实现它,只使用映射和动态多态性,但它不能编译(老实说,这是有充分理由的):
https://coliru.stacked-crooked.com/a/8496247abd3e6f41
另外,我尝试创建一个特定的 StatsHolder 类并且它可以工作,但在所有可能的用例(设置和获取值)中看起来都很糟糕。实际上,如果不进行向下转换,我就无法在课堂之外获得价值:
https://coliru.stacked-crooked.com/a/46f4f4aec6a22c57
另外,我的stats可能不止int,还有bool等一些类型。我尝试为它们使用 std::variant 并且效果很好,但我不想考虑它,使用“GetStats()”方法。所以,理想情况下我希望有这样一个界面:
std::shared_ptr<PhysicalObject> unit = std::make_shared<BaseUnit>();
unit->SetValue<int>(PhysicalObjectStats::speed);
std::cout << unit->GetValue<bool>(BaseUnitStats::HasArmor);
这让任务变得更加困难。关于如何以一种好的方式完成它的任何建议?
【问题讨论】:
-
您是否考虑过使用Entity Component System architecture?实现此功能的著名 C++ 库是 EnTT。