如何创建一个CSSprite类,它使用CCSpriteFrameCache& CCSpriteBatchNode对象?

时间:2013-02-25 13:41:14

标签: ios objective-c cocos2d-iphone

我有一个我正在创建的游戏,它将多次实例化某种类型的精灵。这个精灵将有一个简单的循环动画,因此,我假设我需要使用CCSpriteFrameCacheCCSPriteBatchNode来缓存用于驱动动画过程的相关精灵图像。

我一直在阅读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处理器?

我真的不在乎如何解决这个问题。也许我做了一些不正确的大假设。只要最终结果如上所述,我愿意采取不同的方法来解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

实际上,生成的精灵应该是批处理节点的子节点(而不是相反的节点)。 Batch节点只是一个小部件,用于将绘制调用“批处理”为单个调用:requiremetn是其所有子节点(在本例中为动画精灵)源自与批节点相同的纹理。您必须使用批处理节点的唯一原因是您计划从同一纹理中获得许多动画 - 动画与批处理节点本身无关。

所以,在你的场景中:

  • 创建批处理节点
  • 将批处理节点作为子节点添加到场景中。
  • 创建您要添加的每个精灵。
    • 您可以扩展CCSprite以在ctor中创建动画。
    • 如果您希望自己的动画清理,请使用CCSequence(如下所示)。在您的情况下,精灵可能是动画的精灵1,其中一个动作将是CCAnimate动作。
  • 将它们添加到批处理节点。

序列:

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]];