Cocos2d-x ——Action (动作)简介

来源:互联网 发布:防火墙会拦截网络打印 编辑:程序博客网 时间:2024/05/18 01:38

        Cocos2d-x中非常关键的部分——动作。动作是一个轻量级的类,可以用来让节点执行者诸如移动、旋转、缩放、变色、消失等很多动作。所有的动作都可以细分为若干个基本动作和基本动作的组合动作。进一步通过动作的扩展,我们可以将同一个精灵的更多动作和不同精灵之间的不同动作连贯起来,形成一个动态的游戏的世界。

基本动作:

       基本动作的本质就是改变某个图形对象的属性。包含:位置、角度、大小等。根据改变的内容和方式的不同,基本动作又可以进行进一步细分。而根据改变完成所需要的时间,可以将基本动作分为:延时动作和瞬时动作两大类。

在 CCNode类中有一个对象方法:runAction();

        声明为:CCAction *runAction(CCAction *action); 因为CCSprite、CCLayer、CCLabeTTF等很多类都是继承自CCNode,所以它们都可以执行这个runAction方法。当我们想要创建并执行一个动作。方法如下:

             CCAction *action=  //后面跟动作的创建方法。

             node->runAction (action); //node为一个创建好的的节点或者节点的子类。

             以上两行代码就是我们最常用的创建和执行动作的基本代码。

        CCFiniteTimeAction 、CCFollow、CCspeed 都是继承自CCAction.

CCspeed的作用是调整行为实例的执行速度,因此它依赖于其它的行为,单独的CCSpeed没有意义。

CCFollow可以使用节点跟随指定的另一个节点移动。

CCFiniteTimeAction  是加入了时间属性的动画基类,用于派生各种由时间插值进行计算的动画。

在CCFiniteTimeAction中,还有两个子类,分别是CCActionInstant——瞬时动画  及CCIntervalAction——延时动画。


瞬时动画:


瞬时动作就是不需要时间等待,马上就完成的动作。瞬时动作的的子类:

CCCallFunc 执行 回调函数。      CCFlipX   x轴镜像翻转。      CCFlipY  轴镜像 翻转。      CCHide 隐藏。      CCPlace 设置位置

CCReuseGrid  重用网格              CCShow 显示                      CCStopGrid 停止网格  CCToggleveVisibility  可见切换

            1,放置动作   sp->runAction(CCPlace::create(300,300));    等效于setPosition()

  2,  隐藏动作   sp->runAction(CCHide::create());   等效于setVisible(false);

3,显示动作   sp->runAction(CCShow::create());  等效于 setVisible(true);

    4,水平翻转动作,sp->runAction(CCFlip X::create());等效于 setFlipX(true);

    5,垂直翻转协作,sp->runAction(CCFlip Y::create());等效于setFlipY(true);

延时动作:

延时动作,就是执行需要时间的动作,因此持续动作的静态生成函数,往往附带一个时间值Duration。

持续动作类名一般有两种后缀,一种是To,一种是By,To表示最终达到的目标值,By表示增量值。

例:

CCMoveBy::create(0.5f,ccp(5,5));//表示花0.5秒,按向量(5,5)移动一段距离。

CCMoveTo::create(0.5f,cpp(5,5));//表示花0.5秒,移动到坐标(5,5);

常用的CCActionInterval 子类可以分为三类:

第一类:简单的动作类:

CCMoveTo 移动到                      CCMoveBy 按 ……移动                       CCJumpTo 跳跃到                      CCJumpBy 按……跳跃

CCBezierTo 贝兹移动到             CCBezierBy 按……贝兹移动到          CCRotateTo 旋转到                      CCRotateBy按……旋转

CCScaleTo 缩放到                     CCScaleBy 按……缩放                     CCSkewTO 切变到                       CCSkewBy按……切变

CCTintTo 颜色渐变到      CCTintBy 按……颜色渐变              CCFadeIn 从无到有,也叫淡入       CCFandeOut从有到无,也叫淡出

CCBlink  闪耀                CCFadeTo 改变不透明度到某个值          CCDelayTime  延时。



第二类:复杂的动作类:

CCAnimate 帧动画           CCGridAction家族    网格动画



第三类:组合

CCRepeat    重复执行几次              CCRepeatForever  永远执行  

CCSequence 按序列执行                CCSpawn   同时执行

CCActionEase家族                         补间动画




By为后缀的类,通常会支持反动作。所谓反动作,就是逆向的执行某一个动作。使用方法如下:

CCMoveBy *action1=CCMoveBy::create(2.0f,ccp(100,100));

CCActionInterval &action2=action1->reverse();

那么action2就是一个逆向执行ction1的操作,也可以直接由节点或子类执行。而以To为后缀的动作,通常是不支持反动作的。 

组合


顺序动作序列:(CCSequence)

