我打算扩展CCSprite
类,以创建一个Block
类,这是我游戏的基本构建块。可能存在许多“archblocks” - 基于各个块的原型。特别是,我想创建一个调色板,用户可以从中选择要放置在游戏板上的构建块。一旦放置在板上,构建块就会拥有它自己的身份。
这是我到目前为止所拥有的:
class Block : public CCSprite {
private:
int _id = 0;
int _type = 0;
public:
Block* CopyBlock();
}
用户选择Block
并将其放在游戏板上后,将调用CopyBlock
并将原型安全地返回到调色板,留下新创建的Block
在游戏板上过着自己的生活。
我注意到CCObject
“实现了”Copy
方法,但据我所知,这只是指CopyWithZone(0)
CCObject
的{{1}}实施。 Copy
方法不是虚拟的,所以我有点不确定我是否能够覆盖它。 (我在C ++方面并不是非常强大,但我对OOP有很好的把握,所以如果有人愿意分享,我会抓住细节。)
问题:
1)这种设计有意义吗?我应该选择覆盖Copy
和/或CopyWithZone
吗?
2)我如何实施CopyBlock
(或Copy
和/或CopyWithZone
),以便将CCSprite
内容和_type
等成员复制到新的Block
?
谢谢!
答案 0 :(得分:1)
除非您的块精灵包含子项。您可以轻松地创建一个复制构造函数,创建相同的精灵并自己复制块的属性(可能还有一些所需的精灵属性):
class Block : public CCSprite {
private:
int _id = 0;
int _type = 0;
public:
Block (Block &otherBlock);
}
实施档案:
Block::Block (Block &otherBlock) {
this->initWithTexture(otherBlock.getTexture());
// If your sprite contains children then this is the place to iterate all children
// sprites, create and add them to this block. (do not forget to copy their position as well.)
this->_id = otherBlock._id;
this->_type = otherBlock._type;
}
请注意,由于initWithTexture
不会复制纹理,如果您调整纹理,它将在所有块的副本上可见,但如果您没有纹理调整需求,那么这应该适合您。