具有组合和CCSpriteBatchNode的游戏对象继续

时间:2012-11-30 12:27:33

标签: cocos2d-iphone code-organization

有人会考虑以下场景并给我一个建议:我正在实施一个基本的cocos2d游戏,其中一个GameplayLayer有一个CCSpriteBatchNode。我有一个GameObject:CCNode,它有3个CCSprites,如下所示:

CCSprite *bodySprite;    
CCSprite *hairSprite;   
CCSprite *eyesSprite;

初始化GameObject时我会将精灵添加到GameObject,因为它的孩子就像这样:

[self addChild:bodySprite];
[self addChild:hairSprite];
[self addChild:eyesSprite];

这样我可以改变节点(GameObject)的位置,旋转等,所有精灵都会受到变化的影响但是当我遇到一个主要的性能问题时将多个GameObject添加到场景"each sprite draws itself, which means one additional draw call per sprite"

要解决性能问题,请在阅读this post后,我决定在初始化时将GameObject的精灵添加到GameplayLayer的{​​{1}},如下所示:

CCSpriteBatchNode

只有现在,我必须逐个设置 [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:bodySprite]; [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:hairSprite]; [[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:eyesSprite]; 个精灵的位置,而不是

GameObject

我必须使用

self.position = ...

这是一个乏味的变化,我失去了将bodySprite.position = ... hairSprite.position = ... eyesSprite.postion =... 设计为精灵组合的最大好处之一。

问题:有没有办法使用节点的位置来影响合成精灵位置,我可以将它们作为子项添加到GameObjectGameObject吗?如果不是正确的方法,是否一个接一个地设置精灵的位置?

1 个答案:

答案 0 :(得分:1)

首先,“主要表现”是相对的。如果这是你唯一的精灵,你将看不到sprite批处理它们的任何效果。如果你同时在屏幕上有数十个这样的话,那就不同了。

您无法同时向两个父母添加节点。

你可以做的是创建一个“容器”精灵。创建一个带有纹理的CCSprite(与sprite批处理节点纹理相同)和一个CGRectEmpty作为纹理rect。这使精灵不会绘制任何东西,你可以使用它,就好像它是一个添加到CCSpriteBatchNode的CCNode。

然后你可以将你的精灵添加到那个不可见的精灵中,并使用容器精灵来影响其子精灵的位置,旋转等,就像你以前一样。