动作Action详解

来源:互联网 发布:软件depthmap教程 编辑:程序博客网 时间:2024/06/06 21:01

声明:本文内容是《我所理解的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位置,参数分别是(x, y, z)    _tamara->setPosition3D(Vec3(s.width-140, s.height-100, 0));    _kathia->setPosition3D(Vec3(240, 240, 0));    //创建3d移动动作,参数分别是(时间,移动到的位置)    auto actionTo = MoveTo::create(2, Vec3(s.width/2.0f, s.height/2.0f, -100));    //创建3d移动动作,参数分别是(时间,相对移动的位置)    auto actionBy = MoveBy::create(2, Vec3(80, 80, -100));    //反动作    auto actionByBack = actionBy->reverse();    _tamara->runAction(actionTo);    _grossini->runAction(actionBy);    _kathia->runAction(actionByBack);}//缩放void HelloWorld::ActionScale(){    //缩放到,参数分别是(执行动作所消耗的时间, 缩放比例)    auto actionTo = ScaleTo::create(2.0f, 0.5f);    //缩放了,参数分别是(执行动作所消耗的时间,x方向缩放比例,y轴缩放比例)    auto actionBy = ScaleBy::create(2.0f, 1.0f, 10.0f);    auto actionBy2 = ScaleBy::create(2.0f, 5.0f, 1.0f);        _grossini->runAction(actionTo);    _tamara->runAction(actionBy);    _kathia->runAction(actionBy2);}//倾斜void HelloWorld::ActionSkew(){    //倾斜到,参数分别是:(执行动作需要的时间,x轴倾斜到的角度,y轴倾斜到的角度)    auto actionTo = SkewTo::create(2, 37.2f, -37.2f);    //倾斜了,参数分别是:(执行动作需要的时间,x轴倾斜le的角度,y轴倾斜le的角度)    auto actionBy = SkewBy::create(2, 0.0f, -90.0f);    auto actionBy2 = SkewBy::create(2, 45.0f, 45.0f);    _tamara->runAction(actionTo);    _grossini->runAction(actionBy);    _kathia->runAction(actionBy2);}//旋转void HelloWorld::ActionRotate(){    //旋转到,参数分辨是(执行动作所要的时间,x旋转到角度,y旋转到角度)    auto actionTo = RotateTo::create(2, 180, 180);    //旋转了,参数分辨是(执行动作所要的时间,x旋转了角度,y旋转了角度)    auto actionBy = RotateBy::create(2, 0.0f, 360);    auto actionBy2 = RotateBy::create(2, 360, 0);    _tamara->runAction(actionTo);    _grossini->runAction(actionBy);    _kathia->runAction(actionBy2);}//3D旋转void HelloWorld::ActionRotateBy3D(){    //旋转了,参数分别是(执行动作消耗的时间,旋转了角度(x, y, z))    auto actionBy1 = RotateBy::create(4, Vec3(360, 0, 0));    auto actionBy2 = RotateBy::create(4, Vec3(0, 360, 0));    auto actionBy3 = RotateBy::create(4 ,Vec3(0, 0, 360));    _tamara->runAction(actionBy1);    _grossini->runAction(actionBy2);    _kathia->runAction(actionBy3);}//跳跃void HelloWorld::ActionJump(){    //跳跃到(执行动作需要的时间,跳跃到的位置,每次跳跃的高度,跳跃的次数)    auto actionTo = JumpTo::create(2, Vec2(300,300), 50, 4);    //跳跃了(执行动作需要的时间,跳跃了的位置,每次跳跃的高度,跳跃的次数)    auto actionBy = JumpBy::create(2, Vec2(300,0), 50, 4);    auto actionUp = JumpBy::create(2, Vec2(0,0), 80, 4);    _tamara->runAction( actionTo);    _grossini->runAction(actionBy);    _kathia->runAction(actionUp);}//闪烁void HelloWorld::ActionBlink(){    //闪烁,参数分别是(执行动作所需要的时间,闪烁的次数)    auto bl = Blink::create(2.0, 10);    _kathia->runAction(bl);}//反动作void HelloWorld::ActionReverse(){    auto jump = JumpBy::create(2, Vec2(300,0), 50, 4);    auto rev = jump->reverse();        _grossini->runAction(rev);}//贝塞尔曲线void HelloWorld::ActionBezier(){    auto s = Director::getInstance()->getWinSize();//获取屏幕的大小    ccBezierConfig bezier;                         //声明一个配置对象    bezier.controlPoint_1 = Vec2(0, s.height/2 - 100);//控制点1    bezier.controlPoint_2 = Vec2(300, -s.height/2 + 100);//控制点2    bezier.endPosition = Vec2(300,100);//最终位置    auto bezierForward = BezierBy::create(3, bezier);//创建贝塞尔动作    ccBezierConfig bezier2;    bezier2.controlPoint_1 = Vec2(100, s.height/2 - 100);    bezier2.controlPoint_2 = Vec2(200, -s.height/2 + 150);    bezier2.endPosition = Vec2(240,160);    auto bezierTo1 = BezierTo::create(2, bezier2);    _grossini->runAction(bezierForward);    _tamara->runAction(bezierTo1);}//渐变FadeOut和FadeInvoid HelloWorld::ActionFade(){    //设置精灵的透明度    _tamara->setOpacity(0);    //渐变显示,参数(执行动作需要的时间)    auto action1 = FadeIn::create(1.0f);    //渐变消失,参数(执行动作需要的时间)    auto action2 = FadeOut::create(1.0f);    _tamara->runAction(action1);    _kathia->setOpacity(122);    _kathia->runAction(action2);}//改变颜色void HelloWorld::ActionTint(){    auto action1 = TintTo::create(2, 255, 0, 255);    auto action2 = TintBy::create(2, -127, -255, -127);        _tamara->runAction( action1);    _kathia->runAction( action2);}//移除动作void HelloWorld::ActionRemoveSelf(){    auto action = Sequence::create(                                   MoveBy::create( 2, Vec2(240,0)),                                   RotateBy::create( 2,  540),                                   ScaleTo::create(1,0.1f),                                   RemoveSelf::create(),                                   nullptr);        _grossini->runAction(action);}void HelloWorld::ActionFloatTest(){    //将任何值在一定时间间隔内从指定的起始值改变为指定的最终值    auto s = Director::getInstance()->getWinSize();    //参数依次为(执行动作所需的时间,起始值,最终值,报告结果的回调函数)    auto actionFloat = ActionFloat::create(2.f, 0, 3, [this](float value) {        _tamara->setScale(value);    });        _tamara->runAction(actionFloat);}//序列动作void HelloWorld::ActionSequence(){    auto action = Sequence::create(                                   MoveBy::create( 2, Vec2(240,0)),                                   RotateBy::create( 2,  540),                                   nullptr);        _grossini->runAction(action);}//同时动作void HelloWorld::ActionSpawn(){    auto action = Spawn::create(                                JumpBy::create(2, Vec2(300,0), 50, 4),                                RotateBy::create( 2,  720),                                nullptr);        _grossini->runAction(action);}//永久动作void HelloWorld::ActionRepeatForever(){    auto repeat = RepeatForever::create( RotateBy::create(1.0f, 360) );        _grossini->runAction(repeat);}//延时动作DelayTimevoid HelloWorld::ActionDelayTime(){    auto move = MoveBy::create(1, Vec2(150,0));    auto action = Sequence::create( move, DelayTime::create(2), move, nullptr);        _grossini->runAction(action);}//摄像机动作void HelloWorld::ActionOrbit(){    //设置工程为2d视角    Director::getInstance()->setProjection(Director::Projection::_2D);    //参数(执行动作花费的时间,起始半径、半径差、起始z角、旋转z角的差、起始x角、旋转x角的差)    auto orbit1 = OrbitCamera::create(2,1, 0, 0, 180, 0, 0);    auto action1 = Sequence::create(                                    orbit1,                                    orbit1->reverse(),                                    nullptr);    _kathia->runAction(RepeatForever::create(action1));    }//克隆动作void HelloWorld::ActionClone(){    auto move = MoveBy::create(1, Vec2(150,0));    auto clone = move->clone();        _grossini->runAction(move);    _kathia->runAction(clone);}//跟随void HelloWorld::ActionFollow(){    auto s = Director::getInstance()->getWinSize();        DrawNode* drawNode = DrawNode::create();    float x = s.width*2 - 100;    float y = s.height;        Vec2 vertices[] = { Vec2(5,5), Vec2(x-5,5), Vec2(x-5,y-5), Vec2(5,y-5) };    drawNode->drawPoly(vertices, 4, true,  Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));        this->addChild(drawNode);        _grossini->setPosition(-200, s.height / 2);    auto move = MoveBy::create(2, Vec2(s.width * 3, 0));    auto move_back = move->reverse();    auto seq = Sequence::create(move, move_back, nullptr);    auto rep = RepeatForever::create(seq);        _grossini->runAction(rep);        //在创建Follow动作时,需要传入要跟踪的Node对象和跟踪的范围,范围是一个Rect类型的对象,当Node移动出这个范围后,会停止对其进行跟踪,并且当其再次回到范围中时,跟踪会再次启动。如果范围设置为Rect::ZERO,那么不管该对象移动到哪儿,Follow都会一直对其跟踪。    this->runAction(Follow::create(_grossini, Rect(0, 0, s.width * 2 - 100, s.height)));}//改变动作执行目标void HelloWorld::ActionTargeted(){    auto jump1 = JumpBy::create(2,Vec2::ZERO,100,3);    auto jump2 = jump1->clone();    auto rot1 = RotateBy::create(1, 360);    auto rot2 = rot1->clone();        //传入的参数分别是(目标,动作)    auto t1 = TargetedAction::create(_kathia, jump2);    auto t2 = TargetedAction::create(_kathia, rot2);        auto seq = Sequence::create(jump1, t1, rot1, t2, nullptr);    auto always = RepeatForever::create(seq);        _tamara->runAction(always);}//进度条动作void HelloWorld::SpriteProgress(){    //获取屏幕大小    auto s = Director::getInstance()->getWinSize();    //创建进度条动作,参数分别为(执行动作消耗的时间,百分比)    auto to1 = ProgressTo::create(2, 100);    //创建进度条    auto left = ProgressTimer::create(Sprite::create("grossinis_sister1.png"));    //设置进度条类型    left->setType( ProgressTimer::Type::RADIAL );    addChild(left);    left->setPosition(100, s.height/2);    left->runAction(to1);    //是否执行反动作    left->setReverseProgress(true);}//基本缓冲动作void HelloWorld::SpriteEase(){    auto move = MoveBy::create(3, Vec2(130,0));    //动作由慢变快,参数分别(动作,速率:即加速度)    auto move_ease_in = EaseIn::create(move->clone(), 2.5f);    //动作由快变慢,参数分别(动作,速率:即加速度)    auto move_ease_out = EaseOut::create(move->clone(), 2.5f);    //动作由慢变快再变慢,参数分别(动作,速率:即加速度)    auto move_ease_in_out = EaseInOut::create(move->clone(), 2.5f);        _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);} //指数缓冲动作void HelloWorld::SpriteEaseExponential(){        auto move = MoveBy::create(3, Vec2(130,0));    //动作由慢变极快    auto move_ease_in = EaseExponentialIn::create(move->clone());    //动作由极快变慢    auto move_ease_out = EaseExponentialOut::create(move->clone());    //动作由慢至极快再由极快边慢    auto move_ease_in_out = EaseExponentialInOut::create(move->clone());        _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);}//塞因缓冲动作void HelloWorld::SpriteEaseSine(){    auto move = MoveBy::create(3, Vec2(130, 0));    //动作由快变慢    auto move_ease_in = EaseSineIn::create(move->clone());    //动作由慢变快    auto move_ease_out = EaseSineOut::create(move->clone());    //精灵由慢至快再由快至慢    auto move_ease_in_out = EaseSineInOut::create(move->clone());        _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);}//弹性缓冲动作void HelloWorld::SpriteEaseElastic(){    auto move = MoveBy::create(3, Vec2(130, 0));    //让目标动作赋予弹性 ,且以目标动作起点位子赋予弹性    auto move_ease_in = EaseElasticIn::create(move->clone());    //让目标动作赋予弹性 ,且以目标动作终点位子赋予弹性    auto move_ease_out = EaseElasticOut::create(move->clone());    //让目标动作赋予弹性 ,且以目标动作起点和终点位子赋予弹性    auto move_ease_in_out = EaseElasticInOut::create(move->clone());    _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);}//跳跃缓冲动作void HelloWorld::SpriteEaseBounce(){    auto move = MoveBy::create(3, Vec2(130, 0));    //让目标动作缓慢开始    auto move_ease_in = EaseBounceIn::create(move->clone());    //让目标动作赋予反弹力,且以目标动作结束位子开始反弹    auto move_ease_out = EaseBounceOut::create(move->clone());    //让目标动作赋予反弹力,且以目标动作起始与结束位子开始反弹    auto move_ease_in_out = EaseBounceInOut::create(move->clone());       _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);}//回振缓冲动作void HelloWorld::SpriteEaseBack(){    auto move = MoveBy::create(3, Vec2(130, 0));    //让目标动作赋予回力 , 且以目标动作起点位置作为回力点    auto move_ease_in = EaseBackIn::create(move->clone());    //让目标动作赋予回力 , 且以目标动作终点位置作为回力点    auto move_ease_out = EaseBackOut::create(move->clone());    //让目标动作赋予回力 , 且以目标动作起点和终点位置作为回力点    auto move_ease_in_out = EaseBackInOut::create(move->clone());      _grossini->runAction(move);    _tamara->runAction(move_ease_in);    _kathia->runAction(move_ease_out);}void HelloWorld::ActionCallFunc(){    //lambda表达式和std::bind函数,自行扩展//    auto action1 = Sequence::create(//                                    MoveBy::create(2, Vec2(200,0)),//                                    CallFunc::create( std::bind(&HelloWorld::callFuncCallBack, this) ),//                                    CallFunc::create(//                                                     // lambda//                                                     [&](){//                                                         auto s = Director::getInstance()->getWinSize();//                                                         auto label = Label::createWithTTF("called:lambda callback", "fonts/Marker Felt.ttf", 16.0f);//                                                         label->setPosition(s.width/4*1,s.height/2-40);//                                                         this->addChild(label);//                                                     }  ),//                                    nullptr);//    //    auto action2 = Sequence::create(//                                    ScaleBy::create(2 ,  2),//                                    FadeOut::create(2),//                                    CallFunc::create( std::bind(&HelloWorld::callFuncNCallBack, this, _tamara)),//                                    nullptr);//    //    auto action3 = Sequence::create(//                                    RotateBy::create(3 , 360),//                                    FadeOut::create(2),//                                    CallFunc::create(std::bind(&HelloWorld::callFuncNDCallBack, this, _kathia, 42)),//                                    nullptr);//    //    _grossini->runAction(action1);//    _tamara->runAction(action2);//    _kathia->runAction(action3);        auto call = CallFunc::create(CC_CALLBACK_0(HelloWorld::callFuncCallBack, this));    auto rb = RotateBy::create(1.0f, 90);    auto seq = Sequence::create(rb, call, NULL);        _kathia->runAction(seq);}void HelloWorld::ActionCallFuncN(){    auto callN = CallFuncN::create(CC_CALLBACK_1(HelloWorld::callFuncNCallBack, this));    auto rb = RotateBy::create(1.0f, 90);    auto seq = Sequence::create(rb, callN, NULL);        _tamara->runAction(seq);}void HelloWorld::callFuncCallBack(){    auto s = Director::getInstance()->getWinSize();    auto label = Label::createWithTTF("callback 1 called", "fonts/Marker Felt.ttf", 16.0f);    label->setPosition(s.width/4*1,s.height/2);    label->setColor(Color3B(255, 0, 0));        addChild(label);}void HelloWorld::callFuncNCallBack(Node* sender){    auto s = Director::getInstance()->getWinSize();    auto label = Label::createWithTTF("callback 2 called", "fonts/Marker Felt.ttf", 16.0f);    label->setPosition(s.width/4*2,s.height/2);    label->setColor(Color3B(255, 0, 0));        addChild(label);        CCLOG("sender is: %p", sender);}void HelloWorld::callFuncNDCallBack(Node* sender, long data){    auto s = Director::getInstance()->getWinSize();    auto label = Label::createWithTTF("callback 3 called", "fonts/Marker Felt.ttf", 16.0f);    label->setPosition(s.width/4*3,s.height/2);    addChild(label);    label->setColor(Color3B(255, 0, 0));        CCLOG("target is: %p, data is: %ld", sender, data);}//显示隐藏动作void HelloWorld::ActionShowAndHide(){    auto action = Sequence::create(                                   Show::create(),                                   MoveBy::create(1, Vec2(100,0)),                                   Hide::create(),                                   DelayTime::create(2),                                   Show::create(),                                   nullptr);        _grossini->runAction(action);}//可见切换动作void HelloWorld::ActionToggleVisibility(){    auto move1 = MoveBy::create(1, Vec2(250,0));    auto move2 = MoveBy::create(1, Vec2(0,50));    auto tog1 = ToggleVisibility::create();    auto tog2 = ToggleVisibility::create();    auto seq = Sequence::create( move1, tog1, move2, tog2, move1->reverse(), nullptr);    auto action = Repeat::create(Sequence::create( seq, seq->reverse(), nullptr), 3);    _tamara->runAction(action);}//翻转动作(镜像对程)void HelloWorld::ActionFlip(){    //2d镜像对称,参数(是否翻转)    auto flipX = FlipX::create(true);    auto flipY = FlipY::create(true);        _grossini->runAction(flipX);    _tamara->runAction(flipY);}//放置动作void HelloWorld::ActionPlace(){    //参数(放置为位置)    auto place = Place::create(Vec2(200, 200));    _grossini->runAction(place);}//设置速度void HelloWorld::ActionSpeed(){    auto moveBy = MoveBy::create(2.0f, Vec2(100, 100));    //参数分别为(动作,速度)    auto sp = Speed::create(moveBy, 0.1);    _grossini->runAction(sp);}//纹理和纹理缓存void HelloWorld::AnimateTextureCache(){    //TextureCache利用addImage来加载图片到缓存中    TextureCache* tc = Director::getInstance()->getTextureCache();    //获取一张贴图    Texture2D* tx = tc->addImage("HelloWorld.png");    auto sp = Sprite::createWithTexture(tx);    sp->setPosition(Vec2(100, 100));    addChild(sp);}//精灵帧和精灵帧缓存void HelloWorld::AnimateSpriteFrameCache(){    //使用SpriteFrameCache加载整张大图    auto spc = SpriteFrameCache::getInstance();    spc->addSpriteFramesWithFile("animate.plist", "animate.png");    auto spf = spc->getSpriteFrameByName("blue_0.png");    auto sp = Sprite::createWithSpriteFrame(spf);    sp->setPosition(Vec2(200, 200));    this->addChild(sp);}//动画void HelloWorld::addAnimate(){    //获取精灵缓存帧    auto cache = SpriteFrameCache::getInstance();    //添加plist和png到精灵缓存帧中    cache->addSpriteFramesWithFile("animate.plist", "animate.png");    //用一个文件初始化一个字典    auto dic = __Dictionary::createWithContentsOfFile("animate.plist");    //通过键获取相应的值    auto frameDic = (__Dictionary*)dic->objectForKey("frames");    //获取字典下键的所有数量    ssize_t num = frameDic->allKeys()->count();    //声明一个容器    Vector<SpriteFrame*> allFrames;    for (int i = 0; i < num; i++) {        char frame[32];        sprintf(frame, "blue_%d.png", i);        //通过名称获取spriteFrame        auto frameName = SpriteFrameCache::getInstance()->spriteFrameByName(frame);        //把spriteFrame添加容器内        allFrames.pushBack(frameName);    }    //不为空为false, 为空是true    bool test = allFrames.empty();    //用存储spriteFrame的容器,创建一个动画    auto animation = Animation::createWithSpriteFrames(allFrames, 0.1);    //创建一个动画动作    auto animate = Animate::create(animation);    auto forever = RepeatForever::create(animate);    //是读取plist文件的资源,不是本地资源    auto sp = Sprite::createWithSpriteFrameName("blue_0.png");    sp->setPosition(Vec2(300, 300));    this->addChild(sp);    sp->setScale(2);    sp->runAction(forever);}//测试void HelloWorld::EffectBaseTest(){    this->removeAllChildren();        LayerColor *background = LayerColor::create( Color4B(32,128,32,255) );    this->addChild(background,-20);        Size visibleSize = Director::getInstance()->getVisibleSize();    Rect gridRect = Rect(visibleSize.width * 0.2,                             visibleSize.height * 0.2,                             visibleSize.width * 0.6,                             visibleSize.height * 0.6);    _gridNodeTarget = NodeGrid::create(gridRect);    addChild(_gridNodeTarget, 0);           _gridNodeTarget->addChild(_tamara, 1);    _gridNodeTarget->addChild(_kathia, 1);}//3D震动void HelloWorld::Shaky3DDemo(){    //3D瓷砖晃动特效    //参数分别为(特效持续的时间,网格大小,晃动的范围,是否有z轴晃动)    auto shakyTiles3D = ShakyTiles3D::create(5, Size(10, 10), 5, false);    //参数分别为(执行动作消耗的时间,网格大小,震动的幅度,是否Z轴震动)    auto shaky = Shaky3D::create(2.0f, Size(15,10), 5, true);    _gridNodeTarget->runAction(shaky);}//3D波动void HelloWorld::Waves3DDemo(){    //参数(特效持续时间, 网格大小, 振幅, 波动的速率,水平波动, 垂直波动)   auto w = Waves::create(5, Size(10, 10), 10, 20, true, true);    //参数分别是(执行动作消耗的时间,网格大小,振幅,波动速率)   auto waves = Waves3D::create(5.0f, Size(15,10), 5, 40);    _gridNodeTarget->runAction(waves);}//3D翻转void HelloWorld::FlipX3DDemo(){    //X轴 3D反转特效,参数(执行动作所需要的时间)    auto filpX = FlipX3D::create(5);    _gridNodeTarget->runAction(filpX);    //Y轴3D反转特效,参数:特效持续的时间    auto filpY = FlipY3D::create(5);    _gridNodeTarget->runAction(filpY);}//凸透镜void HelloWorld::LensDemo(){    //凸透镜特效,参数分别为(网格持续时间,网格大小,凸镜中心点,凸镜半径 )    auto lens = Lens3D::create(2, Size(10, 10),Vec2(240, 160), 40);    _gridNodeTarget->runAction(lens);}//水波纹特效void HelloWorld::Ripple3DDemo(){  //参数分别为(特效持续的时间,网格大小,起始位置,半径,速率,振幅 )    auto ripple = Ripple3D::create(5, Size(10, 10), Vec2(240, 160), 240, 4, 160);    _gridNodeTarget->runAction(ripple);}//液体特效void HelloWorld::LiquidDemo(){    //参数为(特效持续时间,网格大小,速率, 振幅)    auto liquid = Liquid::create(5, Size(10, 10), 4, 20);    _gridNodeTarget->runAction(liquid);}//扭曲旋转特效void HelloWorld::TwirlDemo(){    //参数分别为(特效持续时间, 网格大小, 扭曲旋转中心点, 扭曲旋转的次数, 振幅)    auto twirl = Twirl::create(50, Size(10, 10), Vec2(240, 160), 2, 2.5);    _gridNodeTarget->runAction(twirl);}//破碎的3D瓷砖特效void HelloWorld::ShatteredTiles3DDemo(){    //参数分别是(特效持续的时间,网格大小,范围, 是否开启z轴)    auto shatteredTiles = ShatteredTiles3D::create(15, Size(10, 10), 50, true);    _gridNodeTarget->runAction(shatteredTiles);}//瓷砖洗牌特效void HelloWorld::ShuffleTilesDemo(){    //参数分别是(特效持续的时间, 网格大小, 随机数)    auto shuffle = ShuffleTiles::create(5, Size(50, 50), 50);    _gridNodeTarget->runAction(shuffle);}//部落格效果,从左下角到右上角void HelloWorld::FadeOutTRTilesDemo(){    //部落格效果,从左下角到右上角    //参数分别为(特效持续的时间, 网格大小)    auto fadeOutTRTiles = FadeOutTRTiles::create(5, Size(50, 50));    _gridNodeTarget->runAction(fadeOutTRTiles);}//部落格效果,从右上角到左下角void HelloWorld::FadeOutBLTilesDemo(){    //参数分别为(特效持续的时间,网格大小)    auto fadeOutBLTiles  = FadeOutBLTiles::create(5, Size(50, 50));    _gridNodeTarget->runAction(fadeOutBLTiles);}//折叠效果 从下到上void HelloWorld::FadeOutUpTilesDemo(){    //参数分别为(特效持续的时间, 网格大小)    auto fadeOutUpTiles = FadeOutUpTiles::create(5, Size(10, 10));    _gridNodeTarget->runAction(fadeOutUpTiles);    }//折叠效果,从上到下void HelloWorld::FadeOutDownTilesDemo(){    //参数分别为(特效持续的时间,网格大小)    auto fadeOutDownTiles = FadeOutDownTiles::create(4, Size(20, 50));    _gridNodeTarget->runAction(fadeOutDownTiles);}//跳动的方块特效void HelloWorld::JumpTiles3DDemo(){    //跳动的方块特效(特效持续的时间, 网格的大小, 跳动的次数,振幅)    auto jumpTiles = JumpTiles3D::create(5, Size(20, 20), 5, 20);    _gridNodeTarget->runAction(jumpTiles);}//分多行消失特效void HelloWorld::SplitColsDemo(){    //参数(特效持续的时间, 列数)    auto splitCols = SplitCols::create(5, 50);    _gridNodeTarget->runAction(splitCols);}//分多列消失特效void HelloWorld::SplitRowsDemo(){    //参数为(特效持续的时间, 行数)    auto splitRows = SplitRows::create(5, 50);    _gridNodeTarget->runAction(splitRows);}//3D翻页特效void HelloWorld::PageTurn3DDemo(){    //参数(特效持续的时间,网格大小)    auto pageTurn3D = PageTurn3D::create(4, Size(20, 20));    _gridNodeTarget->runAction(pageTurn3D);}void HelloWorld::PauseTest(){    auto action = MoveBy::create(1, Vec2(150,0));    auto director = Director::getInstance();    //给一个节点增加一个动作,运行动作,参数分别(动作,动作执行者,是否暂停)    director->getActionManager()->addAction(action, _grossini, true);         schedule( CC_SCHEDULE_SELECTOR(HelloWorld::unpause), 3);}void HelloWorld::unpause(float dt){    auto director = Director::getInstance();    director->getActionManager()->resumeTarget(_grossini);}void HelloWorld::menuCloseCallback(Ref* pSender){    }


原创粉丝点击