0

我正在开发一个音乐符号应用程序,它有一个音乐人员类(CCNode)和一个音符类(CCSprite)。

音符被添加到音乐人员中,例如:

// MusicStaff.m
[self addChild:note];

笔记有一个粒子发射器,这需要添加到父级。我认为做类似的事情:

// Note.m
[self.musicStaff addChild:self.emitter];

不是很酷,因为我不喜欢用笔记控制五线谱的想法——我喜欢把五线谱看作是控制它所拥有的孩子的人。

老实说,我觉得这个粒子发射器应该是 Note 的子代,因为从技术上讲,它是音符的一部分,而不是乐谱的一部分——所以将它添加到乐谱本身就感觉不对。但是,根据我对 cocos2d 的了解,虽然您可以将子元素添加到 CCSprite,但精灵不管理其子元素的绘制,因此该粒子发射器将不可见。

也就是说,据我所知,唯一的方法是将发射器添加到工作人员中,我更愿意这样做:

// MusicStaff.m
[self addChild:note];
[self addChild:note.emitter];

但是,我项目中的一个团队成员认为这是“倒退”和“愚蠢”,并且注释应该将发射器直接添加到其父级。我只是寻求一些反馈,看看我对此的想法是否确实“落后”和“愚蠢”,或者我是否有一个有效的观点......</p>

我也很好奇是否有另一种方法来解决这个问题,比如将发射器直接添加到音符并让它以某种方式绘制它的孩子?

4

2 回答 2

0

您可以将粒子添加为精灵的子对象,然后它们将被绘制。任何资源让您认为未绘制子节点都是错误的。

我认为您可能误解了精灵批处理的问题。在这种情况下,当您使用 CCSpriteBatchNode 时,您只能将 CCSprite 对象添加到批处理节点和批处理节点的子节点。因此,在这种情况下,尝试添加粒子效果或任何其他节点作为 sprite-batched sprite 的子节点将导致 cocos2d 中的断言告诉您这是非法的。

至于“愚蠢的问题”:这两个选项都不是真的愚蠢,但是将发射器添加到父级有一个小好处,因为音符可以控制音符固有的责任:管理音符的粒子效果的生命周期。

于 2012-09-26T12:11:31.650 回答
0

在面向对象的设计方面,如果 Emitter 是由其父 Note 创建的,我认为它不应该将自己添加到 Staff 中。如果有人必须与工作人员交谈,那就让它成为它的直接孩子,即笔记。更好的是,让 Note 回应员工提出的问题,这样最终员工就能控制它想要显示的内容。

于 2012-09-26T07:33:05.277 回答