3

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

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

初始化GameObject时,我将精灵添加GameObject为其子对象,如下所示:

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

这样可以GameObject改变 节点GameObject这意味着每个精灵有一个额外的绘图调用”

为了解决性能问题,在阅读了这篇文章之后,我决定在初始化时将GameObject's sprites 添加到GameplayLayer's中,如下所示: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 =...

这是一个乏味的变化,我失去了将我的设计GameObject为精灵组合的最大好处之一。

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

4

1 回答 1

1

首先,“主要表现”是相对的。如果这是您唯一的精灵,您将看不到精灵对它们进行批处理的任何效果。如果您同时在屏幕上显示数十个,那就另当别论了。

您不能同时向两个父节点添加节点。

您可以做的是创建一个“容器”精灵。创建一个带有纹理的 CCSprite(与精灵批处理节点纹理相同)和一个 CGRectEmpty 作为纹理矩形。这使得精灵不绘制任何东西,您可以将它当作添加到 CCSpriteBatchNode 的 CCNode 来使用。

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

于 2012-12-03T09:25:43.953 回答