首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用CCSpriteBatchNode?

如何正确使用CCSpriteBatchNode?
EN

Stack Overflow用户
提问于 2011-10-20 07:27:29
回答 2查看 2.4K关注 0票数 1

我将我的精灵框架添加到CCSpriteFrameCache。然后,我用我想要的图像文件创建一个CCSpriteBatchNode

这是我不太理解的:

当我制作CCSprite时,如果我想利用CCSpriteBatchNode,我需要用[CCSprite spriteWithBatchNode: rect:]初始化CCSprite。但如果是这样的话,我不知道如何利用CCSpriteFrameCache来获取帧,因为现在我将手动制作rect。

所以我想我使用了[CCSprite spriteWithSpriteFrameName:],然后我将这个子画面添加到批处理节点中。但我仍然不确定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-20 07:41:19

您应该使用:

代码语言:javascript
复制
CCSprite *sp = [CCSprite spriteWithSpriteFrameName:@"monster.png"];

您在SpriteFrameCache中指定的.plist将为您处理这些帧。然后创建精灵并添加到批处理中。

如果您使用名为"myArt.png“的文件创建批处理节点,则只能向其添加包含在"myArt.png”中的精灵。

希望它能帮上忙!

票数 4
EN

Stack Overflow用户

发布于 2013-06-15 01:55:57

根据我对cocos2d的了解。SpriteFrameCache和SpriteBatchNode具有相同的结果,但使用方式不同,如果您的游戏非常大,则会注意到轻微的性能差异……

CCSpriteFrameCache根据帧被调用的时间加载帧,并根据给定的plist文件命名帧。与plist相关联的地图集也必须添加到项目中,否则将调用框架,但将发现未绘制任何内容。Plist类似于图像地图集中图像所在位置的地址。CCSpriteFrameCache的好处是,代码比CCSpriteBatchNode方法更整洁,也更小,但代价是每次调用该帧时,它都会访问该特定的地图集并绘制它。

另一方面,CCSpriteBatchNode加载地图集并在一次绘制调用中加载它。这是有效的,因为它减少了在游戏中根据需要进行抽奖的次数。这里唯一的困难是你需要为地图集中每个精灵的矩形做数学运算。这是因为假设你的图集是一个角色的两个动作,图集图像文件的大小是1024x1024,每个精灵的大小是128x128。因此,例如,您需要计算整个跳转操作的每个矩形(这就是.plist可以避免进行此类计算的地方)。

正如您所看到的,代码变得很复杂,但它只会执行一次调用,这使得它在性能方面是最好的调用。使用CCSpriteBatchNode的另一种方式是使用不同的静态精灵,您只需对这些多个静态图像或精灵执行一次绘制调用。

如果您需要示例代码,尽管问,我将非常乐意提供它。

更新:为SpriteBatchNode添加链接和我自己的一个示例。

SpriteBatchNode:

Example using SpriteBatchNode with Ray Wenderlich我相信这个人,我从他的教程中学到了很多关于Cocos2d的东西。我建议你阅读他的其他教程。

简而言之,CCSpriteBatchNode与我们下面对CCSpriteFrameCache所做的过程完全相同,唯一的区别是您将Sprite子节点添加到CCSpriteBatchNode而不是层,但您确实将CCSpriteBatchNode添加到层。对于Cocos2d的新手来说,这是一个很难理解的概念。

SpriteFrameCache:

SpriteFrameCache我找不到一个好的例子,所以这里有一个简单的例子。

代码语言:javascript
复制
//By doing this your sprites are now in the cache ready to be used 
//by their names declared in the .plist file.
-(void) loadingSprites:(NSString*) plistName {
     [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName];

}

-(id)initGameLayer {
     //CCSprite accepts CCSpriteFrame and your img is now ready to be displayed.
     //However is still not drawn yet.
     CCSprite * mySprite = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:framename];


     //set a position if desired 
     //20 pixels to the right and 0 pixels to the top.
     mySprite.position = CGPointMake(20,0);

     //Now the Image has been drawn, making 1 draw call.
     [self addChild:mySprite];

 }

值得注意的是,CCSpriteBatchNode只进行了一次SpriteAtlas调用,但是添加到batchnode的所有sprites都必须是同一个sprites的一部分。

而且使用SpriteFrameCache更容易,但是对于添加到层的每个子对象,这意味着+1个绘制调用正在完成。(这是缺点,性能)

所以如果你用SpriteFrameCache添加10个雪碧层,你会有10个drawcalls。

但是,如果您实现了SpriteBatchNode并在CCSpriteBatchNode中添加了这10个CCSpriteBatchNode,并且只将该Sprites添加到层中,那么您将添加相同的10个sprites,但只会完成一个绘制调用。因此,性能差异(最好是)在较大的游戏中将是显着的。

希望它能帮上忙,干杯!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7829428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档