动作类(Action)

动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作。动作作用于Node,因此每个动作都需要由Node对象执行。动作类(Action)作为基类,实际上是一个接口,动作类的大多数实现类都派生于有限时间动作类(FiniteTimeAction)。

在实际开发中我们通常用到两类动作-即时动作和持续动作,它们均继承于有限时间动作类。

即时动作类

auto placeAction = Place::create(Point(, ));

Place:该动作用于将节点放置到某个指定位置,其作用与修改节点的position属性相同。

auto flipxAction = FlipX::create(true);
auto flipyAction = FlipY::create(true);

FlipX和FlipY:这两个动作分别用于将精灵沿X轴和Y轴反向显示,其作用与设置精灵的FlipX和FlipY属性相同,将其包装成动作是为了便于与其他动作进行组合。

auto hideAction = Hide::create();
auto showAction = Show::create();

Show和Hide:这两个动作分别用于显示和隐藏节点,其作用与设置节点的visible属性作用一样。

    auto actionMoveDone = CallFuncN::create([&](Ref* sender){
log("Clear memory");
});
auto moveTo = MoveTo::create(0.4f, Point(, ));
auto action = Sequence::create(moveTo, actionMoveDone, NULL);

CallFunc系列动作包括CallFunc、CallFuncN两个动作,用来在动作中进行方法调用。在游戏中为了节约内存资源,我们可以在动作完成后调用相应函数清理内存。

持续动作类

    MoveTo::create(float duration, const Point& position);
MoveBy::create(float duration, const Point& position);

MoveTo和MoveBy:用于使节点做直线运动,设置了动作时间和终点位置,在规定时间内会移动到终点。

    JumpTo::create(float duration, const Point& position, float height, int jumps);
JumpBy::create(float duration, const Point& position, float height, int jumps);

JumpTo和JumpBy:使节点以一定的轨迹跳跃到指定位置。

    ccBezierConfig bezier;
bezier.controlPoint_1 = Point(, );
bezier.controlPoint_2 = Point(, );
bezier.endPosition = Point(, );
auto bezierAction = BezierTo::create(0.5f, bezier);

BezierTo和BezierBy:使节点进行曲线运动,运动的轨迹由贝塞尔曲线描述。每条贝塞尔曲线都包含一个起点和一个终点。在一条曲线中,起点和终点各自包含一个控制点,而控制点到端点的连线称作控制线。控制点决定了曲线的形状,包含角度和长度两个参数。如下图:

使用时,我们要先创建ccBezierConfig结构体,设置好终点endPosition以及两个控制点controlPoint_1和controlPoint_2后,再把结构体传入BezierTo或BezierBy的初始化方法中。

    ScaleTo::create(float duration, float s);
ScaleBy::create(float duration, float s);

ScaleTo和ScaleBy:产生缩放效果,使节点的缩放系数随时间线性变化。

    RotateTo::create(float duration, float deltaAngle);
RotateBy::create(float duration, float deltaAngle);

RotateTo和RotateBy:产生旋转效果。

    FadeIn::create(float d);    淡入
FadeOut::create(float d); 淡出
FadeTo::create(float duration, GLubyte opacity); 一定时间内透明度变化

FadeIn, FadeOut和FateTo:产生淡入淡出效果,和透明变化效果。

    TintTo::create(float duration, GLubyte red, GLubyte green, GLubyte blue);
TintBy::create(float duration, GLubyte red, GLubyte green, GLubyte blue);

TintTo和TintBy:设置色调变化,这个动作较少使用。red, green, blue的取值范围为0~255。

 Blink::create(float duration, int blinks);

Blink:使节点闪烁,其中blinks为闪烁次数。

复合动作类

 DelayTime::create(float d);

DelayTime:延时动作其实什么都不做,提供一段空白期,d表示需要延时的时间。

    Repeat::create(FiniteTimeAction *action, unsigned int times);
RepeatForever::create(ActionInterval *action);

Repeat/RepeatForever:反复执行某个动作。

    Spawn::create(FiniteTimeAction *action1, ...);
Spawn::create(const Vector<FiniteTimeAction*>& arrayOfActions);

Spawn:使一批动作同时执行。

    Sequence::create(FiniteTimeAction *action1, ...);
