第三讲 Action动作

来源:互联网 发布:gif动画录制软件 编辑:程序博客网 时间:2024/04/29 04:14
一、基本动作
创建并执行一个动作方法如下:
CCAction *action = //后面跟动作的创建方法
node->runAction(action);//node为一个创建好的节点或节点的子类

CCAction中包含三个子类:
CCFollow:调整动作的执行速度
CCSpeed:使节点跟随指定的另一个节点移动
CCFiniteTimeAction:加入了时间属性的动画类,用于派生各种由时间插入值进行计算的动画

CCFiniteTimeAction还有两个子类
1、瞬时动作(CCActionInstant)
定义:不需要时间等待,即刻完成
CCActionInstant
CCCallFunc:回调函数
CCFlipX:水平翻转(以X为轴)
CCFlipY:垂直翻转(以Y为轴)
CCHide:隐藏
CCShow:显示
CCPlace:放置[ 相当于setPosition(ccp(x,y)) ]
CCReuseGrid
CCStopGrid
CCToggleVisibility
实例:

bool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !CCLayer::init() )    {        return false;    }    CCSprite *sp = CCSprite::create("Icon.png");    sp->setPosition(ccp(100, 100));    this->addChild(sp,0,1);        CCMenuItemFont *label = CCMenuItemFont::create("放置动作");    CCMenuItemFont *label1 = CCMenuItemFont::create("隐藏动作");    CCMenuItemFont *label2 = CCMenuItemFont::create("显示动作");    CCMenuItemFont *label3 = CCMenuItemFont::create("水平翻转动作");    CCMenuItemFont *label4 = CCMenuItemFont::create("垂直翻转动作");    CCMenuItemToggle *toggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::func), label,label1,label2,label3,label4,NULL);    CCMenu *menu = CCMenu::create(toggle,NULL);    this->addChild(menu);            return true;}//执行按钮时的回调函数void HelloWorld::func(CCObject *pSender){    //获取当前层中编号为1的精灵对象    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    static int index = 0;    switch (index) {        case 0:            //定义移动位置            sp->runAction(CCPlace::create(ccp(300, 100)));            break;        case 1:            //隐藏            sp->runAction(CCHide::create());            break;        case 2:            //显示            sp->runAction(CCShow::create());            break;        case 3:            //水平翻转(以X为轴)            sp->runAction(CCFlipX::create(true));            break;        case 4:            //垂直翻转(以Y为轴)            sp->runAction(CCFlipY::create(true));            break;      }    index = index == 4 ? 0 : index + 1;}


瞬时动作(CCActionInstant)——>子类:CCCallfunc家族

    当一个动作或动作序列结束以后,需要调用某个函数用于执行一个任务的时候使用CCCallfunc家族

(1)CCCallfunc:无参普通的回调函数

(2)CCCallfuncN:传递当前调用的精灵对象

(3)CCCallfuncND:传递当前调用的精灵对象,和一个任意类型数据

(4)CCCallfuncO:传递当前调用的精灵对象,任意的cocos2d的对象




2、延时动作(CCActionInterval)
定义:执行需要一定时间的动作,即该动作在指定的时间内完成,有过渡效果
持续动作类名一般有两种后缀,一种时To,一种时By
To表示最终达到的目标值,By表示增量
例:
CCMoveTo::create(0.5f,ccp(5,5));//相对坐标原点,移动指定位置CCMoveBy::create(0.5f,ccp(5,5));//相对节点自身移动,以当前节点为原点


(1)简单动作类
CCMoveTo移动到CCMoveBy按…移动            例:
如果有一个多次点击的功能按钮,那它的回调函数是

