声明:本文内容是《我所理解的COCOS2D-X》以及《Cocos2d-x实战》的部分摘录与整合
一个Action就是一个对象,它定义了一个修改,并把这个修改作用在一个Node元素上。Action是一个自描述的对象,一个Action对象知道如何修改一个Node的元素,包括对哪些属性作出修改,以及怎样对这些修改执行插值计算。定义好一个Action对象之后,它可以作用于任何Node元素。但是,Action只能作用于单个Node元素之上。
动作action包括基本动作和基本动作的组合,基本动作包括有移动、缩放、跳跃、旋转等,而这些动作变化的速度也可以自己设定。Action有3个子类,FiniteTimeAction(受时间限制的动作)、Follow(一种允许精灵跟随另一个精灵的动作)、Speed(一个动作运行时改变其运动速率),其中FiniteTimeAction包括ActionInstant(封装了一种瞬时动作)和ActionInterval(封装了一种间隔动作)。
即时动画是指从动画开始执行到完成一帧之内的动画,例如RemoveSelf是一个即时动画,因为这个操作不能被拆分在多个时间段内执行。其他即时动画还包括Show、Hide、CallFunc、Place、FlipY、ToggleVisiblity等。这里需要注意的是,即时动画并不是在动画开始的时候执行的,实际上它也不是在当前帧完成的,而是在开始动画的下一帧完成的。因为这一操作是在Action::update中完成的。每个动画的每一次update的执行发生在游戏循环开始的时候。所以开始执行动画肯定晚于动画执行阶段,所以即时动画只能在下一帧去执行完成操作。
间隔动画是该动画对属性的修改操作发生在一定的时间内,这个修改持续发生在该时间的每一帧,直到动画执行完成。大部分修改能够进行插值的动画都是间隔动画m例如MoveTo、RotateBy、SkewTo、BezierTo等。
一个Action只能通过一个Node元素来执行,可以通过调用Node的runAction方法来执行。当一个动画执行完成后,动画系统会将它移除,默认情况下该Action实例会立即被销毁。
runAction并不提供动画完成时的回调,如果需要在动画完成时得到通知,则需要使用CallFunc即时动画来提供一个回调函数。
动作测试代码:
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
//添加背景图片
auto sp = Sprite::create("game_background_1.png");
sp->setPosition(visibleSize/2.0f);
this->addChild(sp);
//创建三个人物精灵
_grossini = Sprite::create("ge_boss_1.png");
_tamara = Sprite::create("ge_boss_2.png");
_kathia = Sprite::create("ge_boss_3.png");
addChild(_grossini, 1);
addChild(_tamara, 2);
addChild(_kathia, 3);
_grossini->setPosition(visibleSize.width/2.0f, visibleSize.height/3);
_tamara->setPosition(visibleSize.width/2.0f, visibleSize.height*2/3);
_kathia->setPosition(visibleSize.width/2.0f, visibleSize.height - 50);
//移动动作
//this->ActionMove();
//3D移动
//this->ActionMove3D();
//缩放
//this->ActionScale();
//倾斜
//this->ActionSkew();
//旋转
//this->ActionRotate();
//3D旋转
//this->ActionRotateBy3D();
//跳跃
//this->ActionJump();
//闪烁
//this->ActionBlink();
//反动作
//this->ActionReverse();
//贝塞尔曲线
//this->ActionBezier();
//渐变
//this->ActionFade();
//改变颜色
//this->ActionTint();
//移除动作
//this->ActionRemoveSelf();
//放大动作
//this->ActionFloatTest();
//克隆
//this->ActionClone();
//序列动作
//this->ActionSequence();
//同时动作
//this->ActionSpawn();
//永久动作
//this->ActionRepeatForever();
//延时动作
//this->ActionDelayTime();
//摄像机动作
//this->ActionOrbit();
//跟随动作
this->ActionFollow();
//改变动作执行对象
//this->ActionTargeted();
//进度条动作
//this->SpriteProgress();
//基本缓冲动作
//this->SpriteEase();
//指数缓冲动作
//this->SpriteEaseExponential();
//塞因缓冲
//this->SpriteEaseSine();
//弹性缓冲
//this->SpriteEaseElastic();
//跳跃缓冲
//this->SpriteEaseBounce();
//回振缓冲
//this->SpriteEaseBack();
//不带参数的回调动作
//this->ActionCallFunc();
//带一个参数的回调动作
//this->ActionCallFuncN();
//显示隐藏动作
//this->ActionShowAndHide();
//可见切换动作
//this->ActionToggleVisibility();
//翻转动作(镜像对程)
//this->ActionFlip();
//放置动作
//this->ActionPlace();
//设置速度动作
//this->ActionSpeed();
//贴图的使用
//this->AnimateTextureCache();
//使用精灵帧缓存
//this->AnimateSpriteFrameCache();
//动画
//this->addAnimate();
//特效使用
//this->EffectBaseTest();
//3D震动
//this->Shaky3DDemo();
//3D波动
//this->Waves3DDemo();
//3D翻转
//this->FlipX3DDemo();
//凸透镜效果
//this->LensDemo();
//水波纹特效
//this->Ripple3DDemo();
//液体特效
//this->LiquidDemo();
//扭曲旋转特效
//this->TwirlDemo();
//破碎的3D瓷砖特效
//this->ShatteredTiles3DDemo();
//瓷砖洗牌特效
//this->ShuffleTilesDemo();
//部落格效果,从左下角到右上角
//this->FadeOutTRTilesDemo();
//部落格效果,从右上角到左下角
//this->FadeOutBLTilesDemo();
//折叠效果 从下到上
//this->FadeOutUpTilesDemo();
//折叠效果,从上到下
//this->FadeOutDownTilesDemo();
//跳动的方块特效
//this->JumpTiles3DDemo();
//分多行消失特效
//this->plitColsDemo();
//分多列消失特效
//this->SplitRowsDemo();
//3D翻页特效
//this->PageTurn3DDemo();
//暂停动作
//this->PauseTest();
return true;
}
//移动
void HelloWorld::ActionMove()
{
//移动到(时间,位置)
auto actionTo = MoveTo::create(2, Vec2(150, 100));
//移动了(时间,相对移动的位置)
auto actionBy = MoveBy::create(2, Vec2(80,80));
//反动作(向相反的方向移动)
auto actionByBack = actionBy->reverse();
_tamara->runAction(actionTo);
_grossini->runAction(actionBy);
_kathia->runAction(actionByBack);
}
//3D移动
void HelloWorld::ActionMove3D()
{
//获取屏幕的大小
auto s = Director::getInstance()->getWinSize();
//设置3d位置,参数分别是