动作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){ }
- 动作Action详解
- Cocos2d-动作(Action)详解
- coco2dx-动作(Action)原理二 动作分类详解
- Action 动作
- Action 动作
- Action 动作
- 动作Action
- PHP Yii框架自定义动作(Action)用法详解
- Java Action 动作
- 动作指令Action
- Cocos2D常用动作(Action)
- cocos2dx-Action动作
- corejavaI---action(动作)
- cocos2dx-Action动作
- 第三讲 Action动作
- Cocos2Dx之动作Action
- cocos2dx-Action动作
- cocos2dx之动作Action
- Java 八大排序算法
- atomic与nonatomic
- [Linux] zsh corrupt
- hdfs提示Target Replicas is 3 but found 2 replica(s) 问题解决
- 工作总结35 Oracle RAC的tnsnames.ora参数详解
- 动作Action详解
- javaweb学习总结23:jsp自定义标签开发入门
- make无法执行——源码编译、安装
- JVM调优总结(1):一栈、堆
- [Qt] file:///的作用
- 哈希表
- 图像的离散余弦变换
- 【翻译搬运】起源引擎(Source)多人模式网络同步模型(Source Multiplayer Networking)【二】
- iOS账号续费及证书更新流程