- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找有关为游戏对象设计类层次结构的一些建议。这次讨论我主要讲两个具体的类。一个Object
和 Sprite
.
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
是一个 Object
用SpriteRenderer
, 所以如果它被改变了,那么它就不是 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/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!