gpt4 book ai didi

c++ - 在 C++ 中为游戏对象设计类层次结构

转载 作者:行者123 更新时间:2023-11-28 00:54:59 25 4
gpt4 key购买 nike

我正在寻找有关为游戏对象设计类层次结构的一些建议。这次讨论我主要讲两个具体的类。一个ObjectSprite .

Object是游戏中任何类型对象的基类。 Sprite直接继承自 Object , 但一些 Object的公共(public)方法不再有意义。下面是一些代码来解释:

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具有渲染器、碰撞器和 Controller 三个组件。 Sprite当然有这三个组件,但使用 SpriteRenderer .我想我不想要 setRenderer为 Sprite 类公开的方法。

所以我想我应该这样写 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方法。但在这种情况下,我无法真正使用 Sprite作为Object ,例如将它传递给接受 Object 的函数

我的另一个实现是:

class Sprite : public Object {
public:
Sprite(Texture *texture) : Object(), texture(texture) {
setRenderer(new SpriteRenderer(this));
}
private:
Texture *texture;
};

它公开了 setRenderer方法。

我的思维过程是 setRenderer方法不应公开,因为 Sprite是一个 ObjectSpriteRenderer , 所以如果它被改变了,那么它就不是 Sprite .但是,我没有看到一种明显的方法来防止它发生变化。

总的来说这是我不应该担心的事情,还是有其他方法可以实现这种设计?

最佳答案

您应该问问自己:是否需要在运行时更改渲染器(和其他组件)?我相信在创建对象实例后不需要这样做。因此,我根本不会将方法 setRenderer(和其他 setXXX)放在公共(public) API 中。您是否需要公开这些参数?如果是,那么我可以提出以下建议:

.

class Object
{
public:
// Constructor with all the necessary parameters.
// For simplicity I keep only Renderer
Object(const Renderer & renderer) :
renderer_(renderer)
{
}

const Renderer & getRenderer() const { return renderer_; }

private:
// I think reference is better if Renderer MUST always be not NULL
const Renderer & renderer_;

};

这样你就有了很好的不可变类。

要构建 Sprite 实例,您可能需要 SpriteFactory 或 SpriteBuilder。

.

class Sprite : public Object
{
public:
Sprite(const Renderer & renderer, const SpriteSpecificStuff & stuff) :
Object(renderer),
...
{
}
};

class SpriteBuilder
{
public:
void setRenderer(const Renderer * renderer);
void setSpriteSpecificStuff();

std::auto_ptr<Sprite> build();
};

同样,使用构建器你将拥有漂亮的不可变类

关于c++ - 在 C++ 中为游戏对象设计类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11981473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com