http://blog.csdn.net/tspangle/article/details/23369247
1、动作基本概念
CCAction是动作的基类,所有的动作都派生自此类。CCAction的一个对象就是一个动作,动作或动画只能由CCNode来执行
CCSprite* sp = CCSprite::create("Icon.png");//创建一个精灵 sp->setPosition( ccp(20,20) );//设置精灵初始位置 this->addChild(sp,0);//添加精灵到场景中 CCAction *action = CCMoveTo::create(1.0f,ccp(0,0));//创建一个CCMoveTo动作,1s之内移动到ccp(0,0)位置 sp->runAction(action);//执行动作
同一时间段内,一个动作只能由一个CCNode来执行,如果想N个CCNode同时执行一个动作,要使用copy复制动作:
CCAction *action = CCMoveTo::create(4.0f,0)); sp1->runAction((CCAction *)action->copy());
CCAction有一个派生类CCFiniteTimeAction,这个类中定义了一个reverse方法,此方法的作用是逆置动作,就是原动作的相反动作。绝大数我们使用的动作类都派生自CCFiniteTimeAction,如最常用的CCActionInterval(持续性动作)、CCActionInstant(瞬时动作),这两个类又分别派生出许多我们实际用到的动作类。
2、瞬时动作
瞬时动作就是立刻完成的动作,其持续的动作时间为0,这些动作的实现可以通过设置CCNode的属性来完成,通过动作的封装,使其可以和其他动作组合成复杂的动作。
常用的瞬时动作:
1)CCPlace -- 将该节点放置到某个位置,和设置CCNode中的Position属性效果相同
CCFiniteTimeAction *action = CCPlace::create(ccp(0,0)); sp->runAction(action);
2)CCFlipX和CCFlipY -- 将节点沿X和Y反向显示,与CCNode中的FlipX和FlipY效果相同
//CCFiniteTimeAction *action = CCFlipX::create(true); CCFiniteTimeAction *action = CCFlipY::create(true); sp->runAction(action);
3)CCShow和CCHide -- 分别用于显示和隐藏节点,和Visible效果相同
//CCFiniteTimeAction *action1 = CCHide::create(); CCFiniteTimeAction *action2 = CCShow::create(); sp->runAction(action2);
3、动作回调函数
当一个CCNode执行完某个Action后,我们可能需要做一些其他的工作,这时,可以使用动作回调函数来完成这项功能。在一个动作完成之后随即调用动作回调函数,这种类型的函数有4种形式可供我们选择使用:
1)CCCallFunc:无参回调函数
//创建一个在1s内移动到ccp(0,0)位置的动作 CCFiniteTimeAction *action = CCMoveTo::create(1,0)); //创建一个在1s内移动到ccp(size.width/2,size.height/2)位置的动作 CCFiniteTimeAction *action1 = CCMoveTo::create(1,ccp(size.width/2,size.height/2)); //创建不带参数的动作回调,当动作执行完成后,调用该函数 CCFiniteTimeAction *action2 = CCCallFunc::create(this,callfunc_selector(HelloWorld::actionCallBack)); //循环执行动作 sp->runAction(CCRepeatForever::create(CCSequence::create(action,action1,action2,NULL))); void HelloWorld::actionCallBack() { //设置背景显示/隐藏 if(m_SpBackground->isVisible()) { m_SpBackground->setVisible(false); } else { m_SpBackground->setVisible(true); } }
2)CCCallFuncN:带一个CCNode*参数回调函数,“N”表示CCNode
//创建带一个CCNode*参数的动作回调,当动作执行完成后,调用并向该函数传递执行动作的那个CCNode对象 CCFiniteTimeAction *action2 = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::actionCallBack)); void HelloWorld::actionCallBack(cocos2d::CCNode *node) { //参数node就是执行动作的那个对象,这里测试每次动作执行完成后,设置这个对象的缩放值 CCAssert(node,"node is null"); if (node->getScaleX() > 1.0f || node->getScaleY() > 1.0f) { node->setScale(1.0f); } else { node->setScale(2.0f); } }