1

我计划扩展CCSprite该类以创建一个Block类,这是我的游戏的基本构建块。可能有许多“archblocks”——各个块将基于的原型。特别是,我想创建一个调色板,用户可以从中挑选要放置在游戏板上的积木。一旦放置在板上,构建块就会具有自己的身份。

这是我到目前为止所拥有的:

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

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

我注意到CCObject“实现”了一种Copy方法,但据我所知,这只是指未实现的CopyWithZone(0)for 。CCObject不过,该Copy方法不是虚拟的,所以我有点不确定我是否能够覆盖它。(我在 C++ 方面不是特别强,但我确实对 OOP 有很好的掌握,所以如果有人愿意分享,我很乐意提供细节。)

问题:

1)这个设计有意义吗?我应该使用覆盖Copy和/或CopyWithZone代替吗?

2)我如何实现CopyBlock(或Copy和/或CopyWithZone)以便将CCSprite东西和成员_type都复制到新的Block

谢谢!

4

1 回答 1

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

于 2013-07-27T07:14:51.737 回答