Sequence::create(const Vector<FiniteTimeAction*>& arrayOfActions);

Sequence:让各种动作有序执行。

变速动作类

    auto repeat = RepeatForever::create(animation);
auto speed = Speed::create(repeat, 0.5f);
sprite->runAction(speed);

Speed:用于线性的改变某个动作的速度,为了改变一个动作的速度,首先需要将目标动作包装到Speed动作中,第二个参数为变速比例,设置为0.5f则速度为原来一半。

    auto sineIn = EaseSineIn::create(action);
sprite->runAction(sineIn);

ActionEase:Speed虽然能改变动作的速度,但是只能按比例改变速度,ActionEase可以实现动作的速度又快到慢、速度随时间改变的匀速运动。该类包含5类运动,指数缓冲、Sine缓冲、弹性缓冲、跳跃缓冲和回震缓冲。每类运动都包含3个不同时期的变换:In、Out和InOut。

序列帧动画

Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果。动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画。

我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象。动画动作Animate是精灵显示动画的动作,它由一个动画对象创建,并由精灵执行。

上面描述有点乱,我是这么理解的,真真的动画动作,其实是Animate继承了Action的子类,而Animation只是构成动画动作的资源对象。相当于剧本和道具并非实质性的演出。

Animation的创建方法

手动添加的方法需要将每一帧要显示的精灵有序添加到Animation类中,并设置每帧的播放时间,让动画能够匀速播放。另外,还要通过setRestoreOriginalFrame来设置是否在动画播放结束后恢复到第一帧。创建好Animation实例后,需要创建一个Animate实例来播放序列帧动画。

    auto animation = Animation::create();
for( int i=;i<;i++)
{
char szName[] = {};
sprintf(szName, "Images/grossini_dance_%02d.png", i);
animation->addSpriteFrameWithFile(szName);
}
// should last 2.8 seconds. And there are 14 frames.
animation->setDelayPerUnit(2.8f / 14.0f);
animation->setRestoreOriginalFrame(true); auto action = Animate::create(animation);
_grossini->runAction(Sequence::create(action, action->reverse(), NULL));
  • addSpriteFrame,添加精灵帧到Animation实例
  • setDelayUnits,设置每一帧持续时间,以秒为单位
  • setRestoreOriginalFrame,设置是否在动画播放结束后恢复到第一帧
  • clone,克隆一个该Animation实例

使用文件添加的方法只需将创建好的plist文件添加到动画缓存里面,plist文件里包含了序列帧的相关信息。再用动画缓存初始化Animation实例,用Animate实例来播放序列帧动画。

    auto cache = AnimationCache::getInstance();
cache->addAnimationsWithFile("animations/animations-2.plist");
auto animation2 = cache->getAnimation("dance_1"); auto action2 = Animate::create(animation2);
_tamara->runAction(Sequence::create(action2, action2->reverse(), NULL));

动画缓存(AnimationCache)

AnimationCache可以加载xml/plist文件,plist文件里保存了组成动画的相关信息,通过该类获取到plist文件里的动画。在使用AnimationCache类时会用到以下几个接口:

  • static AnimationCache* getInstance(),全局共享的单例
  • void addAnimation(Animation *animation, const std::string& name),添加一个动画到缓存
  • void addAnimationsWithFile(const std::string& plist),添加动画文件到缓存,plist文件
  • void removeAnimation(const std::string& name),移除一个指定的动画
  • Animation* getAnimation(const std::string& name),从缓存中获取动画对象

建议:在内存警告时我们应该加入如下的清理缓存操作:

void releaseCaches()

{

    AnimationCache::destroyInstance();

    SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();

    TextureCache::getInstance()->removeUnuserdTextures();
}

值得注意的是清理的顺序,我们推荐先清理动画缓存,然后清理精灵帧缓存,最后是纹理缓存。按照引用层级由高到低,以保证释放引用有效。

骨骼动画详解-Spine

游戏中人物的走动,跑动,攻击等动作是必不可少,实现它们的方法一般采用帧动画或者骨骼动画。帧动画的每一帧都是角色特定姿势的一个快照(完整的照片),骨骼动画则是主要将对象拆分成个各个小件(小部位),通过在每一帧中按动画要求组合这些小件。从而达到类似帧动画的快照效果,两者的区别帧动画应该每一帧都是完整的图片,所以占用内存和体积会偏大,而骨骼动画小件资源可以重复利用,每一帧之需要记录小件组合的规则,所以相对图片资源体积小,占有内存小。图片资源如图所示:

