0

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

我一直在阅读 Raywenderlich.com 上经常被引用的How To Use Animations and Sprite Sheets in Cocos2D,我基本了解这个过程。

我的问题是他的场景文件的代码中包含了整个动画序列。我无法解释如何将相同的代码放在CCSprite我创建的孩子、类(或类似的类)中,以及如何在我的游戏场景中使用这个独立的精灵。

换句话说,我的愿望是有一个CCSprite可以在场景实现中实例化的子类。一些参数被传递到孩子的构造函数中CCSprite,当精灵被添加到游戏场景中时,精灵的动画会自动发生,并且不受任何场景代码的影响。

我怎样才能做到这一点?

(未)澄清点或为什么我感到困惑

在 Ray 教程的第 2 步中,他指示添加CCSpriteBatchNode用于他的动画精灵的子self对象(即游戏场景)。如果我CCSpriteBatchNodeCCSprite子类实现中定义了 a,我是否需要添加CCSpriteBatchNode到我的父母场景?我应该如何(正确地)做到这一点?

另外,如果是一个单例类,添加构造函数会不会给我CCSpriteFrameCache带来任何麻烦,或者我应该只调用一次,比如说,在我的应用程序的初始化中?[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"my_sprite.plist"];CCSprite

一般来说,我只是感到困惑。我怎样才能创建一个独立的动画精灵,我可以添加(多次)到一个场景中,我的场景不必担心连接动画序列,也不会让小的 iOS 处理器陷入困境?

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

谢谢!

4

1 回答 1

2

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

所以,在你的场景中:

  • 创建批处理节点
  • 将批处理节点作为子节点添加到场景中。
  • 创建您要添加的每个精灵。
    • 您可以扩展 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]];
于 2013-02-25T14:13:57.247 回答