我是新来的,我的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风格。那我该怎么办?
答案 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}在某处)更好地表明所有权关系。