gpt4 book ai didi

c++ - 逻辑设计模式

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:57 25 4
gpt4 key购买 nike

在游戏中,许多实体应该每一帧都更新。我正在尝试使用不同的设计模式来实现这一目标。到目前为止,我有一个单例管理器类,每个 Logic 实例都添加到该类中。但我正在考虑以下内容,即 Logic 类本身的静态列表。这很好,因为它会从项目中删除一个类。此示例中的“引擎”将是调用 update_all 的主类。

class Logic
{
public:
Logic() { all.push_back(this); }
virtual ~Logic() { all.erase(this); }
virtual void update(float deltatime) = 0;

private:
friend Engine;
static std::list<Logic*> all;
static void update_all(float deltatime)
{
for (std::list::iterator i = all.begin(); i!=all.end(); ++i)
(*i)->update(deltatime);
}
};
  • 这个图案有名字吗?
  • 您认为这是比单例管理器类更好的方法吗?
  • 还有其他意见或注意事项吗?

最佳答案

首先,您需要使用 remove() 而不是 erase()(后者需要一个迭代器作为参数)

如果你使用一个稍微不同的循环,比如

std::list<Logic*>::iterator it = all.begin();
while (it != all.end()) {
Logic* current = *it;
++it;
current->update(deltatime);
}

您甚至可以解决 siukurnin 提到的问题(在 update() 期间删除 Logic 对象)。 list::remove() 不会使迭代器失效,除了那些指向已移除元素的迭代器。

除此之外,我还赞成这是单例模式的变体。我建议将原始解决方案保留在一个单独的管理类中,以防万一您希望有两个具有不同增量时间的循环或显式多线程支持(不同线程上的不同逻辑对象)或将来的任何内容。

在我看来,这是单例类相对于静态方法(您始终可以使用静态方法)的普遍优势:如果您将来想这样做,您可以轻松地增加您的功能......

关于c++ - 逻辑设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673751/

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