如何正确使用CCSpriteBatchNode?

时间:2011-10-19 23:27:29

标签: objective-c cocos2d-iphone

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

这是我不太明白的:

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

所以我想我使用[CCSprite spriteWithSpriteFrameName:]然后将此精灵添加到批处理节点。但我仍然不确定。

2 个答案:

答案 0 :(得分:4)

您应该使用:

CCSprite *sp = [CCSprite spriteWithSpriteFrameName:@"monster.png"];

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

如果使用名为“myArt.png”的文件创建batchnode,则只能在“myArt.png”中包含一个精灵。

希望它有所帮助!

答案 1 :(得分:4)

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

CCSpriteFrameCache根据它们被命名的时间根据给定的plist文件加载帧。与plist相关联的图集也必须添加到项目中,否则将调用帧,但不会发现任何内容。 Plist就像图像位于图像图谱中的位置。 CCSpriteFrameCache的优点是代码更整洁,并且比CCSpriteBatchNode方法更小,代价是对于该帧的每次调用,它都会转到特定的图集并绘制它。

另一方面,

CCSpriteBatchNode加载地图集并在一次绘制调用中加载它。这是有效的,因为它减少了在游戏中每次需要完成抽奖的次数。这里唯一的困难是你需要对地图册中每个精灵的矩形进行数学运算。这是因为我们假设您的地图集是一个字符的2个动作,地图集图像文件的大小为1024x1024,每个精灵的大小为128x128。所以你可以用数学来得到整个跳跃动作的每个矩形。(这就是.plist派上用场以避免做这样的数学运算)

您可以看到代码变得复杂,但它只会执行一次调用,从而使性能成为您最好的调用。 使用CCSpriteBatchNode的另一种方法是使用不同的静态精灵,你只需要为那些多个静态图像或精灵进行一次绘制调用。

如果您需要示例代码,我会非常乐意提供它。


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

SpriteBatchNode:

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

简而言之,CCSpriteBatchNode与我们在下面完成的过程完全相同,CCSpriteFrameCache是​​唯一的区别,它将Sprite子节点添加到CCSpriteBatchNode而不是Layer,但是你要将CCSpriteBatchNode添加到Layer。 这是Cocos2d新成员纠结的难题。


SpriteFrameCache:

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

//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只做了1次drawcall,但是所有添加到batchnode的精灵都必须是同一个SpriteAtlas的一部分。

使用SpriteFrameCache只会更容易和更简单,但对于添加到图层的每个孩子来说,这意味着正在进行+1绘制调用。(这是缺点,性能)

因此,如果使用SpriteFrameCache向图层添加10个Sprite,则会有10个drawcall。

但是,如果您实现SpriteBatchNode并在CCSpriteBatchNode中添加这10个Sprite而只是将该CCSpriteBatchNode添加到该层,您将添加相同的10个精灵,但只会进行一次绘制调用。因此,在较大的游戏中,性能差异(最好的)将是显着的。

希望它有所帮助,干杯!