繁体   English   中英

如何复制扩展CCSprite的实例?

[英]How to copy instances of an extended CCSprite?

我打算扩展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不会复制纹理,因此,如果您对纹理进行调整,它将在所有块副本上可见,但是如果您没有纹理调整的需求,那么这对您来说应该是有效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM