声明:本文内容是《我所理解的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);//控制点1bezier.controlPoint_2 = Vec2(300, -s.height/2 + 100);//控制点2bezier.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和FadeIn
void 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);
}//延时动作DelayTime
void 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);//通过名称获取spriteFrameauto frameName = SpriteFrameCache::getInstance()->spriteFrameByName(frame);//把spriteFrame添加容器内allFrames.pushBack(frameName);}//不为空为false, 为空是truebool 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)
{}

动作Action详解相关推荐

  1. python控制nao机器人_python控制nao机器人身体动作实例详解

    本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下 今天读的代码,顺便写了出来,与文档的对比,差不多. import sys import motion im ...

  2. 用python编写nao机器人舞蹈_python控制nao机器人身体动作实例详解

    python控制nao机器人身体动作实例详解 发布时间:2020-10-23 09:18:22 来源:脚本之家 阅读:89 本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参 ...

  3. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4地面站立动作状态机详解

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...

  4. cocos2dx学习笔记之常用动作类Action详解

    cocos2dx对动作类进行了精细的划分,最常用的是根据时间属性划分的瞬时动作类ActionInstant和延时动作类ActionInterval及其子类,继承关系如下: 本文对常用动作做了测试,代码 ...

  5. Intent之Action详解

    Intent的中文意思是"意图,目的"的意思,可以理解为不同组件之间通信的"媒介"或者"信使". 目标组件一般要通过Intent来声明自己的 ...

  6. Yii中Action详解

    在此篇中,主要介绍Yii是如何看待Action的.那么在Controller中又是如何如何处理Action的,Action又有哪些需要注意的特性呢? 带着这些问题,我们来看看下面的代码,里面会涉及到Y ...

  7. 【struts2】struts2中的Action详解

    在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...

  8. Action详解(一)

    自定义的Action一般继承与ActionSupport,并定义变量,覆盖execute()方法,变量的值会被Struts2通过setter方法自动的就行赋值,execute方法直接使用即可,其中这个 ...

  9. Struts 2 的Action详解(三)

    5 指定Action的处理结果 Action只负责用户请求的处理,只是一个控制器,不能直接对用户的请求作出响应.当Action处理完请求后,处理结果应通过视图资源实现,但控制器应控制将哪个视图资源呈现 ...

  10. Struts2框架之Action详解

    在struts 2中,action是其核心功能,使用struts 2框架,主要的开发都是围绕action进行的,我们编写的action通常需要实现com.opensymphony.xwork2.Act ...

最新文章

  1. 2011年中国网络游戏市场实际销售收入达到428.5亿元
  2. make时候说找不到makefile_找不到对象,应不应该接受相亲?听听三个过来人怎么说...
  3. 容器编排技术 -- kubectl Cheat Sheet
  4. 一休自评应聘:我是如何进入51CTO的?
  5. 信噪比:高端科研级相机的核心参数
  6. java获取jsp页面下拉列表框_jQuery+jsp下拉框联动获取本地数据的方法(附源码)
  7. cf378D(stl模拟)
  8. oa服务器日常维护,OA系统怎么维护?
  9. 音频编辑软件有哪些?推荐几款简单的音频编辑软件
  10. iOS appicon 与 launchImage 尺寸一览
  11. excel转vcf 易语言免费版
  12. SpringAOP技术【松思园】
  13. keep-alive和activated的使用
  14. 初学GWT-安装GWT
  15. 3dsMax记录---制作一套桌椅
  16. 给未来的儿子的一封信
  17. Java背景颜色怎么设成随机的_java - 如何将按钮的背景设置为具有设置约束的随机颜色? - SO中文参考 - www.soinside.com...
  18. cityscapes和foggy_cityscapes数据集使用记录
  19. 3C认证和质检报告的区别
  20. 计算及绘制天线阵列模式图

热门文章

  1. 100ml干胶能带上地铁吗_100ml发胶能带上地铁吗 不易燃易爆可带上地铁
  2. 注塑机服务器显示e011,一种注塑机工业4.0联网系统以及监控方法
  3. TIdTCPClient的几种方法
  4. Linux下载源码编译出错,编译小度wifi源码出错!
  5. 代理IP是什么意思?浏览器代理和代理服务器是什么(小白必看,看了必会,不看血亏)
  6. phalapi 开发流程
  7. 低级程序员和高级程序员的区别,难道这就是最强王者的世界吗?
  8. RMXP脚本解析(二十):Game_Actors
  9. 免费公开课:讲解DevExpress 2016.2新版本功能
  10. 1754. 骑士精神