0

我在做一个游戏项目,我的队友有一定的方法来解决我们的参考问题,而且效果很好,只是当游戏很大时,我们最终会得到大量的构造函数。

class Player
{
   private:
      Weapon *w1, *w2, *w3;
      Armor *a1, *a2;

  public:
      Player(Weapon *w1, Weapon *w2, ...) : w1(w1), w2(w2), ...;
}

然后我的构造函数is Player(w1, w2, w3, ...);令人不安,如果播放器类有 100 个引用怎么办?

有没有办法让这个语法更简单,还是我们做错了?有没有更好的方法来引用播放器类之外的变量?

重要 以上纯属示例,写得不好。我不只是有武器和盔甲。我有很多课。我有一个开发者控制台参考,我有盔甲参考,项目,我有对调试类、记录器类的参考,并且列表还在继续。矢量对我没有帮助。对不起这个可怜的例子。

4

3 回答 3

1

为什么不使用vectors

std::vector<Weapon *> W;
std::vector<Armor *> A;
于 2013-07-27T14:39:32.230 回答
1

如果您使用继承,您确实可以将它们全部放在一个向量中。

对于一个幻想主题的游戏(我假设你正在编写)它可能是这样的:

// The base object, contains common attributes
class Object { ... };

// The item class
class Item : public Object { ... };

class Weapon : public Item { ... };

class Sword : public Weapon { ... };

class Clothing : public Item { ... }

class Armour : public Clothing { ... };

那么对于所有设备,一个向量就足够了:

std::vector<std::shared_ptr<Item>> inventory;

对于磨损的东西,你可以有单独的变量,比如

std::shared_ptr<Weapon> wielded;
std::shared_ptr<Clothing> head;  // Helmets, hats, etc.

或者为装备的东西使用地图:

std::unordered_map<std::string, std::shared_ptr<Item>> equipped;

然后你可以使用例如

equipped["wielded"]

获得持有的物品。


为了完整起见,上面类树中的一些其他可能的类可能是:

class Character : public Object { ... }

class Player : public Character { ... }

class Monster : public Character { ... }

class Dragon : public Monster { ... }

class RedDragon : public Dragon { ... }

class TheUltimateBossDragon : public RedDragon { ... }

附带说明一下,我以前在自己的游戏中使用过像上面这样的层次结构。然而,在我的下一场比赛中(当走到那一步时)我可能会使用另一种模式,其中类表示行为。例如, a swordis equipable, it's a damage_inflicter, it'stakeable等。这意味着更复杂的继承层次结构,具有更多的多重继承,并且可能会更多地使用 RTTI。但从好的方面来说,它有望更加灵活。

于 2013-07-27T14:54:48.200 回答
0

尝试使用向量,而不是使用固定数量的指向少数类型的指针:

class Player
{
   private:
      std::vector<Weapon*> weapons;
      std::vector<Armor*> armors;

  public:
      Player(const std::vector<Weapon*>&, const std::vector<Armor*>&);
}
于 2013-07-27T14:40:05.960 回答