基本动作
基本动作通常都是单一的动作,用来完成一个简单的目标。下面通过简单的示例来介绍常见的基本动作。
移动
使用 MoveTo MoveBy 完成节点对象在一个设置的时间后移动。
auto mySprite = Sprite::create("mysprite.png");// 2秒内移动到位置(50,0)auto moveTo = MoveTo::create(2, Vec2(50, 0));mySprite->runAction(moveTo);// 2秒内从原位置向x方向增加偏移50auto moveBy = MoveBy::create(2, Vec2(50, 0));mySprite->runAction(moveBy);

旋转
使用 RotateTo RotateBy 完成节点对象在一个设置的时间后顺时针旋转指定角度。
auto mySprite = Sprite::create("mysprite.png");// 2秒内不管原角度是多少,统统更改角度为顺时针40度auto rotateTo = RotateTo::create(2.0f, 40.0f);mySprite->runAction(rotateTo);// 在原有基础上增加40度auto rotateBy = RotateBy::create(2.0f, 40.0f);mySprite->runAction(rotateBy);

缩放
使用 ScaleBy ScaleTo 完成节点对象的比例缩放。
auto mySprite = Sprite::create("mysprite.png");// 现有基础上增加3倍 ,也就是已经放大2倍后,再执行这段语句,会比原图像大6倍auto scaleBy = ScaleBy::create(2.0f, 3.0f);mySprite->runAction(scaleBy);// 比上面一段多了一个(x,y)参数可供选择,同一个函数的重载auto scaleBy = ScaleBy::create(2.0f, 3.0f, 3.0f);mySprite->runAction(scaleBy);// 放大到原图像的3倍,比如如果原图已经放大2倍,执行后,会变成原图的3倍大auto scaleTo = ScaleTo::create(2.0f, 3.0f);mySprite->runAction(scaleTo);// 比上面一段多了一个(x,y)参数可供选择,同一个函数的重载auto scaleTo = ScaleTo::create(2.0f, 3.0f, 3.0f);mySprite->runAction(scaleTo);

淡入淡出
使用 FadeIn FadeOut 完成节点对象的淡入,淡出。 FadeIn 修改节点对象的透明度属性,从完全透明到完全不透明,FadeOut 相反。
auto mySprite = Sprite::create("mysprite.png");// 1秒从无到有(是从当前透明度到有,也就是说,当前透明度为125时,会从125过渡到255)auto fadeIn = FadeIn::create(1.0f);mySprite->runAction(fadeIn);// 2秒从有到无(当前透明度过渡到0)auto fadeOut = FadeOut::create(2.0f);mySprite->runAction(fadeOut);//注意,对子节点精灵的透明度不起作用,目前cocos2dX无法完成递归修改全部子节点透明度,不过可以去修改引擎源码,增加子节点递归,感兴趣的可以百度一下(后期的cocos creator版本则支持一并修改透明度)

色彩混合
使用 TintTo TintBy,将一个实现了 NodeRGB 协议的节点对象进行色彩混合。
auto mySprite = Sprite::create("mysprite.png");// 颜色叠加至auto tintTo = TintTo::create(2.0f, 120.0f, 232.0f, 254.0f);mySprite->runAction(tintTo);// 颜色原有基础上增加(如果超过RGB的最大值255,则会取余计算)auto tintBy = TintBy::create(2.0f, 120.0f, 232.0f, 254.0f);mySprite->runAction(tintBy);

帧动画
使用 Animate 对象可以很容易的通过每隔一个短暂时间进行图像替代的方式,实现一个翻页效果。下面是一个例子:
auto mySprite = Sprite::create("mysprite.png");// 创建帧序列动画Vector<SpriteFrame*> animFrames;animFrames.reserve(12);animFrames.pushBack(SpriteFrame::create("Blue_Front1.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Front2.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Front3.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Left1.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Left2.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Left3.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Back1.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Back2.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Back3.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Right1.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Right2.png", Rect(0,0,65,81)));animFrames.pushBack(SpriteFrame::create("Blue_Right3.png", Rect(0,0,65,81)));// 从帧中创建动画Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.1f);Animate* animate = Animate::create(animation);// 永远运行的函数mySprite->runAction(RepeatForever::create(animate));//(如果想要运行几次后停止,可使用Repeate类,第二个参数表示运行次数mySprite->runAction(Repeat::create(animate,3));
帧动画样例
auto mySprite = Sprite::create("animation/Andvari00.jpg"); //默认的第一帧mySprite->setPosition(Vec2(visibleSize.width / 2 + origin.x-100, visibleSize.height / 2));this->addChild(mySprite, 0); //挂载位置Vector<SpriteFrame*> animationFrames;animationFrames.reserve(19);for (int i = 0; i < 19; i++) {char frame[32];sprintf(frame, "animation/Andvari%02d.jpg", i); //图片的路径+名称,注意补充前导零animationFrames.pushBack(SpriteFrame::create(frame,Rect(0,0,996,560))); //注意图片分辨率}Animation* animation = Animation::createWithSpriteFrames(animationFrames, 1/10.0f); //播放速率,每秒10帧animation->setLoops(-1); //永远播放Animate* animate = Animate::create(animation);mySprite->runAction(animate);
变速运动
变速动作可以让节点对象具有加速度,产生平滑同时相对复杂的动作,所以可以用变速动作来模仿一些物理运动,这样比实际使用物理引擎的性能消耗低,使用起来也简单。当然你也可以将变速动作应用到动画菜单和按钮上,实现你想要的效果。

Cocos2d-x 支持上图中的大部分变速动作,实现起来也很简单。我们来看个例子,一个精灵从屏幕顶部落下然后不断跳动:
// 创建精灵auto mySprite = Sprite::create("mysprite.png");// 上升距离auto move = MoveBy::create(2, Vec2(0, 100));// 创建一个反弹行动的动作曲线auto move_ease_in = EaseBounceIn::create( move->clone() );auto move_ease_in_back = move_ease_in->reverse();// 创建延迟auto delay = DelayTime::create(0.25f);// 创建队列(sequence)动画auto seq1 = Sequence::create(move_ease_in, delay, move_ease_in_back,delay->clone(), nullptr);// 永远运动mySprite->runAction(RepeatForever::create(seq1));
跳跃
jumpTo(time,vec2(x,y),height,n) ,这个函数可以让精灵蹦蹦跳跳的运行到指定位置,每次跳动的高度由height决定,n为到达目标位置时,一共跳跃几次
//time跳跃时间,vec2(x,y)距离终点的距离//height起跳的高度,n跳跃次数ActionInterval *jumpto=JumpTo::create(2,Vec2(visibleSize.width,0),50,4);sprite->runAction(jumpto);
jumpBy(time,vec2(x,y),height,n) ,这个函数与jumpTo类似, 参数为当前位置的偏移量
ActionInterval *jumpby=JumpBy::create(2,Vec2(visibleSize.width/2,-visibleSize.height/2),50,4);
sprite->runAction(jumpby);
闪烁
会让精灵闪动数次,常用在玩家角色受伤时的闪动
// Blink(time,n), time动作持续时间,单位为秒,n为闪烁次数
ActionInterval *blink=Blink::create(0.5,3);
sprite->runAction(blink);
逆运动
所有的by运动均有reverse函数(注意,to变化则没有)
sprite->setColor(Color3B(0, 0, 0));
auto tintby = TintBy::create(2.0f, 255, 0, 0);
sprite->runAction(Sequence::create(tintby, DelayTime::create(3.0f), tintby->reverse(), nullptr));
