• 09--动作系统(三)使用持续动作


       前面的学习笔记以已经大致理解了持续动作,他的重要性就不再次强调了。今天要实现的效果是精灵首先有一个缩放动作然后移动到指定位置再缩放,最后返回原地再缩放。

       首先还还是要修改一下项目,以便我们观察,修改后运行如下图:

       红色框中就是执行动作的精灵

    直接上代码:

     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 }


     

  • 相关阅读:
    Verilog模块概念和实例化#转载自Jason from Lofter
    P4-verilog实现mips单周期CPU
    P0-Logisim简单部件与有限状态机
    终——提问回顾与个人总结
    技术博客——PyPDF2 & Reportlab 使用
    结对——软工第一次结对项目
    分析——个人第二次博客作业
    交点——软工第一次个人项目作业
    启——软工第一次个人博客作业
    再会,旧时光——软工热身作业
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3751690.html
Copyright © 2020-2023  润新知