游戏对象与组合和CCSpriteBatchNode的应用

3

我希望你能为我考虑以下情况并给出建议:我正在实现一个基本的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添加到场景中时,存在一个主要的性能问题,因为"每个精灵都会绘制自己,这意味着每个精灵增加一次绘制调用"
为了解决性能问题,在阅读this post后,我决定在初始化时将GameObject的精灵添加到GameplayLayerCCSpriteBatchNode中,如下所示:
 [[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的子项添加吗?如果不能,正确的方法是什么?一个一个地设置精灵的位置吗?
1个回答

1
首先,“主要性能”是相对的。如果这是您唯一的精灵,您将看不到任何精灵批处理它们的效果。如果您在屏幕上同时有数十个精灵,则情况就不同了。
您不能同时将一个节点添加到两个父节点中。
您可以创建一个“容器”精灵。使用纹理(与精灵批处理节点纹理相同)和CGRectEmpty创建CCSprite。这使得精灵不绘制任何内容,并且您可以像将CCNode添加到CCSpriteBatchNode一样使用它。
然后,您可以将您的精灵添加到该不可见精灵中,并使用容器精灵来影响其子精灵的位置、旋转等,就像以前一样。

很酷 :) 非常感谢,我会尽快尝试...是的,平均而言,我同时拥有20个游戏对象,这使得我的帧率降至40 fps以下:/ - Elvin Ali
嗨,我尝试了建议的解决方案,它确实起作用了...唯一的问题是我依赖节点的位置,并且将整个纹理作为精灵的纹理(即使不可见)会让我改变依赖节点位置的逻辑。我目前正在重新设计整个东西。 - Elvin Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接