2013-07-27 48 views
1

我打算扩展CCSprite课程,以创建Block课程,这是我游戏的基本构建模块。可能有许多“拱形块” - 各个块基于的原型。特别是,我想创建一个调色板,用户可以从中选择要放置在游戏板上的构建块。一旦放置在棋盘上,积木就会拥有自己的身份。如何复制扩展CCSprite的实例?

这是我到目前为止有:

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

一旦用户选择了Block并且将其在游戏板上,CopyBlock将被调用和原型安全地回到了调色板,离开新铸造Block在游戏板上过着自己的生活。

我注意到CCObject“实行”一Copy方法,但据我可以告诉这只是指为CCObject一个CopyWithZone(0)了未实现。然而,Copy方法并不是虚拟的,所以我有点不确定是否可以覆盖它。 (我不是在C超强++,但我有OOP上把握好,所以我弥补了细节,如果有人愿意分享。)

问:

1)这是否化妆设计感?我是否应该重写Copy和/或CopyWithZone而不是?

2)我如何能实现CopyBlock(或Copy和/或CopyWithZone),这样既CCSprite东西,成员一样_type被复制到新Block

谢谢!

回答

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做不复制纹理,如果你调整纹理,它将在所有块的副本上可见,但如果你没有纹理调整的需要,那么这应该为你工作。

+0

非常感谢你!这正是我需要的! :) – conciliator