zoukankan      html  css  js  c++  java
  • cocos2d-x CCAction(转载)

    接触开发2d后,越来越多的用到动作的内容,看到一篇关于动作比较完整的文章,最主要的是动作的类图,从类图可以更加的理解各个类之间的继承的关系,以及使用更容易的去应用 。

    文章有一些方法已经被修改了,现在修改回来的。基于2.1.2。 

    http://codingnow.cn/cocos2d-x/775.html

    上一篇我们学习了CCNode类(实体),但游戏单单只有静止不动的实体肯定不行,得让它们执行一些动作,有丰富的动画效果,CCAction及它的子类就是起着这样的作用,它是通过改变这些实体的属性实现的,下面是它的类结构图。

    从结构图可以看出,动作类的基类是CCAction,通过继承它可以实现很多种动作。CCFiniteTimeAction:有限次动作执行类,就是按时间顺序执行一系列动作,执行完后动作结束;CCSpeed:调整实体(节点)的执行速度;CCFollow:可以使节点跟随指定的另一个节点移动。下面我们主要来学习CCFiniteTimeAction,这个类在平常的开发中很常见。

    CCFiniteTimeAction又分为CCActionInstanse(瞬时动作的基类)和CCActionInterval(延时动作的基类)。CCActionInstanse:没什么特别,跟CCActionInterval主要区别是没有执行过程,动作瞬间就执行完成了;CCActionInterval:执行需要一定的时间(或者说一个过程)。我们用的最多的就是延时动作,下面对它进行单独介绍。

    根据上面的类结构图,CCActionInterval的子类有很多,可以通过cocos2d-x自带的tests例子来学习,主要有这些动作:移动(CCMoveTo/CCMoveBy)、缩放(CCScaleTo/CCScaleBy)、旋转(CCRotateTO/CCRotateBy)、扭曲(CCSkewTo/CCSkewBy)、跳跃(CCJumpTo/CCJumpBy)、贝塞尔曲线(CCBezierTo/CCBezierBy)、闪烁(CCBink)、淡入淡出(CCFadeIn/CCFadeOut)、染色(CCTintTo/CCTintBy)等,还可以把上面这些动作的几个组合成一个序列。下面是移动和缩放动作的代码示例,其他的动作都类似,都是调用create函数,用到的时候具体参数的含义可以参考cocos2d-x自带的tests例子。

    CCMoveTo和CCMoveBy
    移动精灵,两者的区别在于:CCMoveTo是移动到指定坐标,CCMoveBy是相对坐标。如ccp(50,50),前者表示移动到x=50,y=50处,后者表示向x方向移动50个单位,向y方向移动50个单位。实例代码如下:

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCActionInterval* actionMoveTo = CCMoveTo::create(2,ccp(winSize.width - 30,winSize.height - 30) );
    CCActionInterval* actionMoveBy = CCMoveBy::create(1,ccp(-50,-50) );
    //m_Soldier->runAction(actionMoveTo);
    //m_Soldier->runAction(actionMoveBy);
    m_Soldier->runAction( CCSequence::create(actionMoveTo,actionMoveBy,NULL) );

    CCSequence是动作序列,把若干个动作按顺序组合在一起,然后依次执行,NULL是结束标志。上面代码表示该精灵移动到屏幕右上角,然后沿x轴和y轴负方向移动50个单位。

    CCScaleTo和CCScaleBy
    缩放精灵,前者表示缩放到xx倍;后者表示缩放xx倍。可以分别制定横向和纵向的缩放倍数,实例代码如下:

    CCActionInterval* actionScaleTo = CCScaleTo::create(1, 0.6f);
    CCActionInterval* actionScaleTo2 = CCScaleTo::create(1, 0.6f, 1.5f);
    CCActionInterval* actionScaleBy = CCScaleBy::create(1, 0.4f);
    CCActionInterval* actionScaleBy2 = CCScaleBy::create(1, 0.4f, 2.0f);
    m_Soldier->runAction( actionScaleTo );
    tempSoldier->runAction( CCSequence::create(actionScaleBy2, actionScaleBy2->reverse(), NULL) );

    reverse()表示执行该动作的逆动作,即恢复到原样。

    ps:两者都是对节点或精灵进行缩放操作,区别为:CCScaleTo缩放到指定的绝对比例;CCScaleBy缩放到相对比例(即指定比例乘以当前比例)

    例如,假设节点的当前比例(即相对于原图已被缩放到的比例)为0.25:
    CCScaleTo(动作执行时间0.5s, 比例2.0)将以2.0的比例缩放原图(简单的忽略当前已被缩放的比例);
    CCScaleBy(动作执行时间0.5s, 比例2.0)将以0.5=0.25 x 2.0的比例缩放原图。

    接下来学习一下CCSpawn、CCRepeatForever、CCRepeat、CCDelayTime。
    CCSpawn:跟CCSequence不一样的是,它表示将若干个动作组合在一起,同时执行它们(并行执行),执行时间以最长的那个动作为准。下面代码表示:精灵边旋转边跳跃,2秒的时间跳跃4次,每次跳跃的高度是50个单位,沿x轴方向跳跃300个单位的距离;旋转720度。

    CCAction*  action = CCSpawn::create(
        CCJumpBy::create(2, CCPointMake(300,0), 50, 4),
        CCRotateBy::create( 2,  720),
        NULL);
     
    m_grossini->runAction(action);

    CCRepeatForever:表示无限的重复执行某个动作或动作序列。
    CCRepeat:表示重复执行某个动作或者动作序列,但是是有限次的重复,可以指定重复次数

    CCActionInterval*  act1 = CCRotateTo::create(1, 90);
    CCActionInterval*  act2 = CCRotateTo::create(1, 0);
    CCActionInterval*  seq = (CCActionInterval*)(CCSequence::create(act1, act2, NULL));
    CCAction*  rep1 = CCRepeatForever::create(seq);
    CCActionInterval*  rep2 = CCRepeat::create((CCFiniteTimeAction*)(seq->copy()->autorelease()), 10);
     
    m_tamara->runAction(rep1);
    m_kathia->runAction(rep2);

    CCDelayTime:表示延迟,在动作之间加一个间歇时间。如下面的代码表示:精灵执行一个move动作后,暂停2秒,再继续执行后面的move动作。

    CCActionInterval*  move = CCMoveBy::create(1, CCPointMake(150,0));
    CCFiniteTimeAction*  action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);
     
    m_grossini->runAction(action);

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/yuan19/p/3283006.html
Copyright © 2011-2022 走看看