gpt4 book ai didi

c++ - OOP 设计播放器和 AI 控制单元。动态 Actor ?

转载 作者:行者123 更新时间:2023-11-28 06:44:31 25 4
gpt4 key购买 nike

假设我有一个 Actor 类型,它可以是我游戏关卡上的任何可放置对象。我还有 Unit,它是 Actor 的子类。单位可以是玩家或 AI 控制的英雄。

而且 Unit 还有 2 个子类:Player(玩家)和 Hero(AI 控制的单位)。在 Unit 类中,将有 Player 和 Hero 都需要的移动信息、旋转和其他常规设置。在子类中,AI 将具有与玩家不同且更多的功能。

现在我面临着以下问题:

函数只接受 Actor 作为参数(例如 OnOverlap(Actor a*))但是 OnOverlap() 应该只在它是一个 Unit 类(英雄或玩家)时做一些事情。因此,我需要 C++ 中来自 Java 的 instanceof() 之类的东西。

解决方法是使用 dynamic_cast,但我不确定这是否是提高性能的好主意。或者使用virtual,但是当Hero的功能比Player多时,这就不行了。

或者我应该尝试全新的 OOP 设计?

最佳答案

我会说 dynamic_castcode smell .本身不一定是坏的,而是表明您的设计可能出现问题的迹象。

OOP 中的一个重要概念是多态性:对象的行为根据其类型而不同,并且此行为是封装的,隐藏在接口(interface)之后。如果您明确地检查对象的类型以更改您想要应用到它的逻辑,那么您就违反了多态性。

现在虚拟方法也不是那么好,它们确实会产生运行时成本,有时会给表带来太多的复杂性。 C++ 使 virtual 方法成为异常(exception),而不是默认方法,我相信正是出于这些原因。

有一件事你应该知道,虚方法只是多态的一种,叫做动态多态。还有另一种方法可以根据对运行时阻碍较小的类型获得不同的行为:静态多态性,AKA template metaprogramming .但这在复杂性方面并没有真正帮助。

在这种情况下,您真正​​应该做的是分别处理不同的事情。您可能希望在 Units 上使用此 OnOverlap() 方法是有原因的:假设您只对 Units 进行碰撞检查,而不是所有 Actor。然后维护一个单独的 Units 列表,并在 Unit 类上使用非虚拟的 OnOverlap() 方法。以这种方式思考通常是关键。

关于c++ - OOP 设计播放器和 AI 控制单元。动态 Actor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25253386/

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