任何人都可以给出做主循环动画的最聪明的方法吗?我不想使用 CCAnimation,因为我想逐帧控制动画。
我应该将每个单独帧的精灵矩形(相对于精灵表)存储在一个数组中,然后在每个动画步骤中查找适合的矩形吗?我试图找出这是如何在 CCAnimation 中完成的,但我没有成功......
- 如何在初始化时获取每帧的矩形?
- 如何在每个动画步骤中设置矩形?
- 我需要使用 CCSpriteBatchNode 吗?我想不会吧?
任何人都可以给出做主循环动画的最聪明的方法吗?我不想使用 CCAnimation,因为我想逐帧控制动画。
我应该将每个单独帧的精灵矩形(相对于精灵表)存储在一个数组中,然后在每个动画步骤中查找适合的矩形吗?我试图找出这是如何在 CCAnimation 中完成的,但我没有成功......
由于您希望逐帧动画精灵,我认为使用 CCSpriteBatchNode 将是一个更好的选择,因为它可以让您逐帧访问动画。使用“Zwoptex”之类的任何工具制作精灵 plist 将提供使用 CCSpriteBatchNode 制作动画的有效方法。
希望您知道使用带有 CCSpriteBatchNode 的 plist 文件的动画。
无法理解,为什么您不想使用 CCAnimation,但无论如何,要获得您的问题的答案,您可以检查 CCSprite 实例的创建代码。然后,检查 CCSpriteFrame 实例的创建。在那里,您至少会找到第一个问题的答案。
实际上,如果您只想以与 CCAnimate 不同的方式管理动画帧,您可以存储 CCSpriteFrames 数组并根据需要显示它们(在 CCAnimate 操作中,这些帧只是在相等的时间间隔内一一更改)。
如果你不想显示超过一帧的动画,你是否使用 CCSpriteBatchNode 没有区别。如果您需要绘制一个纹理的多个部分,它可以节省大量的处理器时间,因为它在一次draw
调用中绘制它们而不是draw
向所有这些精灵发送消息。
我从 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];