在游戏对象定义中放置哪里?

时间:2011-11-28 20:41:35

标签: c++ object

这可能听起来像是一个愚蠢的问题,但我不确定如何做到这一点。

在我的基于c ++ ASCII的roguelike中,我将拥有大量的对象。每个分配的游戏内对象都有一些共同的属性。 (名称,大小,ObjectID,外观等)通常,我会为此使用静态变量,但这需要为每个Object创建一个新类和初始化器。相反,我已经决定让每个分配的对象包含一个指向给定ObjectDef的指针,然后我可以使用它来解决这个问题。当对象具有需要实现的新功能时,我将为给定的类型对象创建一个新类。

那就是说,我在哪里定义所有这些对象定义?我想把它们放在数组中,但我知道全局变量是坏的,坏的,坏的。

一些一般提示会很棒。感谢。

class WorldObjectDef //WHAT WE HAVE A LIST OF
{
  protected:

    std::string m_name;
    float m_size;

    int m_type;
    int m_id;
    AsciiNode m_node;

  public:

    WorldObjectDef(std::string, float, int, int, const AsciiNode &);

    int getId() const;
    std::string getName() const;
    float getSize() const;
    AsciiNode getNode() const;
};

class WorldObject //WHAT'S ALLOCATED IN A LEVEL
{
    WorldObjectDef * m_def;

  public:

    WorldObject(const WorldObjectDef &);

    int getId() const;
    std::string getName() const;
    float getSize() const;
    AsciiNode getNode() const;
};

我一直想知道:类似html的代码标签有什么问题吗?对于每一行的空间缩进,上帝很烦人。

2 个答案:

答案 0 :(得分:1)

我经常创建List<>它包含所有活动对象(即,游戏中和正在使用的对象),可用于在一个循环中操作所有数据。 该列表可以在任何地方定义,其可见性很高。如果它需要是全球性的,那就这样吧。最好让代码工作,而不是考虑它是否以最大fps运行。

不要使用全局和结果是我记得要读到的第一个警告。我并不是说你应该忽略这些警告,而是要理解为什么大规模使用em是不好的做法。

Globals很糟糕,因为它们会一直存在直到程序存在,或者手动处理。如果你有主循环,我认为你有,你应该在其中定义这些变量。

答案 1 :(得分:1)

我真的觉得这里有问题。

您不一定需要为游戏世界中的每种对象类型设置新的类定义(椅子,桌子,铅笔);但是你应该根据对象可以拥有的行为类型为每个对象类别定义一个类。

例如,猫与主席。一只猫可能会在它自己的力量,发出噪音等情况下四处移动。另一方面,一把椅子可能被玩家移动,坐在里面,甚至变成木柴等等。

因此,您将拥有WorldObject的顶级类定义,您可以从中派生Animal类,也可以使用InanimateClass。 Animal类可能具有Dog,Cat或Zebra的类型枚举。虽然InanimateClass可能会进一步细分,具体取决于角色可能采取的操作。

所有这些对象都将存储在List中,您可以测试对象类型以确定可以对它们执行的操作。

通过这种方式,您可以将对象的属性与对象实例本身保持在一起,从而为自己节省大量工作。