如何复制扩展CCSprite的实例

How to copy instances of an extended CCSprite?

本文关键字:扩展 CCSprite 实例 复制 何复制      更新时间:2023-10-16

我计划扩展CCSprite类以创建Block类,这是我游戏的基本构建块。可能有许多"archblock"——单个块所基于的原型。特别是,我想创建一个调色板,用户可以从中选择要放置在游戏板上的构建块。一旦放在木板上,积木就有了自己的身份。

到目前为止,我拥有的是:

class Block : public CCSprite {
private:
  int _id = 0;
  int _type = 0;
public:
  Block* CopyBlock();
}

一旦用户选择了一个Block并将其放在游戏板上,就会调用CopyBlock,原型就会安全地返回到调色板中,让新铸造的Block在游戏板中过上自己的生活。

我注意到CCObject"实现"了Copy方法,但据我所知,这只是指未实现的CCObjectCopyWithZone(0)。不过,Copy方法不是虚拟的,所以我有点不确定是否能够覆盖它。(我在C++方面不是很强,但我对OOP有很好的理解,所以如果有人愿意分享的话,我愿意了解细节。)

问题:

1) 这个设计有意义吗?我应该重写Copy和/或CopyWithZone吗?

2) 如何实现CopyBlock(或Copy和/或CopyWithZone),以便将CCSprite的内容和类似_type的成员都复制到新的Block

谢谢!

除非您的块精灵包含子级。你可以很容易地创建一个复制构造函数,创建相同的精灵并复制块的属性(也许还有一些需要的精灵属性):

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