转自:http://labs.ywlx.net/?p=2062
以前需要实现落叶动画时,把问题也想的太复杂,最后还是没能实现落叶动画,之前写过一篇关于合成动画的钟摆动画,使两个动画同时运动就实现了复杂的动画。然后同样的道理:将自由下落和左右摆的动画和合起来不就是落叶动画了吗,想想自已曾经为了一个落叶所浪费的时间就感到不值。
主要代码:
//添加一个精灵
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;
if (iTag == TAG_SPRITE_YEZI1) {
pos = ccp(iRand, 900);
fAngle = 40;
}
else {
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];
}
以上代码实现的无风情况下的叶子自由下落的动画,如果有风向的条件的时候,可依据两个叶子下落的不同做相应调整可实现有风条件的落叶动画效果。