我打算扩展 CCSprite
类以创建一个 Block
类,这是我游戏的基本构建 block 。可能有许多“archblocks”——各个 block 所基于的原型(prototype)。特别是,我想创建一个调色板,用户可以从中选择要放置在游戏板上的积木。一旦放置在板上,积木就会呈现出自己的身份。
这是我目前所拥有的:
class Block : public CCSprite {
private:
int _id = 0;
int _type = 0;
public:
Block* CopyBlock();
}
一旦用户选择了一个 Block
并将其放在游戏板上,CopyBlock
将被调用并且原型(prototype)被安全地返回到调色板,留下新的minted Block
在游戏板上过着自己的生活。
我注意到 CCObject
“实现”了一个 Copy
方法,但据我所知,这只是指一个 CopyWithZone(0)
用于未实现的 CCObject
。不过,Copy
方法不是虚拟的,因此我不确定是否可以覆盖它。 (我不是很擅长 C++,但我对 OOP 有很好的掌握,所以如果有人愿意分享,我会提供详细信息。)
问题:
1) 这个设计有意义吗?我应该改用覆盖 Copy
和/或 CopyWithZone
吗?
2) 如何实现 CopyBlock
(或 Copy
和/或 CopyWithZone
),以便 CCSprite
_type
之类的东西和成员被复制到新的 Block
?
谢谢!
最佳答案
除非你的 block Sprite 包含 child 。您可以轻松地创建一个复制构造函数,创建相同的 Sprite 并自己复制 block 的属性(可能还有一些需要的 Sprite 属性):
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
不会复制纹理,如果您调整纹理,它将在所有 block 拷贝上可见,但如果您没有纹理调整需求,那么这应该适合您.
关于c++ - 如何复制扩展 CCSprite 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895080/