我构建了一个小的 ipad 游戏,spritesheets 和 batchnodes 到处都是。但是我不知道它们是如何工作的,什么时候添加 Sprite 表,什么时候将 Sprite 添加到 spritebatchnode 等等。
这是我在初始屏幕(主菜单)中所做的:
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:spriteSheet];
在其他类中 - 我总是需要使用相同的批处理节点 -> “sprites.png” - 我调用
CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:someSpriteFrameName.png];
并将其添加到self
。
[self addChild:someSprite]; // I do not understand why I would add my sprite to the batch node instead of self
所以情况是这样的:
我有 1 个名为“sprites.png”的文件,其中包含我所有的 Sprite 。
- 是否在每次更改场景时都创建一个新的批处理节点? spriteframecache 应该保持不变吧?
- 如果我有两个 sprite 表文件,我需要用 spriteframecache 做什么?
- 我什么时候将 child 添加到批处理节点,为什么?
我似乎真的没有完全理解这个概念。我大致知道我为什么使用它。但如果有人能用通俗易懂的语言再次向我解释一切,我将非常感激,所以我对我所做的事情有 100% 的把握。请尝试尽可能基本地解释它。
- 非常感谢 - 马丁
最佳答案
CCSpriteBatchNode 是 CCNode 的继任者,因此您必须为每个场景创建单独的实例。如果您有多个纹理文件,您可以在场景中使用多个批处理节点。
CCSpriteFrameCache
是单例,因此它在应用程序生命周期内保持不变。将两者添加到
CCSpriteFrameCache
。CCSpriteFrameCache
单例具有loadedFilenames_
字段(NSMutableSet
的实例),它缓存所有场景的所有 Sprite 帧。当您需要大量具有相似纹理的 Sprite 时,您必须使用批处理节点。例如,您希望每 2 秒生成 100 个硬币。如果您使用普通的
CCNode
并在其上创建 Sprite ,您的应用程序将每 2 秒分配这 100 个CCSprite
对象。CCSpriteBatchNode
旨在提高性能和更好的内存使用率。它的工作方式类似于带有可重用单元格的UITableView
。当您使用可重复使用的单元格滚动表格 View 时,它不会创建新的单元格。当必须在屏幕上显示新单元格时,表格 View 只需在屏幕外找到具有相同重用标识符的单元格,并将其内容替换为新内容。
CCSpriteBatchNode
的工作方式相同。当您尝试向其添加新 Sprite 时,节点会尝试在屏幕外找到未使用的 Sprite 并替换其内容。请记住,您添加到
CCSpriteBatchNode
的 Sprite 必须使用用于创建此批处理节点的纹理文件中的纹理。以下示例基于您问题中的代码:
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
这是一篇关于 CCSpriteBatchNode 性能的好文章:http://www.learn-cocos2d.com/2011/09/cocos2d-spritebatch-performance-test/
关于iphone - 有人可以向我解释 SpriteBatch 节点和 Sprite 表是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910317/