天天看点

Cocos2d落叶动画

以前需要实现落叶动画时,把问题也想的太复杂,最后还是没能实现落叶动画,之前写过一篇关于合成动画的钟摆动画,使两个动画同时运动就实现了复杂的动画。然后同样的道理:将自由下落和左右摆的动画和合起来不就是落叶动画了吗,想想自已曾经为了一个落叶所浪费的时间就感到不值。

主要代码:

//添加一个精灵

CCSprite *spriteYezi1 = [CCSprite spriteWithFile:@"img_yezi1.png"];

spriteYezi1.rotation = 30;

spriteYezi1.anchorPoint = ccp(0.5, 3);//改变精灵的anchorpoing是为了实现后面的单摆动画

spriteYezi1.position = ccp(750, 900);

spriteYezi1.tag = TAG_SPRITE_YEZI1;

[self addChild:spriteYezi1];

[self playYeziAnim:spriteYezi1];//播放叶子动画

CCSprite *spriteYezi2 = [CCSprite spriteWithFile:@"img_yezi2.png"];

spriteYezi2.rotation = 50;

spriteYezi2.anchorPoint = ccp(0.5, 3);

spriteYezi2.position = ccp(550, 840);

spriteYezi2.tag = TAG_SPRITE_YEZI2;

[self addChild:spriteYezi2];

[self playYeziAnim:spriteYezi2];

//叶子动画

-(void)playYeziAnim:(CCSprite *)spriteYezi

{

int iTag = spriteYezi.tag;

ccTime time, roTime;

float fAngle1, fAngle2;

if (iTag == TAG_SPRITE_YEZI1) {

time = 26;//叶子下落的时间

roTime = 1.5;//叶子摆动一次所需要的时间

fAngle1 = -80;//叶子单摆的角度,与fAngle2相对应,一个去,一个回,来回一次为一个循环,时间是2*1.5

fAngle2 = 80;

}

else {

time = 40;

roTime = 2;

fAngle1 = -100;

fAngle2 = 100;

//随机生成叶子的偏移距离

int iRandPos = arc4random() % 400;

//叶子所运动到的位置

CCMoveTo *moveTo = [CCMoveTo actionWithDuration:time position:ccp(spriteYezi.position.x - iRandPos, 0)];

CCCallFuncN *actDone = [CCCallFuncN actionWithTarget:self selector:@selector(resetYeziPos:)];

CCSequence *seq1 = [CCSequence actions:moveTo, actDone, nil];

//叶子旋转动画

CCRotateBy *rotaBy1 = [CCRotateBy actionWithDuration:roTime angle:fAngle1];

CCRotateBy *rotaBy2 = [CCRotateBy actionWithDuration:roTime angle:fAngle2];

//将旋转动画与CCEaseInOut组成合成动画即可实现普通的摆动画

CCEaseInOut *ease1 = [CCEaseInOut actionWithAction:rotaBy1 rate:3];

CCEaseInOut *ease2 = [CCEaseInOut actionWithAction:rotaBy2 rate:3];

CCSequence *seq2 = [CCSequence actions:ease1, ease2, nil];

CCRepeat *act = [CCRepeat actionWithAction:seq2 times:-1];

[spriteYezi runAction:[CCSpawn actions:seq1, act, nil]];

//重置叶子的位置

-(void)resetYeziPos:(id)sender

int iTag = (int)[sender tag];

[self removeChild:sender cleanup:YES];

NSString *sImg = [NSString stringWithFormat:@"img_ye_%d.png", (iTag % 100)];

CGPoint pos;

float fAngle;

//随机生成叶子的起始位置

int iRand = 1050 – 520 + arc4random() % 520;

pos = ccp(iRand, 900);

fAngle = 40;

pos = ccp(iRand, 840);

fAngle = 50;

//当叶子移动到指定位置后,再将position重置,循环播放动画

CCSprite *spriteYezi = [CCSprite spriteWithFile:sImg];

spriteYezi.anchorPoint = ccp(0.5, 3);

spriteYezi.rotation = fAngle;

spriteYezi.position = pos;

spriteYezi.tag = iTag;

[self addChild:spriteYezi];

[self playYeziAnim:spriteYezi];

继续阅读