IOS cocos2d学习笔记-<五>CCAction精灵运动

来源:互联网 发布:淘宝现在什么好卖2017 编辑:程序博客网 时间:2024/06/11 10:19

(本文写作基于千锋3g学院提供的第三季讲授视频编写,更多资料和资源下载地址请看笔记扉页:传送门

这一讲之后,你就感觉自己正在冲进cocos2d的世界里面了。这一讲将会让精灵动起来,主要涉及到的知识有:

继承于CCAction的几类动作

第一类:纯动作

CCJumpTo(By)-跳到

CCMoveTo(By)-移动到

CCRotateTo(By)-旋转到

CCFadeIn(Out/To)-淡入(出/到某程度)

CCBlink - 闪烁

CCBezierTo(By)-贝塞尔曲线

CCTintTo(By)-改变颜色

.......等等等等

这些动作均为单一的动作变换,各个动作均有相应初始化函数 +initWithDuration:(ccTime)t......进行动作的设置。

cocos2d的思想是:把动作定义为一个类,每一个动作都需要实例化,成为单一动作,再加入到相应的精灵进行运动。

第二类:函数回调

CCCallFunc-直接调用某函数

CCCallFunN-调用函数并传入使用此动作的对象

CCCallFunND-调用函数并传入使用该动作的对象以及对象的数据(Data)

CCCallFunO-调用函数并传入任意对象

我们把这些函数调用的操作看作一个个调用函数的“动作”,而事实上他们也正的都是继承于CCAction的,所以我们也很自然地把他们看成一个个动作。

第三类:动作序列

CCSequence-顺序动作(多个动作按顺序发生)

CCSpawn-并列动作(多个动作同时发生)

这两个动作类通过+(id) actions:进行实例化成一个动作实例。

事实上,这一个动作实例是由一个或多个第一类动作集合而成的“一个”大动作。从而被精灵所使用。

通过创建这三类型的动作进行自由搭配最终得到一个CCSequence或者是CCSpawn动作实例(他们是可以相互包含的),剩下要做的只需要把需要执行这个动作的精灵建立一个关系就可以了。

来自CCNode的一个方法:

- (void) runAction:(CCAction *)action

当然我们可以停止精灵的所有动作

- (void) stopAllActions;

没错,你没看错,这些方法都是来自CCNode的,所以,你可以很邪恶地把所有继承于CCNode的对象淡定地加上动作。

上一段代码,小鸟在开始场景出现的动作

- (void) creatOneBird{       CGFloat birdfloat = (arc4random()%3 + 1.0f);    NSLog(@"%f",birdfloat);    NSInteger birdint = (int)birdfloat;    NSString *birdkind = nil;    switch (birdint) {        case 1:            birdkind = [[NSString alloc] initWithFormat:@"bird1.png"];            break;        case 2:            birdkind = [[NSString alloc] initWithFormat:@"bluebird1.png"];            break;        case 3:            birdkind = [[NSString alloc] initWithFormat:@"yellowbird1.png"];            break;        default:            break;    }    CCSprite *bird = [[CCSprite alloc] initWithFile:birdkind];                      //priteWithFile:@"bird1.png"];    CGPoint startPoint = ccp(0.0f-arc4random()%100, 70.0f);    [bird setPosition:startPoint];    [bird setScale:(arc4random()%1+0.5)];    CGPoint endPoint = ccp(480.0f + arc4random()%100, 70.0f);    // 设置一个终点    CGFloat height = arc4random()%320+30.0f;    CGFloat time = arc4random()%3 + 4.0f;    CGFloat jumpnum = arc4random()%2 + 2.0f;    id actionJump = [CCJumpTo actionWithDuration:time position:endPoint height:height jumps:jumpnum];    // 设置动作,跳跃    id actionFinish = [CCCallFuncN actionWithTarget:self selector:@selector(actionFinish:)];    // 完成动作    CCSequence *BirdActions = [CCSequence actions:actionJump, actionFinish, nil];    // 动作序列            [bird runAction:BirdActions];        // 给bird一个动作    [self addChild:bird];    [bird release];}

这里有个用法是直接用id指针类型定义,然后用各种动作初始化赋值,亲测没问题。注意使用id定义就不用加星号(*)了,定义了本来就是一枚指针了。

actionFinish中所调用方法写的时候谨记要写成这样- (void) actionFinish:(CCNode *)currentNode 黑色部分可以是其他类型,自定。

因为这里用的是CCCallFuncN,调用的函数需要一个参数接受回调的对象。


上一段实例代码,这是后面小鸟撞击时发生的动作。

- (void) hitAnimationX:(float)x andY:(float)y{    // 碰撞时小鸟掉毛    for (int i = 0; i < 6; i++) {        // 掉毛范围值        int range = 2;                // 创建羽毛Sprite,并设置相应变量        CCSprite *temp = [CCSprite spriteWithFile:@"yumao1.png"];        temp.scale = (float)(arc4random()%3/10.0f);        temp.position = CGPointMake((x+arc4random()%10*range-10), (y+arc4random()%10*range-10));                // 设置羽毛动作,移动,淡出,旋转,调用runEnd:方法        CCMoveTo *actionMove = [CCMoveTo actionWithDuration:0.5 position:CGPointMake(x+arc4random()%10*range-10, y+arc4random()%10*range-10)];        CCAction *actionAlpha = [CCFadeOut actionWithDuration:0.5];        CCAction *actionRotate = [CCRotateBy actionWithDuration:0.5 angle:arc4random()%180];        CCAction *actionMoveEnd = [CCCallFuncN actionWithTarget:self selector:@selector(runEnd:)];                // 加入动作,Spawn为动作同时发生        CCSpawn *mut = [CCSpawn actions:actionMove, actionAlpha, actionRotate, nil];        [temp runAction:[CCSequence actions:mut, actionMoveEnd, nil]];        [myLayer addChild:temp];    }}

- (void) runEnd:(id)sender{    // 碎片动作结束时从画面上删除    CCSprite *temp = (CCSprite *)sender;    if (temp.tag == BIRD_ID) {        [self destoryBody:sender];    }    [myLayer removeChild:sender cleanup:YES];}

让小鸟飞起来吧~祝你玩得开心。大笑