主循环中的Cocos2d动画

时间:2012-10-29 11:33:07

标签: cocos2d-iphone cocos2d-x

任何人都可以提供任何最明智的方式来制作主循环动画吗?我不想使用CCAnimation,因为我想逐帧控制动画。

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

  1. 如何在初始化时获取每帧的矩形?
  2. 如何在每个动画步骤设置矩形?
  3. 我是否需要使用CCSpriteBatchNode?我猜不是,嗯?

3 个答案:

答案 0 :(得分:0)

正如你想要逐帧动画精灵一样,我认为使用CCSpriteBatchNode是一个更好的选择,因为它可以逐帧访问动画。使用任何工具如“Zwoptex”制作精灵的plist将提供一种有效的动画使用方法CCSpriteBatchNode。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我从Morions的回答中做了以下灵感: 在游戏勾选功能中:

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

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

在init函数中:

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