iphone - 有人可以向我解释 SpriteBatch 节点和 Sprite 表是如何工作的吗?

标签 iphone objective-c ipad cocos2d-iphone sprite-sheet

我构建了一个小的 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 。

    1. 是否在每次更改场景时都创建一个新的批处理节点? spriteframecache 应该保持不变吧?
    2. 如果我有两个 sprite 表文件,我需要用 spriteframecache 做什么?
    3. 我什么时候将 child 添加到批处理节点,为什么?

我似乎真的没有完全理解这个概念。我大致知道我为什么使用它。但如果有人能用通俗易懂的语言再次向我解释一切,我将非常感激,所以我对我所做的事情有 100% 的把握。请尝试尽可能基本地解释它。

  • 非常感谢 - 马丁

最佳答案

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

    CCSpriteFrameCache 是单例,因此它在应用程序生命周期内保持不变。

  2. 将两者添加到 CCSpriteFrameCacheCCSpriteFrameCache 单例具有 loadedFilenames_ 字段(NSMutableSet 的实例),它缓存所有场景的所有 Sprite 帧。

  3. 当您需要大量具有相似纹理的 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/

相关文章:

ios - AVAudioSession 的 Swift 子类在运行时不起作用

ios - iOS 中如何避免回调 hell ?

ios - UIDocumentInteractionController 没有出现在 iPad 上但在 iPhone 上工作

iphone - 为什么我的 NSDictionary 键按字母顺序排序

ios - 采样运行构建时遇到问题,但没有按清理问题

objective-c - 从缓冲区读取数据如何影响 C 中另一个变量的值

ios - 在 UIViewController 我怎样才能有一个方法自动处理很多按钮

iphone - 在线iPhone设备测试

iphone - 在哪里可以找到响应触摸的 iPhone OpenGL ES 示例?

iphone - Inmobi方向iphone,