CCSequence,它的功能是把若干个动作按顺序组合在一起,然后依次执行,NULL是结束标志。


boolHelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

   if ( !CCLayer::init() )

    {

        returnfalse;

    }

    CCSprite *spr=CCSprite::create("Icon.png");

    spr->setPosition(ccp(100,100));

   this->addChild(spr,0,1);

    

    CCLabelTTF *ttf=CCLabelTTF::create("顺序动作","宋体",50);

    CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this,menu_selector(HelloWorld::menuCallback));

    

    label->setPosition(ccp(0,80));

    

   CCMenu *menu=CCMenu::create(label,NULL);

    

   this->addChild(menu);

    

    returntrue;

}

voidHelloWorld::menuCallback(CCObject *pScender)

{

   CCSprite *spr=(CCSprite*)this->getChildByTag(1);

   CCActionInterval *move=CCMoveTo::create(2,ccp(300, spr->getPositionY()));

    CCActionInterval *scale=CCScaleTo::create(2,3);

    CCActionInterval *rotate=CCRotateTo::create(4,190);//旋转

   CCFiniteTimeAction *sep=CCSequence::create(move,scale,rotate,NULL);//顺序动作,一个一直的进行。

    

    spr->runAction(sep);

    

    ((CCMenuItemLabel *)pScender)->setEnabled(false);

    

    

    

    

}

同步动作序列(CCSpawn)
CCSpawn它可以让多个动作同时执行,但是要求这些动作必须是能够同步执行的,也就是说它们相互之间不会产生影响。同步执行最后的完成时间,由组成动作序列的基本动作中。耗时最大的决定。

boolHelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

   if ( !CCLayer::init() )

    {

        returnfalse;

    }

    

    CCSprite *spr=CCSprite::create("Icon.png");

    spr->setPosition(ccp(100,100));

   this->addChild(spr,0, 1);

    CCLabelTTF *ttf=CCLabelTTF ::create("同步动作","宋体",48);

    CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this, menu_selector(HelloWorld::menuCallback));

    label->setPosition(ccp(0,80));

    

   CCMenu *menu=CCMenu::create(label,NULL);

    

   this->addChild(menu);

    

   

       returntrue;

}

voidHelloWorld::menuCallback(CCObject *pSender)

{

   CCSprite *spr=(CCSprite*)this->getChildByTag(1);

   CCActionInterval *move=CCMoveTo::create(5,ccp(300, spr->getPositionY()));//移动

    CCActionInterval *scale=CCScaleTo::create(5,10);//放大。20中放到的倍数

    CCActionInterval *rotate=CCRotateTo::create(4,190);//旋转。190是旋转的度数。

   //同步执行这些动作

   CCFiniteTimeAction *spwn=CCSpawn ::create(move,scale,rotate,NULL);//是按最长的时间去计算。

    spr->runAction(spwn);

    ((CCMenuItemLabel*)pSender)->setEnabled(false);

}



重复动作;

         重复动作类似于循环,可以重复执行某一个动作或者动作序列。重复动作有两种,第一种是重复有限次数的动作。CCRepeat可以按我们给定的次数重复执行动作。只需要将动作序列放入CCRepeat中,并且给定重复次数即可。 第二种重复动作是无限次数的重复动作。对应类为CCRepeatForever.它的功能是一直执行某一个动作或者动作序列。没有次数限制。使用方法和CCRepeat类似,唯一区别就是没有次数参数。


bool HelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

    if ( !CCLayer::init() )

    {

        return false;

    }

    CCSprite *spr=CCSprite::create("Icon.png");

    spr->setPosition(ccp(100,100));

    this->addChild(spr,0,1);

    

    CCLabelTTF *ttf=CCLabelTTF ::create("连续动作","宋体",24);

    CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this, menu_selector(HelloWorld::menuCallback));

    label->setPosition(ccp(0,80));

    

    CCMenu *menu=CCMenu ::create(label,NULL);

    this->addChild(menu);

    

    

        

    return true;

}

voidHelloWorld::menuCallback(CCObject *pScender)

{

    

    CCSprite *spr=(CCSprite*)this->getChildByTag(1);

    CCActionInterval *move=CCMoveTo::create(2,ccp(300, spr->getPositionY()));

    CCActionInterval *move2=CCMoveTo::create(2,ccp(100,100));

    CCFiniteTimeAction *seq=CCSequence::create(move,move2,NULL);

    //按我们给定的次数重复执行动作。

    CCActionInterval *repeat=CCRepeat::create(seq,2);

    spr->runAction(repeat);

     //无限重复执行动作。

//    CCActionInterval *repeatForever=CCRepeatForever::create((CCActionInterval*)seq);//

//    spr->runAction(repeatForever);

   ((CCMenuItemLabel*)pScender)->setEnabled(false);//让按钮失效。pscender是参数是label.

    

    

}








原创粉丝点击