什么是游戏访问其他课程的最佳方式'成员?

时间:2014-10-20 22:09:01

标签: c++ class oop game-development

我是新来的,我的Q太长了,我接受了isim的建议并缩短了Q.我只是在学习提问。感谢isim。

我也是C ++和OOP的新手,在游戏中工作,使用一些很棒的库(物理Bullet,Ogre渲染,RakNet网络等)虽然我的游戏工作正常,但我觉得做错了什么

我对每个使用的lib都有这个问题。为了简短和甜蜜,我将举例说明只使用Bullet并假设我们只有两个类(游戏和对象)

class Game
{
public:
    btDiscreteDynamicsWorld *bulletWorld;

    Game();
    ~Game();
    void UpdateWorld();
};

class Object
{
public:
    btRigidBody *body;
    Object() { bulletWorld->addRigidBody(body); };
};

这是主要的:

int main()
{
    Game myGame;
    while(1)
        myGame.UpdateWorld(); // this is THE GAME LOOP
    return 0;
}

太简单了不是吗?在这里我的问题是,如果我创建一个对象并把它放到世界上,我必须这样称呼:
bulletWorld->addRigidBody(body)
所以目前,我无法创建一个对象:
Object *myObj = new Object(); //the Object class cannot access the Game class' members
我知道我可以将* bulletWorld指针作为这样的参数传递:
Object(btDiscreteDynamicsWorld *bulletWorld);
这样我的游戏就像一个魅力。尽管如此,我觉得我有更多的lib而不仅仅是Bullet,并且对于我需要的类的每个方法,我都不会感到很自在,我必须反复传递指针作为参数。所以,如果我现在在源代码中有20,000个字符,其中10,000个是指针参数,这会让我感到不安。

这是正常的,也是最好的方式,还是有更好的方法来做我想做的事。我正在考虑使用Game类中的createObject()方法创建对象,而不是使用Object类创建它似乎将解决我的问题但是,然后,不需要其他类并在Game类中执行所有操作,它看起来不是C ++和OOP风格,看起来就像C风格。那我该怎么办?

2 个答案:

答案 0 :(得分:0)

我认为你只需要更多地思考谁对什么负责。世界对象应该负责处理世界事物,本地对象应该负责处理本地事物。如果我正在设计这个游戏,主要可能看起来像这样:

int main()
{
    Game *myGame = new Game();
    Object * enemy1 = new Object();
    Object * hero1 = new Object();
    myGame->addObject(enemy1); //This takes care of adding the object to the physics engine, since Game objects in your case are responsible for the world
    myGame->addObject(hero1); //Same as above; Game will take care of setting up hero1 in the world context
    while(1)
        myGame->UpdateWorld(); // this is THE GAME LOOP
    delete myGame;        
    return 0;
}

您的游戏addObject方法类似于:

void addObject(Object * obj)
{
    bulletWorld->addRigidBody(obj->getBody());
    ...
}

答案 1 :(得分:0)

你不需要单身,这是你的游戏,你不会多次申报你需要的课程。

只需在全球范围内使您的课程成为必需,并且(i)制作所有必需的方法public(ii)或声明允许访问的类friend

否则,使用指针也是完全有效的,哪种方式更好,因为通常依赖...但是,你应该更好地使用智能指针(在类中更详细,shared_ptr和一个{{1}在某处)更好地表明所有权关系。