gpt4 book ai didi

c++ - 在 RTS 游戏中处理 'units' - C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:58 24 4
gpt4 key购买 nike

我目前正在用 C++ 制作一个简单的 RTS 风格游戏。

我想知道的是如何处理游戏中新单位的创建(即从兵营中创建海军陆战队员)。我将如何存储这些单位?

我正在考虑拥有一个类“单位”,然后由特定单位类型(即海军陆战队、消防员等)继承,但如果我为这些(即海军陆战队 myMarines[20])创建一个数组,它将为这些单位设置一个硬性上限。

如何创建这样一个可以随意扩展的数组?谢谢!

最佳答案

标准库提供了它们 std::vector动态调整大小数组的模板。 std::vector<Marine>将是 Marines myMarines[20] 最直接的替代方案.

但是,您可能不希望每个单位类型都有一个单独的列表。您很可能希望将所有单元存储在同一个列表中,而不管它们的类型。 std::vector<Unit>听起来像是显而易见的解决方案,但事实并非如此。问题是 std::vector按值存储对象。以下将无法正常工作:

std::vector<Unit> v;
v.push_back(Marine("John Doe"));

问题是 Marine对象将被复制到 Unit对象,这是 vector 存储的内容。这种复制会产生一个所谓的 slicing。 : 所有 Marine 特定成员都将丢失,只有那些存在于 Unit 中的成员将被存储。

此问题的一个解决方案是将指针存储在 vector 中,因为复制指针不会更改它们指向的对象。但这会带来其他问题。要存储指针,这意味着您需要动态分配对象。这意味着现在您有责任手动销毁这些对象。这是一项繁琐且容易出错的任务。

解决方案是将自动销毁动态分配对象的 vector 对象存储在 vector 中,而不是指针。这些对象称为智能指针。标准库中最简单的一个是 std::unique_ptr .

std::vector<std::unique_ptr<Unit>> v;
v.emplace_back(new Marine("John Doe"));

这是 C++11 的特性。如果您的编译器不支持它,您可以找到 alternatives in the Boost libraries . Boost 甚至包括一个容器,其行为非常类似于 std::vector。的 std::unique_ptr小号: boost::ptr_vector .那将是另一种选择。

关于c++ - 在 RTS 游戏中处理 'units' - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9528468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com