一 基本概念
1. CCAction是动作类的基类 ,所以动作都派生自这个类,它创建一个对象代表一个动作。动作作用于CCNode,因此任何一个动作都是有CCNode来执行
实例1. 一个图片从一点1秒时间移动到另一点
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto sprite02 = Sprite::create("yu.png");
sprite02->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
this->addChild(sprite02);
//简单的移动到指定点的动作
auto action = MoveTo::create(1.0f,Point(0,0));
sprite02->runAction(action);
2. CCAction作为一个基类 ,实质是一个接口(即抽象类),有它派生的实现类大多数都派生自CCFinteTimeAction这个类定义了在有限时间内可以完成的动作。CCFinteTimeAction主要作用于瞬时动作(CCActioninstant)和持续性动作(CCActionIntervel)。
2.1 瞬时动作(CCActionInstant)
2.1.1 CCPlace这个动作时将节点放置到屏幕坐标(100,100)处,再执行曲线运动action1
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto sprite02 = Sprite::create("yu.png");
sprite02->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
this->addChild(sprite02);
//瞬时动作 指定地点做曲线运动到贝赛尔曲线
ccBezierConfig bezierCon;
bezierCon.controlPoint_1=CCPointMake(200,150);//控制点1
bezierCon.controlPoint_2=CCPointMake(200,460);//控制点2
bezierCon.endPosition =CCPointMake(340,100);// 结束位置
auto *placeAction = Place::create(Point(visibleSize.width/2,visibleSize.height/2));
//CCActionInterval *curveMove = BezierTo::create(2,bezierCon);
CCActionInterval *curveMove = CCBezierBy::create(2,bezierCon);//支持反向
CCActionInterval * action1 = curveMove->reverse();//reverse 逆动作方法
auto *action = Sequence::create(placeAction,action1,NULL);//Sequence动作序列 是一种复合动作初始化时接受多个动作当它被执行时动作会按顺序逐个执行
sprite02->runAction(action);
2.2.2 CCFlipX和CCFlipY 这个两个动作时将精灵沿x和Y轴反向显示,配合其他动作使用,当一个鱼移动到边界是这个动作就将鱼的来个180度旋转动作需要自己写,它只是把鱼的图片来了一个旋转。感觉这个动作笔记坑爹
CCFiniteTimeAction * flipXAction = CCFlipX::create(true);
auto curveMove = MoveTo::create(1.0f,Point(200,20));
CCAction * action = Sequence::create(curveMove,flipXAction,curveMove->reverse(),NULL);
sprite02->runAction(action);
2.2.3 CCShow和CChide 这个两个动作分别用于显示和隐藏节点,其作用和设置节点的Visible属性作用一样
CCFiniteTimeAction* hideAction =CCHide::create();
auto curveMove = MoveTo::create(1.0f,Point(300,300));
CCAction* action = Sequence::create(curveMove,hideAction,NULL);
sprite02->runAction(action);
2.2.4 CCCallFunc 系列动作包括CCCallFunc,CCCallFuncN,CCCallFuncND,以及CCCallFuncO四个动作,用来在动作中进行方法的调用
CCCallFunc 没有参数
CCCallFuncN 1个参数 CCNode * 类型
CCCallFuncND 2个参数 CCNode * 和自定义参数
CCCallFuncO 1个参数 CCObject *
例子:
auto curveMove = MoveTo::create(1.0f,300));
auto * actionMoveDone = CCCallFunc::create(this,callfunc_selector(HelloWorld::moveActionEnd));
CCAction* action = CCSequence::create(curveMove,actionMoveDone,NULL);
sprite02->runAction(action);
2.3 持续性动作
每一个持续性动作都有两个不同的变种动作分别是具有To和By后缀 后缀为To的是描述节点属性值的绝对变化 ,后缀为By的是描述属性值相对的变化。
根据作用效果不同,可以将持续性动作划分为以下4个大类:位置变化动作;属性变化动作;视觉特效动作;控制动作;
2.3.1位置变化动作
a,CCMoveTo和CCMoveBy:节点做直线运动。设置了动作的时间和终点位置后,节点就会在规定的时间里内,从当前位置移动到设置的终点位置
b,CCJumpTo和CCJumpBy:节点以一定的轨迹跳跃到指定位置
//持续性动作CCJumpTo和CCJumpBy
CCAction *action = JumpTo::create(1.0f,Point(500,500),20,5);
c,CCBezierTo和CCBezierBy:使节点做曲线运动,运动的轨迹由贝塞尔曲线描述
ccBezierConfig bezier;
bezier.controlPoint_1 = Point(20,150);
bezier.controlPoint_2 = Point(200,30);
bezier.endPosition = Point(160,30);
CCFiniteTimeAction* beizeAction = CCBezierTo::create(2,bezier);
sprite02->runAction(beizeAction);
2.3.2 属性变化动作
a,CCScaleTo和CCScaleBy产生缩放效果 auto action = CCScaleTo::create(2.0f,4);
b,CCRotateTo和CCRotateBy旋转效果 auto action2 = CCRotateTo::create(2.0f,90);
c,CCFadeIn和CCFadeOut 产生淡入淡出效果 auto action3 = CCFadeIn::create(2.0f);
d,CCFadeTo用于设置一段时间内的透明度 auto action7 = CCFadeTo::create(2.0f,125);
e,CCTintTo和CCTintBy设置色调变化 auto action6 = CCTintTo::create(2.0f,255,255);
2.3.3 视觉特效动作
a,CCBlink使目标节点闪烁
auto blink = CCBlink::create(2.0f,5);
b,CCAnimation播放帧动画
2.3.4控制动作
这类动作包括CCDelayTime、CCRepeat、CCRepeatForever等
a,CCDelayTime可以将动作时间延时一定时间
b,CCRepeat可以把现有的动作重复一定次数
c,CCRepeateForever可以使一个动作不断重复下去
3、复合动作
a,重复动作(CCRepeat/CCRepeatForever)
auto curveMove = MoveTo::create(2.0f,Point(100,100));
auto rotateTo = CCRotateTo::create(1.0f,180);
auto back = MoveTo::create(2.0f,Point(visibleSize.width/2,visibleSize.height/2));
auto action = Sequence::create(rotateTo,curveMove,rotateTo,back,NULL);
auto repeat = CCRepeat::create(action,2);
sprite02->runAction(repeat);
b,并列动作CCSpawn
//并列动作
auto curveMove = MoveTo::create(2.0f,100));
auto rotateTo = CCRotateTo::create(2.0f,180);
auto spawn1 = CCSpawn::create(curveMove,NULL);
sprite02->runAction(spawn1);
c,序列 CCSequence
d,延时动作 CCDelayTime和序列一起使用
4、变速动作
a,CCSpeed用于线性的改变某个动作的速度
auto curveMove = MoveTo::create(2.0f,Point(visibleSize.width-30,visibleSize.height/2));
CCSpeed* speed = CCSpeed::create(curveMove,5.0f);
sprite02->runAction(speed);
speed->setSpeed(2.0f);
b,CCActionEase速度缓冲,速度变化
CCActionEase系列包括15个动作,可以概括为5类动作:指数缓冲、sine缓冲、弹性缓冲、跳跃缓冲、回震缓冲。每一类动作都有3个不同时期的变换:In、Out和InOut
指性缓冲:easeInExpo、eaSEOutExpo、easeInOutExpo
sine缓冲:easeInSine,eaSEOutSine,easeInOutSine
弹性缓冲:easeInElastic,eaSEOutElastic,easeInOutElastic
跳跃缓冲:easeInBounce,eaSEOutBounce,easeInOutBounce
回震缓冲:caseInBack,eaSEOutBack,easeInOutBack
auto curveMove = MoveBy::create(2.0f,visibleSize.height/2));
CCEaseSineIn* sineIn = CCEaseSineIn::create(curveMove);
sprite02->runAction(sineIn);
缓冲动作一定要使用By相对动作
让动作看起来更平滑流畅
进场动作:由快到慢,快速进入后缓慢停下,在停止前给玩家足够的视觉视觉分辨清楚进入的图像
出场动作:先慢后快,展示了出场趋势和方向后快速移除屏幕,不拖泥带水
收起菜单
CCMoveTo* move =CCMoveTo::create(0.5f,visibleSize.height/2));
CCAction* action = CCEaseExponentialIn::create(move);
menu->runAction(action);