前面的学习笔记以已经大致理解了持续动作,他的重要性就不再次强调了。今天要实现的效果是精灵首先有一个缩放动作然后移动到指定位置再缩放,最后返回原地再缩放。
首先还还是要修改一下项目,以便我们观察,修改后运行如下图:
红色框中就是执行动作的精灵
直接上代码:
1 void HelloWorld::menuCloseCallback(CCObject* pSender) 2 { 3 CCSprite *pSprite = (CCSprite *)this->getChildByTag(100); 4 CCAction *pAction= pSprite->getActionByTag(200); 5 if(pAction!=NULL && !pAction->isDone()) // 动作完成检查 6 return; // 动作完成检查 7 CCActionInterval *pActionScaleBy = CCScaleBy::create(2,0.8); /*pActionBy 注释代码是用的这个变量名*/ 8 CCActionInterval *pActionMoveTo = CCMoveTo::create(3,ccp(300,200)); 9 CCActionInterval *pActionMoveToBack =pActionMoveTo->reverse(); 10 11 CCActionInterval *pActionMoveBy = CCMoveBy::create(3,ccp(300,200)); 12 //这样的写法并不完美,我在连续(动作还没有执行完)点击按钮后 13 //程序没有按照预期运行,猜测应该是没有做线程安全处理, 14 //所有在CCAction类中提供了 isDone方法,来检查动作是否完成 15 //后面加上加上了检查,运行正常 16 CCActionInterval *pSeq = CCSequence::create( 17 pActionScaleBy,pActionScaleBy->reverse(), 18 pActionMoveBy, 19 pActionScaleBy,pActionScaleBy->reverse(), 20 pActionMoveBy->reverse(), 21 pActionScaleBy,pActionScaleBy->reverse(), 22 NULL);//CCSequence最后一个参数必须是NULL 23 pSeq->setTag(200); // 动作完成检查 24 25 //------------ 几种失败的方案----------------------- 26 //如下123三中方案,都出问题,起初以为在系列动作中使用动作后精灵没有保留原始的状态信息, 27 //后来一想不对呀,我是首先创建完系列动作后在执行的呀, 28 //最后测试CCMoveTo的时候发现,还是reverse惹的祸,CCMoveTo没有实现这个方法 29 //有鉴于此,动作类中的reverse方法需要单独整理一下 30 // 1 31 /*CCActionInterval *pSeq = CCSequence::create( 32 pActionBy,pActionBy->reverse(), 33 pActionMoveTo, 34 pActionBy,pActionBy->reverse(), 35 pActionMoveToBack, 36 pActionBy,pActionBy->reverse(), 37 NULL);*/ 38 // 2 39 /*CCActionInterval *pSeq = CCSequence::create( 40 pActionBy,pActionBy->reverse(), 41 pActionMoveTo, 42 pActionBy,pActionBy->reverse(), 43 pActionMoveTo->reverse(), 44 pActionBy,pActionBy->reverse(), 45 NULL);*/ 46 // 3 47 /*CCActionInterval *pSeqSub = CCSequence::create( 48 pActionBy,pActionBy->reverse(), 49 pActionMoveTo, 50 NULL); 51 CCActionInterval *pSeq = CCSequence::create(pSeqSub , 52 pActionBy,pActionBy->reverse(), 53 pSeqSub->reverse(), 54 NULL);*/ 55 //------------ 几种失败的方案----------------------- 56 57 //------------ 缩放 这个组合报错,原因是CCScaleTo没有实现reverse方法-------- 58 //CCActionInterval *pActionTo = CCScaleTo::create(2,0.8); 59 //CCActionInterval *pSeq = CCSequence::create(pActionTo,pActionTo->reverse(),NULL); // 这个组合报错 60 //------------ ------------------------ 61 62 63 //------------ 缩放 方法一 可行 ---------- 64 /*CCActionInterval *pActionTo = CCScaleTo::create(2,0.8); //第二个参数表示对x和y方向缩放比率 65 CCActionInterval *pActionToBack = CCScaleTo::create(2,1.0); 66 CCActionInterval *pSeq = CCSequence::create(pActionTo,pActionToBack,NULL);*/ 67 //------------ 方法一 ---------- 68 69 ////------------ 缩放 方法二 可行 ---------- 70 //CCActionInterval *pActionTo = CCScaleTo::create(2,0.8,0.8); // 第二和第三个参数分别表示x和y方向上缩放比率 71 //CCActionInterval *pActionBy = CCScaleTo::create(2,1.0,1.0); 72 //CCActionInterval *pSeq = CCSequence::create(pActionTo,pActionBy,NULL); 73 ////------------ 方法二 ---------- 74 75 76 //------------ 缩放 方法三 可行 ---------- 77 /*CCActionInterval *pActionBy = CCScaleBy::create(2,0.8); 78 CCActionInterval *pSeq = CCSequence::create(pActionBy,pActionBy->reverse(),NULL);*/ 79 //------------ 方法三 ---------- 80 81 //------------ 移动 方法一 ---------- 82 //CCActionInterval *pActionMoveTo = CCMoveTo::create(3,ccp(300,200)); //没实现reverse方法 83 //CCActionInterval *pActionMoveBy = CCMoveBy::create(3,ccp(300,200)); 84 //CCActionInterval *pSeq = CCSequence::create(pActionMoveBy,pActionMoveBy->reverse(),NULL); 85 //------------ 86 87 88 89 pSprite->runAction(pSeq); 90 }