我将我的精灵框架添加到CCSpriteFrameCache。然后,我用我想要的图像文件创建一个CCSpriteBatchNode。
这是我不太理解的:
当我制作CCSprite时,如果我想利用CCSpriteBatchNode,我需要用[CCSprite spriteWithBatchNode: rect:]初始化CCSprite。但如果是这样的话,我不知道如何利用CCSpriteFrameCache来获取帧,因为现在我将手动制作rect。
所以我想我使用了[CCSprite spriteWithSpriteFrameName:],然后我将这个子画面添加到批处理节点中。但我仍然不确定。
发布于 2011-10-20 07:41:19
您应该使用:
CCSprite *sp = [CCSprite spriteWithSpriteFrameName:@"monster.png"];您在SpriteFrameCache中指定的.plist将为您处理这些帧。然后创建精灵并添加到批处理中。
如果您使用名为"myArt.png“的文件创建批处理节点,则只能向其添加包含在"myArt.png”中的精灵。
希望它能帮上忙!
发布于 2013-06-15 01:55:57
根据我对cocos2d的了解。SpriteFrameCache和SpriteBatchNode具有相同的结果,但使用方式不同,如果您的游戏非常大,则会注意到轻微的性能差异……
CCSpriteFrameCache根据帧被调用的时间加载帧,并根据给定的plist文件命名帧。与plist相关联的地图集也必须添加到项目中,否则将调用框架,但将发现未绘制任何内容。Plist类似于图像地图集中图像所在位置的地址。CCSpriteFrameCache的好处是,代码比CCSpriteBatchNode方法更整洁,也更小,但代价是每次调用该帧时,它都会访问该特定的地图集并绘制它。
另一方面,CCSpriteBatchNode加载地图集并在一次绘制调用中加载它。这是有效的,因为它减少了在游戏中根据需要进行抽奖的次数。这里唯一的困难是你需要为地图集中每个精灵的矩形做数学运算。这是因为假设你的图集是一个角色的两个动作,图集图像文件的大小是1024x1024,每个精灵的大小是128x128。因此,例如,您需要计算整个跳转操作的每个矩形(这就是.plist可以避免进行此类计算的地方)。
正如您所看到的,代码变得很复杂,但它只会执行一次调用,这使得它在性能方面是最好的调用。使用CCSpriteBatchNode的另一种方式是使用不同的静态精灵,您只需对这些多个静态图像或精灵执行一次绘制调用。
如果您需要示例代码,尽管问,我将非常乐意提供它。
更新:为SpriteBatchNode添加链接和我自己的一个示例。
SpriteBatchNode:
Example using SpriteBatchNode with Ray Wenderlich我相信这个人,我从他的教程中学到了很多关于Cocos2d的东西。我建议你阅读他的其他教程。
简而言之,CCSpriteBatchNode与我们下面对CCSpriteFrameCache所做的过程完全相同,唯一的区别是您将Sprite子节点添加到CCSpriteBatchNode而不是层,但您确实将CCSpriteBatchNode添加到层。对于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只进行了一次SpriteAtlas调用,但是添加到batchnode的所有sprites都必须是同一个sprites的一部分。
而且使用SpriteFrameCache更容易,但是对于添加到层的每个子对象,这意味着+1个绘制调用正在完成。(这是缺点,性能)
所以如果你用SpriteFrameCache添加10个雪碧层,你会有10个drawcalls。
但是,如果您实现了SpriteBatchNode并在CCSpriteBatchNode中添加了这10个CCSpriteBatchNode,并且只将该Sprites添加到层中,那么您将添加相同的10个sprites,但只会完成一个绘制调用。因此,性能差异(最好是)在较大的游戏中将是显着的。
希望它能帮上忙,干杯!
https://stackoverflow.com/questions/7829428
复制相似问题