如何复制扩展CCSprite的实例?

时间:2013-07-27 06:47:58

标签: c++ class cocos2d-x extend

我打算扩展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

谢谢!

1 个答案:

答案 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不会复制纹理,如果您调整纹理,它将在所有块的副本上可见,但如果您没有纹理调整需求,那么这应该适合您。

相关问题