我正在寻找一些关于为游戏对象设计类层次结构的建议。对于这个讨论,我将主要讨论两个特定的类。一个Object和Sprite。
是游戏中任何类型对象的Object基类。Sprite直接继承自Object,但某些Object公共方法不再有意义。这里有一些代码来解释:
class Object {
public:
Object() : renderer(NULL), controller(NULL), collider(NULL) { }
virtual ~Object();
Renderer *getRenderer() const;
Controller *getController() const;
Collider *getCollider() const;
void setRenderer(Renderer *renderer);
void setController(Controller *controller);
void setCollider(Collider *collider);
private:
Renderer *renderer;
Controller *controller;
Collider *collider;
};
Object具有渲染器、碰撞器和控制器三个组件。 Sprite当然有这三个组件,但使用一个SpriteRenderer. 然后我想我不希望setRenderer为 sprite 类公开该方法。
所以我认为我应该编写精灵类如下:
class Sprite : protected Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
Renderer *getRenderer() const;
Controller *getController() const;
Collider *getCollider() const;
void setController(Controller *controller);
void setCollider(Collider *collider);
private:
Texture *texture;
};
getter 和 setter 只调用相关的Object方法。但在这种情况下,我不能真正使用Spriteas an Object,例如将它传递给一个接受 s 的函数Object。
我的另一个实现是:
class Sprite : public Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
private:
Texture *texture;
};
这暴露了setRenderer方法。
我的思考过程是,setRenderer方法不应该暴露,因为 aSprite是Object带有 a 的SpriteRenderer,所以如果它被改变了,那么它就不是 a Sprite。但是,我没有看到一种明显的方法来防止它发生变化。
一般来说,这是我不应该担心的事情,还是有另一种方法可以进行这种设计?