我正在为游戏创建一个碰撞系统并拥有一系列边界体积类(AABB,OBB,18DOP等),并且他们是#34; GameObjectElement"的孩子。 (抽象类)。每个游戏对象的想法可以包含GameObjectElements的向量。
问题是如果我创建一个AABB并将其附加到GameObject现在变成了GameObjectElement。但是,为了检查碰撞,我需要它是AABB而不是GameObjectElement。
我的第一直觉是使用铸造,但在大学期间,我的讲师鄙视这一点。我已经研究了多态性,向上转换和向下转换,但不能完全拼凑出一个解决方案(尽管我认为我已经完成了所有的工作)。
如果有人可以提出解决此问题的方法,我们将非常感激。
谢谢
答案 0 :(得分:0)
如果要存储类层次结构的各种成员,通常使用指针。 (其他可能性是变体和相同大小的变色龙类)。这是因为向量需要存储相同类型和大小的元素。你需要的是在基类中进行冲突检查的纯虚函数(例如virtual bool collision(const int x, const int y) = 0
),每个后代中的虚函数的实现(例如,virtual bool collision(const int x, const int y) { return x == m_x && y==m_y; }
)并存储指向base的指针向量(例如std::vector<GameObjectElement*> v
)。然后 - 奇迹发生:) - 调用v[i]->collision(x, y)
将调用后代中的适当实现。请确保使用new
分配元素并使用delete
取消分配 - 或者只使用shared_ptr<GameObjectElement>
,如果您想在一个校准中使其变得非常简单。
答案 1 :(得分:0)
如果选择colission算法取决于两个实例的类型,那么您正在寻找 Double dispatch 机制,该机制可以使用访问者模式在c ++中实现
维基百科页面实际上有一个涵盖对象碰撞的例子:)
https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading