zoukankan      html  css  js  c++  java
  • 【Cocos2d-X开发学习笔记】第19期:动作管理类(CCActionManager)的使用

     本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010

    一、动作管理类

          动作管理类CCActionManager是一个管理所有动作的单例,工作原理是:当CCNode执行runAction时,该函数会

    动作通过动作管理类的addAction函数将对象传递给CCActionManager的单例,该实例再把这个动作添加到自己的

    动作序列中。

          动作管理单例通过定时刷新自己的update方法,在这个方法中去调用行为序列中每个动作的step(暂停的行为不

    会update),这些step方法再根据自身的完成进度去update或是结束行为。

          实际上是由动作管理单例驱动的每个动作去更新自己的逻辑,而runAction方法只是将行为对象添加进

    CCActionManager的待执行队列。当节点被清除或是行为结束时,动作管理类会自动将动作从队列中删除,不需要程

    员的管理。

          一般情况下,不需要使用这个单例来管理动作,可以使用CCNode类的stopAction、stopActionByTag和

    stopActions等函数来管理、但是有两种情况需要使用CCActionManager类单例:

    <1> 动作的执行者不是同一个节点。

    <2> 需要暂停/重启活动时。

    CCActionManager类的继承关系如下图所示。

    二、CCActionManager类的主要函数

    CCActionManager类的主要函数见如下图所示。

     

    三、CCActionManager类的使用

           之前提到过,不要轻易使用动作管理类,除非是不同动作目标和需要暂停/重启动作。这里的例子就是需要暂停/

    启动作时使用。

    1、项目示例。

    <1> 首先新建Cocos2D-X项目,取名为“MyCCActionManager”,然后在HelloWorldScene.h文件中声明成员函数。

    void resumeGrossini(float time);

     

    <2> 在HelloWorldScene.cpp文件中的init函数中添加如下所示代码。

    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
    
    		//获得尺寸大小
    		CCSize s = CCDirector::sharedDirector()->getWinSize();
    
    		//添加标签
            CCLabelTTF* l = CCLabelTTF::create("Grossini only rotate/scale in 3 seconds", "Thonburi", 16);
    		addChild(l);
    		l->setPosition(ccp(s.width/2, s.height/2 + 120));
    
    		//添加精灵
    		CCSprite* pGrossini = CCSprite::create("grossini.png");
    		addChild(pGrossini, 0, 1);
    		pGrossini->setPosition(ccp(s.width/2, s.height/2));
    
    		//精灵执行动作
    		pGrossini->runAction(CCScaleBy::create(2, 2));
    
    		CCDirector* pDirector = CCDirector::sharedDirector();
    		pDirector->getActionManager()->pauseTarget(pGrossini);
    		pGrossini->runAction(CCRotateBy::create(2, 360));
    
    		this->schedule(schedule_selector(HelloWorld::resumeGrossini), 3.0f);
    
            bRet = true;
        } while (0);
    
        return bRet;
    }

    <3> 最后在HelloWorldScene.cpp文件中添加如下所示函数。

    void HelloWorld::resumeGrossini(float time)
    {
        this->unschedule(schedule_selector(HelloWorld::resumeGrossini));
    
        CCNode* pGrossini = getChildByTag(1);
        CCDirector* pDirector = CCDirector::sharedDirector();
        pDirector->getActionManager()->resumeTarget(pGrossini);
    }

         首先获得导演实例,然后通过调用getActionManager获得动作管理,再通过pauseTarget和resumeTarget等函数

    实现暂停/重启目标的动作。

    2、示例效果图。

                          

    源码下载地址

  • 相关阅读:
    分布式文件系统
    分布式文件系统
    ASP.NET MVC 使用 FluentScheduler 定时器计划任务
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
  • 原文地址:https://www.cnblogs.com/pangblog/p/3265362.html
Copyright © 2011-2022 走看看