zoukankan      html  css  js  c++  java
  • 【Cocos2d-X开发学习笔记】第18期:动作类之改变动作对象、函数回调动作以及过程动作的使用

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




    一、改变动作执行对象


         CCTargetedAction类可以改变动作的执行对象。一般默认的动作执行对象是调用runAction的对象。有时候要自定

    动作执行对象,这时候需要使用CCTargetedAction。

    1、项目示例。


    新建Cocos2D-X项目,取名为“MyCCActionTarget”,然后在HelloWorldScene.cpp文件的init函数中添加如下代码。

    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
    
    		//获得尺寸大小
    		CCSize s = CCDirector::sharedDirector()->getWinSize();
    
    		//创建精灵    
    		CCSprite* m_tamara = CCSprite::create("grossinis_sister1.png");
    		CCSprite* m_kathia = CCSprite::create("grossinis_sister2.png");
    
    		//设置精灵的位置
    		m_kathia->setPosition( ccp(s.width/3, s.height/2));
            m_tamara->setPosition( ccp(2*s.width/3, s.height/2));
           
    		//添加精灵到图层	
    		addChild(m_tamara, 2);
    		addChild(m_kathia, 3);
    
    		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();
    
    		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);
    
            bRet = true;
        } while (0);
    
        return bRet;
    }

          它的定义使用create函数,第一个参数是执行动作的节点,第二个参数是须执行的动作。这样一来,虽然调用

    runAction的是m_tamara,但是执行到t1和t2时,执行动作的节点就变为了m_kathia。

    2、示例效果图。

                



     

    二、函数回调动作


         有时候某些动作完成后,需要执行一些数据上的处理,比如攻击一个敌人,需要处理加减血等。这时需要使用函

    回调动作CCCallFunc等。它们的继承关系如下图所示。

     

           其中CCCallFunc就是回调函数,该回调的函数不含参数。CCCallFunc的回调函数以CCNode对象和数据作为参

    数。“N”就是“Node”的意思;“D”就是“Data”的意思,数据可以是任何类型的。CCCallFuncO是以CCObject作为

    回调函数参数的,“O”就是“Object”的意思。


    1、函数回调的使用方法

    <1> CCCallFunc

    CCCallFunc::create(CCObject * pSelectorTarget,SEL_CallFunc selector)

    作用:创建一个回调动作(调用不带参数的回调方法)。

    参数1:目标对象。

    参数2:目标回调函数。

    <2> CCCallFuncN

    CCCallFunc::create(CCObject * pSelectorTarget,SEL_CallFuncN selector)

    作用:创建一个回调动作(调用带一个参数的回调方法)。

    参数1:目标对象。

    参数2:目标回调函数。

    <3> CCCallFuncND

    CCCallFuncND::create(CCObject * pSelectorTarget,SEL_CallFuncND selector,void * d)

    作用:创建一个回调动作(调用带两个参数的回调方法)。

    参数1:目标对象。

    参数2:目标回调函数。

    参数3:可以是任意类型。

    2、项目示例。


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

    void callback1();
        void callback2(CCNode* sender);
        void callback3(CCNode* sender, void* data);

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

    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
    
    		//获得尺寸大小
    		CCSize s = CCDirector::sharedDirector()->getWinSize();
    
    		//创建精灵
            CCSprite* m_grossini = CCSprite::create("grossini.png");
    		CCSprite* m_tamara = CCSprite::create("grossinis_sister1.png");
    		CCSprite* m_kathia = CCSprite::create("grossinis_sister2.png");
    
    		//设置精灵的位置
    		m_grossini->setPosition( ccp(s.width/2, s.height/2));
    		m_tamara->setPosition( ccp(s.width/4, s.height/2));
            m_kathia->setPosition( ccp(3 * s.width/4, s.height/2));
           
    		//添加精灵到图层
    		addChild(m_grossini, 1);
    		addChild(m_tamara, 2);
    		addChild(m_kathia, 3);
    
    		//建立动作并执行回调动作
    		CCFiniteTimeAction*  action = CCSequence::create(
            CCMoveBy::create(2, ccp(200,0)),
            CCCallFunc::create(this, callfunc_selector(HelloWorld::callback1)), NULL);
    
    		CCFiniteTimeAction*  action2 = CCSequence::create(
            CCScaleBy::create(2 ,  2),
            CCFadeOut::create(2),
            CCCallFuncN::create(this, callfuncN_selector(HelloWorld::callback2)), NULL);
    
    		CCFiniteTimeAction*  action3 = CCSequence::create(
            CCRotateBy::create(3 , 360),
            CCFadeOut::create(2),
            CCCallFuncND::create(this, callfuncND_selector(HelloWorld::callback3), (void*)0xbebabeba), NULL);
    
    		//执行动作
    		m_grossini->runAction(action);
    		m_tamara->runAction(action2);
    		m_kathia->runAction(action3);
    
            bRet = true;
        } while (0);
    
        return bRet;
    }

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

    void HelloWorld::callback1()
    {
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        CCLabelTTF *label = CCLabelTTF::create("callback 1 called", "Marker Felt", 16);
        label->setPosition(ccp( s.width/4*1,s.height/2));
    
        addChild(label);
    }
    
    void HelloWorld::callback2(CCNode* sender)
    {
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        CCLabelTTF *label = CCLabelTTF::create("callback 2 called", "Marker Felt", 16);
        label->setPosition(ccp( s.width/4*2,s.height/2));
    
        addChild(label);
    }
    
    void HelloWorld::callback3(CCNode* sender, void* data)
    {
        CCSize s = CCDirector::sharedDirector()->getWinSize();
        CCLabelTTF *label = CCLabelTTF::create("callback 3 called", "Marker Felt", 16);
        label->setPosition(ccp( s.width/4*3,s.height/2));
    
        addChild(label);
    }


     

    3、示例效果图。

                


    三、过程动作


         很多时候,在进入游戏之前都需要载入动作,这时候需要一些动作用来实现载入时的动画。Cocos2D-X提供了

    CCProgressTo和CCProgressFromTo来实现这个动画,但是执行这种动作的节点是CCProgressTimer。


    1、项目示例。


    新建Cocos2D-X项目,取名为“MyCCActionProgress”,在HelloWorldScene.cpp文件的init函数中添加如下代码。

    bool HelloWorld::init()
    {
        bool bRet = false;
        do 
        {
            CC_BREAK_IF(! CCLayer::init());
    
            CCSize s = CCDirector::sharedDirector()->getWinSize();
    
    		CCProgressTo *to1 = CCProgressTo::create(2, 100);
    		CCProgressTo *to2 = CCProgressTo::create(2, 100);
    
    		CCProgressTimer *left = CCProgressTimer::create(CCSprite::create("grossinis_sister1.png"));
    		left->setType( kCCProgressTimerTypeRadial );
    		addChild(left);
    		left->setPosition(ccp(100, s.height/2));
    		left->runAction( CCRepeatForever::create(to1));
        
    		CCProgressTimer *right = CCProgressTimer::create(CCSprite::create("blocks.png"));
    		right->setType(kCCProgressTimerTypeRadial);
    		// Makes the ridial CCW
    		right->setReverseProgress(true);
    		addChild(right);
    		right->setPosition(ccp(s.width-100, s.height/2));
    		right->runAction( CCRepeatForever::create(to2));
    
            bRet = true;
        } while (0);
    
        return bRet;
    }

    <1> 首先是定义CCProgressTo或CCProgressFromTo。第一个参数都是动作时间;CCProgressTo的第二个参数是结

    束时图片显示的百分比,CCProgressFromTo的第二个参数是开始时图片显示的百分比;CCProgressFromTo的第三

    个参数是结束时图片显示的百分比。

    <2> 接下来是定义CCProgressTimer,传入精灵对象来定义,通过调用setType函数来设置动画的类型:

    kCCProgressTimerTypeRadial是圆形扫描的动画,kCCProgressTimerTypeBar是直线扫描的动画。

    <3> 调用setReverseProgress函数设置正反的方向。kCCProgressTimerTypeBar类型的通过setBarChangeRate设置

    水平和竖直的变化量。

    <4> 通过调用setMidpoint函数设置开始点,(0,0)为左上,(1,1)为右下,其他点可以用浮点数来表示


    2、示例效果图。

                  

    源码下载地址

  • 相关阅读:
    Android SharedPreferences 简单使用
    Android Broadcast广播
    Android Service 的生命周期
    Android RecyclerView的使用
    Android ListView addHeaderView()、addFooterView()和变更列表
    Android ListView的缓存机制
    Android ViewPager + Fragment的实现与Fragment生命周期管理
    Android 触摸事件的传递过程
    Java 泛型及相关使用
    android 常用View的一些注意点(CheckedTextView)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3262919.html
Copyright © 2011-2022 走看看