动作类(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. 《1024伐木累》-te别篇,庭审你知道吗?

    思前想后,我觉得不应该发这一期,因为,做完这一期之后突然发觉,自己失去了主题,到底是在讽刺?还是在讽刺?还是在讽刺呢?不论是什么,大家自己判断吧.就当作者不想发表自己的观点,先看这一期的对白吧! 1. ...

  2. sql server 2008 操作数据表

    SQL Server表   表的类型:   ①临时表 临时表可用来处理中间数据或者用临时表 与其它连接共享进行中的工作.临时表只 能放在tempdb中. 私有临时表(#) 全局临时表(##)   ②系 ...

  3. Use Windows Azure AD to create SSO projects

    Keywords Windows Azure AD, SSO Summary Use Windows Azure AD to create SSO projects Detailed Scenario ...

  4. Implementing SQL Server Row and Cell Level Security

    Problem I have SQL Server databases with top secret, secret and unclassified data.  How can we estab ...

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

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

  6. 多个TableView的练习

    效果图: 左边图片的代码: // // SecViewController.m // UI__多个TableView练习 // // Created by dllo on 16/3/17. // Co ...

  7. JS建造者模式

    function getBeerById( id, callback){ _request('GET','URL'+id,function(res){ callback(res.responseTex ...

  8. 【CodeForces 624D】Array GCD

    题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...

  9. mvc:resources

    springmvc 配置静态文件 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mv ...

  10. ECSHOP Inject PHPCode Into \library\myship.php Via \admin\template.php && \includes\cls_template.php Vul Tag_PHP_Code Execute Getshell

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 PHP语言作为开源社区的一员,提供了各种模板引擎,如FastTemplate,Sm ...