动作Action详解

声明:本文内容是《我所理解的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位置,参数分别是
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值