后续补充如何使用骨骼动画

cocos基础教程(7)动作与动画的更多相关文章

  1. cocos基础教程(4)基础概念介绍

    在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...

  2. cocos基础教程(3)cocos3.x版本目录结构介绍

    简介 cocos2d-x-3.x版本进行了很多优化,比如:将TTF字体用Atlas缓存,节点重排序官方声称提升了10倍速度,查找.移除节点方面也提高了10%,拆分渲染层到独立的线程运行: 另外,coc ...

  3. cocos基础教程(1)Mac环境下搭建

    下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版      http://www.cocos2d-x.org/download 2.下载a ...

  4. cocos基础教程(2)Window环境下搭建(补充)

    一.环境搭建 1.JDK.Eclipse与SDK 我用的JDK是1.7 Eclipse用的是Luna版的 这些之前都已经设好了,相关下载自己网上找吧 2. 下载最新的Cocos2d-x,我下的是3.5 ...

  5. cocos基础教程(2)Window环境下搭建

    第一步:开始安装VS2012  第二步:下载Cocos2d-x 3.4源码  配置环境变量 COCOS_CONTROL = E:\cocos2d-x-3.4\tools\cocos2d-console ...

  6. cocos基础教程(13)使用Physicals代替Box2D和chipmunk

    1.   概述 游戏中模拟真实的世界是个比较麻烦的事情,通常这种事情都是交给物理引擎来做.首屈一指的是Box2D了,它几乎能模拟所有的物理效果.而chipmunk则是个更轻量的引擎,能够满足简单的物理 ...

  7. cocos基础教程(12)点击交互的三种处理

    1.概述 游戏也好,程序也好,只有能与用户交互才有意义.手机上的交互大致可以分为两部分:点击和输入.其中点击更为重要,几乎是游戏中全部的交互.在Cocos2d-x 3.0中,更改了dispatch机制 ...

  8. cocos基础教程(9)声音和音效

    使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文 ...

  9. cocos基础教程(10)纹理缓存技术

    Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法 ...

随机推荐

  1. mysql使用基础 sql语句(一)

    csdn博文地址:mysql使用基础 sql语句(一)  点击进入 命令行输入mysql -u root -p,回车再输入密码,进入mysql. 终端命令以分号作为一条语句的结束,可分为多行输入,只需 ...

  2. Bootstrap2和3的区别

    如果你需要兼容IE8甚至是IE7和IE6,那么只能选择Bootstrap2,虽然它自身在IE6的效果也并不完美.     但是倘若你跟随时代的脚步,并且面向的客户也很高端大气上档次地选择只需要兼容高级 ...

  3. ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 2、linux 如何修改只读文件 3、ubuntu安装

    1.ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 答案:需要超级用户权限 sudo 2.linux 如何修改只读文件 答案:可以使用chmod命令,为改文件提供其他的权限.u ...

  4. use case

  5. wordpress中如何禁止或者屏蔽更新提示

    WordPress禁止,插件更新,主题更新,wordpress本身更新提示的方法 禁止wp更新 : open file "wordpress\wp-includes\update.php&q ...

  6. hdu3746 KMP

    这题琢磨了挺长的时间.需要理解next[]表示了什么; next[i]代表了前缀和后缀的最大匹配的值,也就是个数. len-next[len]表示循环节的长度; 比如abcab   int fl=le ...

  7. 如何解决mysql数据库X小时无连接自动关闭

    windows下打开my.ini,增加: interactive_timeout=28800000 wait_timeout=28800000 专家解答:MySQL是一个小型关系型数据库管理系统,由于 ...

  8. Statement,PreparedStatement和CallableStatement的联系和区别

    联系: CallableStatement继承自PreparedSatement,PreparedStatement继承自Statement. 区别: 1:Statement 每次执行sql语句,数据 ...

  9. Yii2提示信息设置方法

    显示信息提示用户时,可以用setFlash,hasFlash,getFlash function actionOk() { Yii::app()->user->setFlash('succ ...

  10. POJ2299 Ultra-QuickSort

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...