我有一个我正在创建的游戏,它将多次实例化某种类型的精灵。这个精灵将有一个简单的循环动画,因此,我假设我需要使用CCSpriteFrameCache
和CCSPriteBatchNode
来缓存用于驱动动画过程的相关精灵图像。
我一直在阅读Raywenderlich.com上经常引用的How To Use Animations and Sprite Sheets in Cocos2D,我主要理解这个过程。
我的问题是他在场景文件的代码中包含了整个动画序列。我无法解释如何将这个相同的代码放在我创建的子类CCSprite
类(或类似的类)中,并在我的游戏场景中使用这个自包含的sprite。
换句话说,我的愿望是拥有一个可以在场景实现中实例化的CCSprite
子类。一些参数被传递到子CCSprite
的构造函数中,当精灵被添加到游戏场景中时,精灵的动画会自动发生并且与任何场景代码分开。
我该怎么做?
(Un-)澄清点或为什么我感到困惑
在Ray教程的第2步中,他指示将用于动画精灵的CCSpriteBatchNode
添加为self
的孩子(这是游戏场景。)如果我已定义在CCSpriteBatchNode
子类实现中CCSprite
,我是否需要将CCSpriteBatchNode
添加到我的父级场景中?我该如何(正确地)这样做?
另外,如果CCSpriteFrameCache
是一个单例类,在我的[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"my_sprite.plist"];
构造函数中添加CCSprite
会不会给我带来麻烦,或者我应该只调用一次,例如初始化我的应用程序?
总的来说,我只是感到困惑。如何创建一个自包含的动画精灵,我可以添加(多次)到一个场景,我的场景不必担心连接动画序列,我也不会陷入小iOS处理器?
我真的不在乎如何解决这个问题。也许我做了一些不正确的大假设。只要最终结果如上所述,我愿意采取不同的方法来解决这个问题。
谢谢!
答案 0 :(得分:2)
实际上,生成的精灵应该是批处理节点的子节点(而不是相反的节点)。 Batch节点只是一个小部件,用于将绘制调用“批处理”为单个调用:requiremetn是其所有子节点(在本例中为动画精灵)源自与批节点相同的纹理。您必须使用批处理节点的唯一原因是您计划从同一纹理中获得许多动画 - 动画与批处理节点本身无关。
所以,在你的场景中:
序列:
CCSprite *icn = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%@_enabled.png", sk.skillIconPrefix]];
[icn setBlendFunc:(ccBlendFunc) {GL_SRC_ALPHA, GL_ONE}];
icn.opacity = 0;
id fadein = [CCFadeTo actionWithDuration:.5 opacity:165];
id fademax = [CCFadeTo actionWithDuration:.05 opacity:255];
id stallmax = [CCDelayTime actionWithDuration:.05];
id fadeback = [CCFadeTo actionWithDuration:.05 opacity:165];
id stall = [CCDelayTime actionWithDuration:.5];
id fadout = [CCFadeTo actionWithDuration:2.5 opacity:0];
id clean = [CCCallBlock actionWithBlock:^{
[icn removeFromParentAndCleanup:YES];
}];
CGPoint pos = [self pointLocationOnMapForLocation:theTile.location];
icn.position = ccpAdd(pos, ccp(0, -15));
id enchiladas = [CCSequence actions:fadein, fademax, stallmax, fadeback, stall, fadout, clean, nil];
[icn runAction:enchiladas];
编辑:对于重复的动画(然后没有清理),这是我的一个游戏的例子;
CCAction *forever = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:anim]];