void HelloWorld::menuCallback(CCObject *pScene){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    static int index = 0;    switch (index) {        case 0:        {            //移动到(时间,目标参数位置)            CCActionInterval *moveTo = CCMoveTo::create(5, ccp(300, 100));            sp->runAction(moveTo);            break;        }        case 1:        {            //移动到(时间,从目前位置移动的位移)            CCActionInterval * moveBy = CCMoveBy::create(5, ccp(100, 100));            //reverse 动作moveBy的反向动作            CCActionInterval * actionByBack = moveBy->reverse();            sp->runAction(actionByBack);            break;        }        case 2:        {            //跳(时间,位置,高度,次数)            //参数1:跳跃所需的时间,参数2:跳跃到的位置,参数3为跳跃的高度,参数4:次数            CCActionInterval * jumpTo = CCJumpTo::create(2, ccp(300, 200), 50, 4);            sp->runAction(jumpTo);            break;        }        case 3:        {            //跳(时间,相对当前的目标位置,高度,次数)            //参数1:跳跃所需的时间,参数2:从目前基础上再跳跃的参数,参数3:高度,参数4:次数            CCActionInterval * jumpBy = CCJumpBy::create(2, ccp(200, 100), 50, 4);            //跳(动作jumpBy的反向动作            CCActionInterval * actionByBack = jumpBy->reverse();            sp->runAction(actionByBack);            break;        }        case 4:        {            //淡入(动作所需要的时间)            CCActionInterval * fadeOut = CCFadeOut::create(2);            sp->runAction(fadeOut);            break;        }        case 5:        {            //淡出(动作所需要的时间)            CCActionInterval * fadeIn = CCFadeOut::create(2);            sp->runAction(fadeIn);            break;        }    }    index = index == 5 ? 0 : index + 1;}

(2)复杂动作类
CCAnimate帧动画CCGridAction网格动画
(3)组合动作类
CCRepeat重复执行几次CCRepeatForever永远重复执行        
1)重复动作(CCRepeat、CCRepeatForever):类似于循环,可以重复执行某一个动作或者动作序列
例:如果有一个多次点击的功能按钮,那它的回调函数是
void HelloWorld::menuCallback(CCObject * pSender){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);       //定义两个动作 move and move2    CCActionInterval* move = CCMoveTo::create(2, ccp(300, sp->getPositionY()));    CCActionInterval* move2 = CCMoveTo::create(2, ccp(100, 100));        //创建一个顺序序列    CCFiniteTimeAction* seq = CCSequence::create(move,move2,NULL);        //创建一个重复动作(动作或者动作序列,重复次数)    CCActionInterval* repeat = CCRepeat::create(seq, 2);//参数2为重复次数    sp->runAction(repeat);    //CCActionInterval* repeatForever = CCRepeatForever::create((CCActionInterval*)seq);   //无限重复    //sp->runAction(repeatForever);        //按钮失效其中pSender是label    ((CCMenuItemLabel*)pSender)->setEnabled(false);    }


2)同步动作序列(CCSpawn):同时执行多个动作,最后完成时间以组成动作序列中基本动作耗时最大的决定
如:一边移动、一边放大、一边旋转
例:如果有一个多次点击的功能按钮,那它的回调函数是

void HelloWorld::menuCallback(CCObject* pSender){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    //创建延时动作移动、放大、旋转    CCActionInterval* move = CCMoveTo::create(1, ccp(300, sp->getPositionY()));//移动(时间,位移坐标)    CCActionInterval* scale = CCScaleTo::create(1, 3);//放大(时间,倍数)    CCActionInterval* rotate = CCRotateTo::create(1, 190);//旋转(时间,角度)        //将以上动作对象创建顺序序列    CCActionInterval* spwn = CCSpawn::create(move,scale,rotate,NULL);    sp->runAction(spwn);    //禁用按钮    ((CCMenuItemLabel *)pSender)->setEnabled(false);}



3)顺序动作序列(CCSequence):让节点一个接一个的执行
例:如果有一个多次点击的功能按钮,那它的回调函数是

void HelloWorld::menuCallback(CCObject* pSender){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    //创建延时动作移动、放大、旋转    CCActionInterval* move = CCMoveTo::create(2, ccp(300, sp->getPositionY()));    CCActionInterval* scale = CCScaleTo::create(2, 3);    CCActionInterval* rotate = CCRotateTo::create(4, 190);        //将以上动作对象创建顺序序列    CCFiniteTimeAction* seq = CCSequence::create(move,scale,rotate,NULL);    sp->runAction(seq);        //禁用按钮    ((CCMenuItemLabel *)pSender)->setEnabled(false);    }


3、跟随动作(CCFollow

void HelloWorld::menuCallback(CCObject* pSender){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    sp->runAction(CCMoveTo::create(2, ccp(930, sp->getPositionY())));//精灵向右运动    CCFollow* follow = CCFollow::create(sp,CCRectMake(0, 0, 960, 320));    //精灵在屏幕上不动,背景向左移动,第二个参数是移动范围    this->runAction(follow);}

4、速度(CCSpeed

void HelloWorld::menuCallback(CCObject* pSender){    CCSprite *sp = (CCSprite*)this->getChildByTag(1);    CCActionInterval *move = CCMoveTo::create(10, ccp(300, sp->getPositionY()));    //参数2对于1时,加速度快,所用时间改为原时间/参数2;小于1时,速度减慢    CCSpeed *speed = CCSpeed::create(move, 20);    sp->runAction(speed);}


0 0
原创粉丝点击