0

任何人都可以给出做主循环动画的最聪明的方法吗?我不想使用 CCAnimation,因为我想逐帧控制动画。

我应该将每个单独帧的精灵矩形(相对于精灵表)存储在一个数组中,然后在每个动画步骤中查找适合的矩形吗?我试图找出这是如何在 CCAnimation 中完成的,但我没有成功......

  1. 如何在初始化时获取每帧的矩形?
  2. 如何在每个动画步骤中设置矩形?
  3. 我需要使用 CCSpriteBatchNode 吗?我想不会吧?
4

3 回答 3

0

由于您希望逐帧动画精灵,我认为使用 CCSpriteBatchNode 将是一个更好的选择,因为它可以让您逐帧访问动画。使用“Zwoptex”之类的任何工具制作精灵 plist 将提供使用 CCSpriteBatchNode 制作动画的有效方法。

希望您知道使用带有 CCSpriteBatchNode 的 plist 文件的动画。

于 2012-10-29T11:58:13.137 回答
0

无法理解,为什么您不想使用 CCAnimation,但无论如何,要获得您的问题的答案,您可以检查 CCSprite 实例的创建代码。然后,检查 CCSpriteFrame 实例的创建。在那里,您至少会找到第一个问题的答案。

实际上,如果您只想以与 CCAnimate 不同的方式管理动画帧,您可以存储 CCSpriteFrames 数组并根据需要显示它们(在 CCAnimate 操作中,这些帧只是在相等的时间间隔内一一更改)。

如果你不想显示超过一帧的动画,你是否使用 CCSpriteBatchNode 没有区别。如果您需要绘制一个纹理的多个部分,它可以节省大量的处理器时间,因为它在一次draw调用中绘制它们而不是draw向所有这些精灵发送消息。

于 2012-10-29T12:08:27.793 回答
0

我从 Morions 的回答中得到灵感,做了以下事情:在游戏中的滴答功能中:

_animationFrames.legFrame = (_animationFrames.legFrame + 1) % _animationFrames.legFrames.count;

[_legs setDisplayFrame:  [_animationFrames.legFrames objectAtIndex: _animationFrames.legFrame]];

在初始化函数中:

CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode
                                  batchNodeWithFile:@"Player.png"];
[self addChild:spriteSheet];

_animationFrames.legFrames = [[NSMutableArray array] retain];
for(int i = 0; i <= 15; ++i)
{
  [_animationFrames.legFrames addObject:
   [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
    [NSString stringWithFormat:@"Player_legs-%d.png", i]]];
}

_legs = [CCSprite spriteWithSpriteFrameName:@"Player_legs-0.png"];
[_sprite addChild: spriteSheet];
[spriteSheet addChild:_legs z:1];
于 2012-10-29T13:01:59.980 回答