Sprite 帧动画 Cocos2d 3.0

Posted

技术标签:

【中文标题】Sprite 帧动画 Cocos2d 3.0【英文标题】:Sprite Frame Animation Cocos2d 3.0 【发布时间】:2014-03-17 11:14:19 【问题描述】:

我一直在尝试制作动画精灵,它们有很多教程,但它们都是针对 Cocos2d 2.x 的。我的精灵表被命名为 fappbird.png 和 .plist 被命名为 fappbird.plist

我有这段代码,但每次我启动场景时它都会崩溃,这是在我的 init 方法中

// -----------------------------------------------------------------------

_player = [CCSprite spriteWithImageNamed:@"monster1.png"]; // comes from your .plist file
_player.position  = ccp(self.contentSize.width/28,self.contentSize.height/2);
_player.physicsBody = [CCPhysicsBody bodyWithRect:(CGRect)CGPointZero, _player.contentSize cornerRadius:0]; // 1
_player.physicsBody.collisionGroup = @"playerGroup";
_player.physicsBody.type = CCPhysicsBodyTypeStatic;
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"monster1.png"];
[batchNode addChild:_player];
[self addChild:batchNode];

NSMutableArray *animFrames = [NSMutableArray array];
for(int i = 1; i < 5; i++)

    CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"flapbird%d.png",i]];
    [animFrames addObject:frame];


CCAnimation *animation = [CCAnimation animationWithSpriteFrames:animFrames delay:0.2f];
[_player runAction:[CCActionRepeatForever actionWithAction:[CCActionAnimate actionWithAnimation:animation]]];

[_physicsWorld addChild:_player];

// -----------------------------------------------------------------------

【问题讨论】:

How to animate CCSprite in Cocos2D 3.x?的可能重复 看到我尝试将那个问题的答案实现到 min 但它会崩溃并且什么都不会发生 当它崩溃时它会告诉你什么? 2014-02-17 16:13:09.875 Bye Flappy[53793:70b] -[CCFileUtils fullPathForFilename:contentScale:] : cocos2d: Warning: File not found: monster1.png 我认为问题在于我的 .plist 没有链接。但我将如何链接它? Monster1.png 是在我的 fappbird.plist @connor 中定义的 【参考方案1】:

在 Cocos2d 3.0 中使用 spritesheet 动画精灵

确保在代码开头添加#import "CCAnimation.h"

在 self.userInteractionEnabled = YES 之后添加精灵表;在初始化中

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"your.plist"];

不要在精灵所在的地方添加所有这些

//The sprite animation
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 7; ++i)

     [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: [NSString stringWithFormat:@"monster%d.png", i]]];

CCAnimation *walkAnim = [CCAnimation
                         animationWithSpriteFrames:walkAnimFrames delay:0.1f]; //Speed in which the frames will go at

//Adding png to sprite
monstertest = [CCSprite spriteWithImageNamed:@"monster1.png"];

//Positioning the sprite
monstertest.position  = ccp(self.contentSize.width/2,self.contentSize.height/2);

//Repeating the sprite animation
CCActionAnimate *animationAction = [CCActionAnimate actionWithAnimation:walkAnim];
CCActionRepeatForever *repeatingAnimation = [CCActionRepeatForever actionWithAction:animationAction];

//Animation continuously repeating
[monstertest runAction:repeatingAnimation];

//Adding the Sprite to the Scene
[self addChild:monstertest];

希望这对某人有所帮助:D 干杯

【讨论】:

如果您已经将所有帧添加到缓存中作为 [CCSpriteBatchNode batchNodeWithFile:] 调用的一部分,那么行: monstertest = [...];可以读取 monstertest = [CCSprite spriteWithSpriteFrameName:] 并传入第一帧的名称。这样精灵的初始图像是从缓存中提取的,而不是从 .png 单独加载到内存中。 @PKCLsoft 那是以前的版本。在 3.x 中,它们都使用 spriteWithImageNamed,它的工作方式是,如果它存在于缓存中,则将使用缓存。 @agro1986 谢谢,我错过了重要的信息。

以上是关于Sprite 帧动画 Cocos2d 3.0的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2D Sprite 动画 - 仅在屏幕上滑动的 Sprite

cocos2d学习-动画缓存和动画创建

2.Unity2D 横版 帧动画sprite animation+动画状态机animator+丝滑连击动作

Unity 动画系列一 属性动画 序列帧动画

03 canvas帧动画封装案例

使用 OpenGL 的 2D Sprite 动画技术