Cocos2d-x人物动作类实例(2)
下面是实现的源代码。
void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //第一个参数传入重复的动作,第二个参数传入重复的次数 CCRepeat * repeat = CCRepeat::create(rotateBy,4); //永远重复执行一个动作 CCRepeatForever * repeatForever = CCRepeatForever::create(rotateBy); if(toggleMenu->getSelectedIndex() == 1) { //通过runAction精灵执行动作 sprite->runAction(repeatForever); } else if(toggleMenu->getSelectedIndex() == 0) { } }
下面再列举一下基本常用的瞬时动作和延续动作。
瞬时动作:
放置Place:效果类似于 setPosition = ccp(x, y)。
隐藏Hide:效果类似于setVisible:false。
显示Show:效果类似于setVisible:true。
可见切换:ToggleVisibility。
延时动作:
移动到CCMoveTo
移动CCMoveBy
跳跃到CCJumpTo设置终点位置和跳跃的高度和次数。
跳跃CCJumpBy设置终点位置和跳跃的高度和次数。
贝塞尔CCBezierBy支持 3 次贝塞尔曲线:P0-起点,P1-起点切线方向,P2-终点切线方向,P3-终点。
放大到CCScaleTo设置放大倍数,是浮点型。
放大CCScaleBy
旋转到CCRotateTo
旋转CCRotateBy
闪烁CCBlink设定闪烁次数
色调变化到CCTintTo
色调变换CCTintBy
变暗到CCFadeTo
由无变亮CCFadeIn
由亮变无CCFadeOut
每个函数的具体用法请大家自行试验。
接下来说一下同步动作序列和顺序动作序列。同步动作序列,就是几个动作同时执行,顺序动作序列,就是传入的几个动作按照顺序顺序执行。以下是他们的继承关系图。
接下来看一下实现的源代码
void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //创建如下几个动作 CCMoveBy * move = CCMoveBy::create(2.0,ccp(100,0)); CCRotateBy * rotate = CCRotateBy::create(2.0,720); CCFiniteTimeAction * moveBack = move->reverse(); CCFiniteTimeAction * rotateBack = rotate->reverse(); CCFlipY * flip = CCFlipY::create(true); //同步动作序列,传入的几个动作同时执行,执行的整个时间是最长的一个动作的执行时间,参数类型是CCFiniteTimeAction //传入的动作(动作的实质就是改变节点的属性)所影响的属性不要有冲突 CCSpawn * spawn = CCSpawn::create(move,rotate,NULL); CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL); //顺序动作序列,传入的几个动作按照传入的顺序顺序执行,执行的整体时间是所有动作的时间之和 CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL); CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL); if(toggleMenu->getSelectedIndex() == 1) { sprite->runAction(spawn); //sprite->runAction(sequence); } else if(toggleMenu->getSelectedIndex() == 0) { sprite->runAction(spawnBack); //sprite->runAction(sequenceBack); } }