我将精灵帧添加到CCSpriteFrameCache
。然后我用我想要的图像文件创建一个CCSpriteBatchNode
。
这是我不太明白的:
当我制作CCSprite
时,如果我想利用CCSpriteBatchNode
,我需要使用CCSprite
初始化[CCSprite spriteWithBatchNode: rect:]
?但如果是这种情况,我不知道如何利用CCSpriteFrameCache
来获取帧,因为现在我将手动制作矩形。
所以我想我使用[CCSprite spriteWithSpriteFrameName:]
然后将此精灵添加到批处理节点。但我仍然不确定。
答案 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个精灵,但只会进行一次绘制调用。因此,在较大的游戏中,性能差异(最好的)将是显着的。
希望它有所帮助,干杯!