我正在开发一款游戏。有一个“玩家”类和一个“NPC”类。
这些类的每个实例都可以有一个“目标”。该目标可以是另一个玩家或另一个NPC。我希望这个“目标”值指向播放器/ NPC选择的播放器/ NPC的实例。
所以问题是,在我目前的设置中,每个玩家/ NPC都有2个指针:
Player* target_p;
NPC* target_n;
这显然不是最佳的。我问的是,是否有办法制作一个可以指向这些类中的任何一个的指针,而不只是一个。
提前致谢。
答案 0 :(得分:3)
您可以为Player
和NPC
创建公共基类。这个基类可以有Player
和NPC
的公共字段,或者只是空(但应该有虚拟析构函数),然后你可以存储该类型的指针。
class Target
{
public:
virtual ~Target(){}
};
class Player : public Target
{
...
};
class NPC : public Target
{
...
};
答案 1 :(得分:3)
您可以创建一个Targetable
和Player
继承的基类NPC
,然后使用Targetable*
类型的指针。
答案 2 :(得分:2)
如果它们确实有一些通用接口,您可以创建基类。也许是这样的:
class Target { /* common interface, like a method both Player and NPC use */ };
class Player : public Target { ... };
class NPC : public Target { ... };
如果您没有通用界面,则不应使用此界面。然后你必须重新考虑你的设计。
答案 3 :(得分:0)
您应该通过从基类派生类Player
和NPC
来使用继承,例如GameCharacter
(其中可能来自GameObject
或者其他任何内容)。然后你可以宣布一个目标:GameCharacter* target;
答案 4 :(得分:0)
union
指向这两个类的指针。void*
reinterpret_cast
将一个类转换为另一个类类型。答案 5 :(得分:0)
我也正在编写游戏,我自己做了一些构思。
使用继承是一种好方法,但具有“可定位”基类的答案并不是最佳的。显然,“角色”和“非玩家角色”的共同点(继承)不是“可定位”属性,而是整个“角色”:(树是为了继承)
如果您考虑一下,“可定位”属性不仅限于字符。这给了我们:
当然这是一个非常粗略的概念,但你明白了。我的意思是如果你不想一次又一次地重新实现它,你最好做纸张设计。
祝你好运!