C++ 在游戏对象定义中放置在何处?

C++ 在游戏对象定义中放置在何处?,c++,object,C++,Object,这听起来可能是个愚蠢的问题,但我不知道还有什么别的办法可以做到 我的C++基于ASCII的RoGuiLK,我会有很多很多的对象。每个分配的、游戏中的对象都有一些共同的属性。(名称、大小、ObjectID、外观等)通常,我会为此使用静态变量,但这需要为每个对象创建一个新的类和初始值设定项。相反,我决定让每个分配的对象包含一个指向给定ObjectDef的指针,然后我可以使用它来解决这个问题。当对象具有需要实现的新功能时,我将为给定的对象类型创建一个新类 也就是说,我在哪里定义所有这些对象定义?我想把

这听起来可能是个愚蠢的问题,但我不知道还有什么别的办法可以做到

<>我的C++基于ASCII的RoGuiLK,我会有很多很多的对象。每个分配的、游戏中的对象都有一些共同的属性。(名称、大小、ObjectID、外观等)通常,我会为此使用静态变量,但这需要为每个对象创建一个新的类和初始值设定项。相反,我决定让每个分配的对象包含一个指向给定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的代码标签有什么问题吗?上帝啊,把每一行用空格缩进是很烦人的。

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

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


全局变量是不好的,因为它们在程序存在或手动处理之前一直处于活动状态。如果你有主循环,我想你有,你应该在它里面定义那些变量。

我真的认为这里有个问题

对于游戏世界中的每种对象类型(椅子、桌子、铅笔),您不一定需要新的类定义;但您应该根据对象可能具有的行为类型为每个对象类别定义一个类

例如,一只猫对一把椅子。猫可能靠自己的力量四处移动,发出噪音等。另一方面,一把椅子可能会被玩家移动,坐在里面,甚至会变成柴火或其他东西

所以,对于WorldObject,你有一个顶级的类定义,你可以从中派生出一个动物类,也许还有一个无生命类。动物类可能有狗、猫或斑马的类型枚举。而无生命类可能会根据角色可能执行的操作进一步细分

所有这些对象都将存储在一个列表中,您可以测试对象类型,以确定可以对它们执行哪些操作


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

你能更详细地描述一下吗?发布一些代码?我通常会制作一个包含“globals”的
游戏
对象。@MooingDuck我可能会这么做。名称空间是否更适合此用途?如果您有一大块代码,可以突出显示它,然后单击
{}
按钮以神奇的方式缩进所有代码。@thedaian非常感谢。那么我在哪里定义列表?我试图将对象属性与分配的对象本身分开。@roadkillguy:那没有意义。对象是属性的容器。。如果你不保留对象数据本身,那么为什么要从OOP开始呢?好吧,它们不应该在给定项目的每个实例之间更改,同时也不应该是静态的,因为我不想为每个游戏中的对象创建一个新类。对象的名称、大小、id、外观等。这类内容在分配的对象上不会更改,但会用于区分它们。这听起来确实像是您仍然缺少对象和类背后的主要思想。如果你有一个类来定义游戏中的所有对象,那么你应该为每个不同类型的对象创建该类的实例,这些对象具有不同的属性。像人类一样。那可能是课堂。从那以后,你应该定义70亿个实例,重新创造世界人口,创造各种各样的人类。这就是我计划要做的。然而,有了笔和铅笔,我为什么需要创建一个全新的类呢?因为钢笔和铅笔在我的游戏中几乎没有什么功能,所以我只想更改对象的名称。这就是为什么我有ObjectDefs。我的问题是,我应该在哪里定义这个列表?大概,“笔”和“铅笔”不需要新的类,除非它们的行为与其他无生命物体不同。一个基本的无生命类应该支持捡起、扔下、放下等等……对。如果它有新的行为,我就用新的派生函数和东西创建一个新类。我明白了。这一直是我的计划。我在哪里定义这个std::列表?@roadkillguy:作为一个全局。仍然有一些理由认为globals是好的,这就是其中之一。或者,如果您有Mooing Duck推荐的顶级“game”类,则将其放在那里
int main(){game game;return game.run();}
游戏对象就是正在运行的代码。它需要传递给任何东西。