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