您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x CCAction动作学习笔记

2014-01-15 23:34 471 查看
1、ActionManual中设置三个精灵的放缩,旋转,颜色和位置
m_tamara->setScaleX( 2.5f);
m_tamara->setScaleY( -1.0f);
m_tamara->setPosition( ccp(100,70) );
m_tamara->setOpacity( 128);

m_grossini->setRotation( 120);
m_grossini->setPosition( ccp(s.width/2, s.height/2));
m_grossini->setColor( ccc3( 255,0,0));

m_kathia->setPosition( ccp(s.width-100, s.height/2));
m_kathia->setColor( ccBLUE);
2、ActionMove移动处理
centerSprites(3);
CCSize s = CCDirector::sharedDirector()->getWinSize();
-- 分别创建CCMoveTo,CCMoveBy动作
CCActionInterval*  actionTo = CCMoveTo::create(2, ccp(s.width-40, s.height-40));
CCActionInterval*  actionBy = CCMoveBy::create(2, ccp(80,80));
CCActionInterval*  actionByBack = actionBy->reverse();
-- 三个精灵分别执行各自的动作
m_tamara->runAction( actionTo);
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction(CCMoveTo::create(1, ccp(40,40)));
3、ActionScale放缩处理
centerSprites(3);
-- 创建CCScaleTo,CCScaleBy动作
CCActionInterval*  actionTo = CCScaleTo::create(2.0f, 0.5f);
CCActionInterval*  actionBy = CCScaleBy::create(2.0f, 1.0f, 10.0f);
CCActionInterval*  actionBy2 = CCScaleBy::create(2.0f, 5.0f, 1.0f);
m_grossini->runAction( actionTo);
m_tamara->runAction( CCSequence::create(actionBy, actionBy->reverse(), NULL));
m_kathia->runAction( CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
4、创建CCSkewTo动作,参数对应变换时间,x扭曲,y扭曲
// static CCSkewTo* create(float t, float sx, float sy);
// static CCSkewBy* create(float t, float deltaSkewX, float deltaSkewY);
// CCSequence* CCSequence::create(CCFiniteTimeAction *pAction1, ...) 创建可变数目的一系列动作
CCActionInterval *actionTo = CCSkewTo::create(2, 37.2f, -37.2f);
CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
CCActionInterval *actionBy = CCSkewBy::create(2, 0.0f, -90.0f);
CCActionInterval *actionBy2 = CCSkewBy::create(2, 45.0f, 45.0f);
CCActionInterval *actionByBack = actionBy->reverse();
m_tamara->runAction(CCSequence::create(actionTo, actionToBack, NULL));
m_grossini->runAction(CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction(CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
5、创建ActionRotationalSkew变换,fDuration时间内,X方向旋转变化fDeltaAngleX,Y方向旋转变化fDeltaAngleY
// CCRotateTo* CCRotateTo::create(float fDuration, float fDeltaAngleX, float fDeltaAngleY)
// CCRotateBy* CCRotateBy::create(float fDuration, float fDeltaAngleX, float fDeltaAngleY)
CCRotateTo* actionTo = CCRotateTo::create(2, 37.2f, -37.2f);
CCRotateTo* actionToBack = CCRotateTo::create(2, 0, 0);
CCRotateBy* actionBy = CCRotateBy::create(2, 0.0f, -90.0f);
CCRotateBy* actionBy2 = CCRotateBy::create(2, 45.0f, 45.0f);
CCRotateBy* actionByBack = (CCRotateBy*)actionBy->reverse();

m_tamara->runAction(CCSequence::create(actionTo, actionToBack, NULL));
m_grossini->runAction(CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction(CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
6、ActionRotationalSkewVSStandardSkew旋转扭曲与标准扭曲对比
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCSize boxSize = CCSizeMake(100.0f, 100.0f);
// 创建一个CCLayerColor层颜色:ccc4(255,255,0,255),设置锚点,内容大小,开启锚点有效,然后把它加入到场景中
CCLayerColor *box = CCLayerColor::create(ccc4(255,255,0,255));
box->setAnchorPoint(ccp(0.5,0.5));
box->setContentSize( boxSize );
box->ignoreAnchorPointForPosition(false);
box->setPosition(ccp(s.width/2, s.height - 100 - box->getContentSize().height/2));
this->addChild(box);
// 添加描述性文字,1:显示字符串,2:字体名称,3:字体大小
// CCLabelTTF * CCLabelTTF::create(const char *string, const char *fontName, float fontSize)
CCLabelTTF *label = CCLabelTTF::create("Standard cocos2d Skew", "Marker Felt", 16);
label->setPosition(ccp(s.width/2, s.height - 100 + label->getContentSize().height));
this->addChild(label);
// 创建动作序列 ,对应Standard cocos2d Skew
CCSkewBy* actionTo = CCSkewBy::create(2, 360, 0);
CCSkewBy* actionToBack = CCSkewBy::create(2, -360, 0);
box->runAction(CCSequence::create(actionTo, actionToBack, NULL));

box = CCLayerColor::create(ccc4(255,255,0,255));
box->setAnchorPoint(ccp(0.5,0.5));
box->setContentSize(boxSize);
box->ignoreAnchorPointForPosition(false);
box->setPosition(ccp(s.width/2, s.height - 250 - box->getContentSize().height/2));
this->addChild(box);
label = CCLabelTTF::create("Rotational Skew", "Marker Felt", 16);
label->setPosition(ccp(s.width/2, s.height - 250 + label->getContentSize().height/2));
this->addChild(label);
// 创建动作序列,对应Rotational Skew
CCRotateBy* actionTo2 = CCRotateBy::create(2, 360, 0);
CCRotateBy* actionToBack2 = CCRotateBy::create(2, -360, 0);
box->runAction(CCSequence::create(actionTo2, actionToBack2, NULL));
7、ActionSkewRotateScale创建不同动作的组合
CCSize boxSize = CCSizeMake(100.0f, 100.0f);
// 创建一个box层用来执行动画序列
CCLayerColor *box = CCLayerColor::create(ccc4(255, 255, 0, 255));
box->setAnchorPoint(ccp(0, 0));
box->setPosition(ccp(190, 110));
box->setContentSize(boxSize);
// 创建两个小格子,红色左边,蓝色右边
static float markrside = 10.0f;
CCLayerColor *uL = CCLayerColor::create(ccc4(255, 0, 0, 255));
box->addChild(uL);
uL->setContentSize(CCSizeMake(markrside, markrside));
uL->setPosition(ccp(0.f, boxSize.height - markrside));
uL->setAnchorPoint(ccp(0, 0));

CCLayerColor *uR = CCLayerColor::create(ccc4(0, 0, 255, 255));
box->addChild(uR);
uR->setContentSize(CCSizeMake(markrside, markrside));
uR->setPosition(ccp(boxSize.width - markrside, boxSize.height - markrside));
uR->setAnchorPoint(ccp(0, 0));
addChild(box);
// 创建扭曲,旋转,放缩的动作序列
CCActionInterval *actionTo = CCSkewTo::create(2, 0.f, 2.f);
CCActionInterval *rotateTo = CCRotateTo::create(2, 61.0f);
CCActionInterval *actionScaleTo = CCScaleTo::create(2, -0.44f, 0.47f);

CCActionInterval *actionScaleToBack = CCScaleTo::create(2, 1.0f, 1.0f);
CCActionInterval *rotateToBack = CCRotateTo::create(2, 0);
CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
// 这里让颜色层同时执行三个动画,runAction会把动作对象和主角传给动画管理器,这些动画会存入相应的动画集,动画管理器会在每一帧更新相应的动画,
// 虽然他们是动画序列但本身仍然是动画,所以多次调用runAction会将多个动画或动画序列同时播放
box->runAction(CCSequence::create(actionTo, actionToBack, NULL));
box->runAction(CCSequence::create(rotateTo, rotateToBack, NULL));
box->runAction(CCSequence::create(actionScaleTo, actionScaleToBack, NULL));
8、旋转动作序列,时间-旋转角度
// CCRotateTo* CCRotateTo::create(float fDuration, float fDeltaAngle)
// CCRotateBy* CCRotateBy::create(float fDuration, float fDeltaAngle)
CCActionInterval*  actionTo = CCRotateTo::create( 2, 45);
CCActionInterval*  actionTo2 = CCRotateTo::create( 2, -45);
CCActionInterval*  actionTo0 = CCRotateTo::create(2 , 0);
m_tamara->runAction( CCSequence::create(actionTo, actionTo0, NULL));

CCActionInterval*  actionBy = CCRotateBy::create(2 ,  360);
CCActionInterval*  actionByBack = actionBy->reverse();
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction( CCSequence::create(actionTo2, actionTo0->copy()->autorelease(), NULL));
9、跳动动画序列,时间-位置点-跳跃高度-跳跃次数(to:跳到position,by:相对于当前位置跳转position标示的相对位置)
// CCJumpTo* CCJumpTo::create(float duration, const CCPoint& position, float height, int jumps)
// CCJumpBy* CCJumpBy::create(float duration, const CCPoint& position, float height, unsigned int jumps)
CCActionInterval*  actionTo = CCJumpTo::create(2, ccp(300,300), 50, 4);
CCActionInterval*  actionBy = CCJumpBy::create(2, ccp(300,0), 50, 4);
CCActionInterval*  actionUp = CCJumpBy::create(2, ccp(0,0), 80, 4);
CCActionInterval*  actionByBack = actionBy->reverse();

m_tamara->runAction( actionTo);
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction( CCRepeatForever::create(actionUp));
10、贝塞尔曲线动作序列ActionBezier 
// CCBezierBy* CCBezierBy::create(float t, const ccBezierConfig& c)		时间-贝塞尔参数创建贝塞尔曲线动作序列
// CCRepeatForever *CCRepeatForever::create(CCActionInterval *pAction)		根据CCActionInterval对象创建永久性动作
// 设置贝塞尔曲线的控制参数,控制点1-控制点2-结束点
ccBezierConfig bezier;
bezier.controlPoint_1 = ccp(0, s.height/2);
bezier.controlPoint_2 = ccp(300, -s.height/2);
bezier.endPosition = ccp(300,100);

CCActionInterval*  bezierForward = CCBezierBy::create(3, bezier);
CCActionInterval*  bezierBack = bezierForward->reverse();
CCAction*  rep = CCRepeatForever::create(CCSequence::create( bezierForward, bezierBack, NULL));
m_grossini->runAction( rep);
11、闪烁动画序列ActionBlink 时间-闪烁次数
// CCBlink* CCBlink::create(float duration, unsigned int uBlinks)
CCActionInterval*  action1 = CCBlink::create(2, 2);
CCActionInterval*  action2 = CCBlink::create(2, 10);

m_tamara->runAction( action1);
m_kathia->runAction(action2);
12、消隐动作序列CCFadeIn
// CCFadeIn* CCFadeIn::create(float d)			淡入(时间)
// CCFadeOut* CCFadeOut::create(float d)		淡出(时间)
CCActionInterval*  action1 = CCFadeIn::create(1.0f);
CCActionInterval*  action1Back = action1->reverse();
CCActionInterval*  action2 = CCFadeOut::create(1.0f);
CCActionInterval*  action2Back = action2->reverse();

m_tamara->runAction( CCSequence::create( action1, action1Back, NULL));
m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
13、色调调节CCTintTo/CCTintBy
// static CCTintTo* create(float duration, GLubyte red, GLubyte green, GLubyte blue);					时间-rgb颜色
// static CCTintBy* create(float duration, GLshort deltaRed, GLshort deltaGreen, GLshort deltaBlue);	时间-rgb颜色
CCActionInterval*  action1 = CCTintTo::create(2, 255, 0, 255);
CCActionInterval*  action2 = CCTintBy::create(2, -127, -255, -127);
CCActionInterval*  action2Back = action2->reverse();

m_tamara->runAction( action1);
m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
14、ActionAnimate动画效果
// static CCAnimation* create(void);							创建动画效果
// void addSpriteFrameWithFileName(const char *pszFileName);	根据文件名创建精灵帧,并加入到动画序列中,有一定的时延
// static CCAnimate* create(CCAnimation *pAnimation);			根据动画创建动作序列,能恢复到最初的精灵帧
// void addAnimationsWithFile(const char* plist);				根据给定的plist文件添加一个动画序列
// CCAnimation* animationByName(const char* name);				根据文件名获取之前添加的动画序列
// 定义一个来创建保护成员变量,和它的一套获取设置方,方便快捷的设置对象的属性
// #define CC_SYNTHESIZE(varType, varName, funName)\
// protected: varType varName;\
// public: virtual varType get##funName(void) const { return varName; }\
// public: virtual void set##funName(varType var){ varName = var; }
CCAnimation* animation = CCAnimation::create();
for( int i=1;i<15;i++)
{
char szName[100] = {0};
sprintf(szName, "Images/grossini_dance_%02d.png", i);
animation->addSpriteFrameWithFileName(szName);
}
// 设置每个精灵帧的时延为2.8f / 14.0f,并恢复到最初的精灵帧
animation->setDelayPerUnit(2.8f / 14.0f);
animation->setRestoreOriginalFrame(true);
//根据动画创建动作序列用来执行实际的动作
CCAnimate* action = CCAnimate::create(animation);
m_grossini->runAction(CCSequence::create(action, action->reverse(), NULL));

//从plist文件创建动画效果
CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache();
cache->addAnimationsWithFile("animations/animations-2.plist");
CCAnimation *animation2 = cache->animationByName("dance_1");

CCAnimate* action2 = CCAnimate::create(animation2);
m_tamara->runAction(CCSequence::create(action2, action2->reverse(), NULL));

//设置循环4次
CCAnimation *animation3 = (CCAnimation *)animation2->copy()->autorelease();
animation3->setLoops(4);
CCAnimate* action3 = CCAnimate::create(animation3);
m_kathia->runAction(action3);
15、动作序列创建
// CCSequence* CCSequence::create(CCFiniteTimeAction *pAction1, ...)	创建可变动个数的动作序列
CCFiniteTimeAction*  action = CCSequence::create(
CCMoveBy::create( 2, ccp(240,0)),
CCRotateBy::create( 2,  540),
NULL);

m_grossini->runAction(action);
动作完成之后处理不同的函数
// static CCPlace * create(const CCPoint& pos);														创建节点在pos位置
// static CCShow * create();																		创建节点,并初始化
// static CCCallFunc * create(CCObject* pSelectorTarget, SEL_CallFunc selector);					创建动作附带的回调函数,无参
// static CCCallFuncN * create(CCObject* pSelectorTarget, SEL_CallFuncN selector);					创建动作附带的回调函数,节点对象
// static CCCallFuncND * create(CCObject* pSelectorTarget, SEL_CallFuncND selector, void* d);		创建动作附带的回调函数,节点对象-数据
CCFiniteTimeAction*  action = CCSequence::create(
CCPlace::create(ccp(200,200)),
CCShow::create(),
CCMoveBy::create(1, ccp(100,0)),
CCCallFunc::create(this, callfunc_selector(ActionSequence2::callback1)),
CCCallFuncN::create(this, callfuncN_selector(ActionSequence2::callback2)),
CCCallFuncND::create(this, callfuncND_selector(ActionSequence2::callback3), (void*)0xbebabeba),
NULL);

m_grossini->runAction(action);

对应的三个回调函数,我们可在里面进行相应的处理
void ActionSequence2::callback1()
void ActionSequence2::callback2(CCNode* sender)
void ActionSequence2::callback3(CCNode* sender, void* data)
16、连续的动作序列
// static CCSpawn* create(CCFiniteTimeAction *pAction1, ...);	传入动作序列,他会同时执行这几个动作
CCAction*  action = CCSpawn::create(
CCJumpBy::create(2, ccp(300,0), 50, 4),
CCRotateBy::create( 2,  720),
NULL);

m_grossini->runAction(action);
17、逆序动作序列ActionReverse
// virtual CCActionInterval* reverse(void);	返回这个动作序列的逆序列
CCActionInterval*  jump = CCJumpBy::create(2, ccp(300,0), 50, 4);
CCFiniteTimeAction*  action = CCSequence::create( jump, jump->reverse(), NULL);
m_grossini->runAction(action);
18、重复性的序列动作
// static CCRepeat* create(CCFiniteTimeAction *pAction, unsigned int times);	要重复的动作序列-次数
// static CCRepeatForever* create(CCActionInterval *pAction);					一直持续性的动作序列
CCActionInterval*  a1 = CCMoveBy::create(1, ccp(150,0));
CCActionInterval*  action1 = CCRepeat::create(
CCSequence::create( CCPlace::create(ccp(60,60)), a1, NULL) ,
3);
CCAction*  action2 = CCRepeatForever::create(
CCSequence::create((CCActionInterval*)(a1->copy()->autorelease()), a1->reverse(), NULL)
);
m_kathia->runAction(action1);
m_tamara->runAction(action2);
19、延时性的动作序列
// static CCDelayTime* create(float d);		延迟的时间,单位:秒
CCActionInterval*  move = CCMoveBy::create(1, ccp(150,0));
CCFiniteTimeAction*  action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);
m_grossini->runAction(action);
20、逆序的一组动作序列
// 这里的CCSequence本质上还是一个动作序列,虽然他包括了一组的动作序列,所以我们可以对他直接取逆序操作
CCActionInterval*  move1 = CCMoveBy::create(1, ccp(250,0));
CCActionInterval*  move2 = CCMoveBy::create(1, ccp(0,50));
CCFiniteTimeAction*  seq = CCSequence::create( move1, move2, move1->reverse(), NULL);
CCFiniteTimeAction*  action = CCSequence::create( seq, seq->reverse(), NULL);
m_grossini->runAction(action);

//   一组动作序列包括IntervalAction和InstantActions两种
// class CC_DLL CCToggleVisibility : public CCActionInstant	转变节点的可见性,new出来的要自动释放(显示调用autorelease)
CCActionInterval*  move1 = CCMoveBy::create(1, ccp(250,0));
CCActionInterval*  move2 = CCMoveBy::create(1, ccp(0,50));
CCToggleVisibility*  tog1 = new CCToggleVisibility();
CCToggleVisibility*  tog2 = new CCToggleVisibility();
tog1->autorelease();
tog2->autorelease();
CCFiniteTimeAction*  seq = CCSequence::create( move1, tog1,tog2, move2,  move1->reverse(), NULL);
CCActionInterval*  action = CCRepeat::create(CCSequence::create( seq, seq->reverse(), NULL), 3);
m_kathia->runAction(action);

//   class CC_DLL CCHide : public CCActionInstant 用来隐藏一个节点
CCActionInterval*  move_tamara = CCMoveBy::create(1, ccp(100,0));
CCActionInterval*  move_tamara2 = CCMoveBy::create(1, ccp(50,0));
CCActionInstant*  hide = CCHide::create();
CCFiniteTimeAction*  seq_tamara = CCSequence::create( move_tamara, hide, move_tamara2, NULL);
CCFiniteTimeAction*  seq_back = seq_tamara->reverse();
m_tamara->runAction( CCSequence::create( seq_tamara, seq_back, NULL));
21、创建一个球面坐标轨迹进行的旋转动作序列
// 参数:旋转轨迹的时间差-起始半径-半径差-起始z角-旋转z角差-起始x角-旋转x角差
// static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX);

CCActionInterval*  orbit1 = CCOrbitCamera::create(2,1, 0, 0, 180, 0, 0);
CCSequence*  action1 = CCSequence::create(
orbit1,
orbit1->reverse(),
NULL);
m_kathia->runAction(CCRepeatForever::create(action1));

CCActionInterval*  move = CCMoveBy::create(3, ccp(100,-100));
CCActionInterval*  move_back = move->reverse();
CCSequence*  seq = CCSequence::create(move, move_back, NULL);
CCAction*  rfe = CCRepeatForever::create(seq);
m_kathia->runAction(rfe);
22、移除节点动作
// static CCRemoveSelf * create(bool isNeedCleanUp = true);	移除自身,并默认清空自身
CCFiniteTimeAction*  action = CCSequence::create(
CCMoveBy::create( 2, ccp(240,0)),
CCRotateBy::create( 2,  540),
CCScaleTo::create(1,0.1f),
CCRemoveSelf::create(),
NULL);
m_grossini->runAction(action);
23、ActionRepeatForever重复动作放在动作的毁掉函数中
CCFiniteTimeAction*  action = CCSequence::create(
CCDelayTime::create(1),
CCCallFuncN::create( this, callfuncN_selector(ActionRepeatForever::repeatForever) ),
NULL);

m_grossini->runAction(action);
// 回调加入永远执行的旋转动作
void ActionRepeatForever::repeatForever(CCNode* pSender)
{
CCRepeatForever *repeat = CCRepeatForever::create( CCRotateBy::create(1.0f, 360) );
pSender->runAction(repeat);
}
// 旋转的重复动作
CCActionInterval*  act1 = CCRotateTo::create(1, 90);
CCActionInterval*  act2 = CCRotateTo::create(1, 0);
CCActionInterval*  seq = CCSequence::create(act1, act2, NULL);
CCAction*  rep1 = CCRepeatForever::create(seq);
m_tamara->runAction(rep1);
24、创建跟随动作CCFollow
// static CCFollow* create(CCNode *pFollowedNode, const CCRect& rect = CCRectZero);    创建跟随动作序列,在指定的矩形区域中
CCSize s = CCDirector::sharedDirector()->getWinSize();
m_grossini->setPosition(ccp(-200, s.height / 2));
// 创建相对移动的动作序列
CCActionInterval* move      = CCMoveBy::create(2, ccp(s.width * 3, 0));
CCActionInterval* move_back = move->reverse();
CCSequence* seq       = CCSequence::create(move, move_back, NULL);
CCAction* rep               = CCRepeatForever::create(seq);
m_grossini->runAction(rep);
// 在指定的区域CCRectMake跟随精灵m_grossini,
this->runAction(CCFollow::create(m_grossini, CCRectMake(0, 0, s.width * 2 - 100, s.height)));

// 绘制精灵移动的部分举行区域
void ActionFollow::draw()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();

float x = winSize.width*2 - 100;
float y = winSize.height;

CCPoint vertices[] = { ccp(5,5), ccp(x-5,5), ccp(x-5,y-5), ccp(5,y-5) };
ccDrawPoly(vertices, 4, true);
}
25、创建指定节点对象的动作序列,可以使两个对象按照顺序演示动作序列
// static CCTargetedAction* create(CCNode* pTarget, CCFiniteTimeAction* pAction);  根据一个节点对象和动作序列创建,把动作序列绑定到节点对象
CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
CCRotateBy* rot1 =  CCRotateBy::create(1, 360);
CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease();
// 把jump2和rot2动作序列绑定到精灵m_kathia
CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2);
CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
CCRepeatForever *always = CCRepeatForever::create(seq);
m_tamara->runAction(always);
26、添加震动的精灵动作序列
// static CCTargetedAction* create(CCNode* pTarget, CCFiniteTimeAction* pAction);  根据一个节点对象和动作序列创建,把动作序列绑定到节点对象
CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
CCRotateBy* rot1 =  CCRotateBy::create(1, 360);
CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease();
// 把jump2和rot2动作序列绑定到精灵m_kathia
CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2);
CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
CCRepeatForever *always = CCRepeatForever::create(seq);
m_tamara->runAction(always);
27、添加暂停,重新执行动作序列处理
// 在3秒暂停旋转动作,5s恢复动作序列
m_tamara->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));
m_grossini->runAction(CCRepeatForever::create(CCRotateBy::create(3, -360)));
m_kathia->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));

this->schedule(schedule_selector(PauseResumeActions::pause), 3, false, 0);
this->schedule(schedule_selector(PauseResumeActions::resume), 5, false, 0);

void PauseResumeActions::pause(float dt)
{
// 暂停所有的运行动作
CCLog("Pausing");
CCDirector *director = CCDirector::sharedDirector();
CC_SAFE_RELEASE(m_pPausedTargets);
m_pPausedTargets = director->getActionManager()->pauseAllRunningActions();
CC_SAFE_RETAIN(m_pPausedTargets);
}

void PauseResumeActions::resume(float dt)
{
// 恢复所有的动作序列的执行
CCLog("Resuming");
CCDirector *director = CCDirector::sharedDirector();
director->getActionManager()->resumeTargets(m_pPausedTargets);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: