有人可以向我解释一下CCSpriteBatchNodes和spritesheets是如何工作的吗?

the*_*tic 3 iphone objective-c sprite-sheet cocos2d-iphone ipad

我已经建立了一个小的ipad游戏,spritesheets和batchnodes到处都是.但是我不知道它们是如何工作的,何时添加精灵表,何时将sprite添加到spritebatchnode等.

这是我在初始屏幕(主菜单)中所做的:

CCSpriteBatchNode *spriteSheet  = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;    
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:spriteSheet];
Run Code Online (Sandbox Code Playgroud)

在其他类 - 我总是需要使用相同的批处理节点 - >"sprites.png" - 我打电话

CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:someSpriteFrameName.png]; 
Run Code Online (Sandbox Code Playgroud)

并将其添加到self.

[self addChild:someSprite]; // I do not understand why I would add my sprite to the batch node instead of self 
Run Code Online (Sandbox Code Playgroud)

所以情况如下:

  • 我有一个名为"sprites.png"的文件,我所有的精灵都在这里.

    1. 每当我更改场景时,我都会创建一个新的批处理节点吗?spriteframecache应该保持不变吗?
    2. 如果我有两个精灵表文件,我将如何处理spriteframecache?
    3. 我何时将子项添加到批处理节点,为什么?

我似乎并没有完全掌握这个概念.我知道为什么使用它.但是如果有人能够以外行的方式再次向我解释一切,我真的很感激,所以我对我所做的事情100%肯定.请尝试解释它是基本的.

  • 非常感谢 - 马丁

小智 8

  1. CCSpriteBatchNode是CCNode的后继者,因此您必须为每个场景创建单独的实例.如果您有多个纹理文件,则可以在场景中使用多个批处理节点.

    CCSpriteFrameCache 是一个单身,所以它在应用程序生命周期中保持不变.

  2. 将两者都添加到CCSpriteFrameCache.CCSpriteFrameCachesingleton具有loadedFilenames_字段(实例NSMutableSet),用于缓存所有场景的所有精灵帧.

  3. 当您期望大量具有相似纹理的精灵时,您必须使用批处理节点.例如,您希望每2秒生成100个硬币.如果你使用平常CCNode并在其上创建精灵,你的应用程序将CCSprite每2秒分配这100个对象.CCSpriteBatchNode针对性能和更好的内存使用.它UITableView与可重复使用的细胞一样工作.

    使用可重用单元格滚动表格视图时,它不会创建新单元格.当必须在屏幕表视图上呈现新单元格时,只需在屏幕外找到具有相同重用标识符的单元格,并用新内容替换它的内容.CCSpriteBatchNode以同样的方式工作.当您尝试向其添加新的精灵时,该节点会尝试在屏幕外找到未使用的精灵并替换它的内容.

    请记住,您添加的精灵CCSpriteBatchNode必须使用纹理文件中的纹理来创建此批处理节点.

    以下示例基于您的问题中的代码:

CCSpriteBatchNode *batchNode  = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;    
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:batchNode];
CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:@"someSpriteFrom_sprites.png_.png];
[batchNode addChild:someSprite]; // add sprite to batch node to get all advantages of it
Run Code Online (Sandbox Code Playgroud)

这是一篇关于CCSpriteBatchNode性能的好文章:http://www.learn-cocos2d.com/2011/09/cocos2d-spritebatch-performance-test/