简介:
cocos2d提供了丰富的动作类,这些动作类分为瞬时动作,持续动作,复合动作和速度变化等。
Action是动作类的基类,所有的动作都派生这个类,它创建的一个对象代表一个动作,动作用于Node,因为,任何一个动作都需要由Node对象来执行。
一个简单示例:
bool ActionScene::init() { if (!Layer::init()) { return false; } //获取屏幕的大小的尺寸 size = Director::getInstance()->getVisibleSize(); //获取一个监听者 auto listener = EventListenerTouchOneByOne::create(); //注册监听的回调函数 listener->onTouchBegan = CC_CALLBACK_2(ActionScene::onTouchBegan,this); //注册监听器到当前节点 _eventDispatcher->addEventListenerWithSceneGraPHPriority(listener,this); auto bg = Sprite::create("bg.jpg"); bg->setPosition(size.width/2,size.height/2); auto sx = size.width/bg->getContentSize().width; auto sy = size.height/bg->getContentSize().height; bg->setScale(sx,sy); ico = Sprite::create("ico.jpg"); ico->setPosition(size.width/2,size.height/2); this->addChild(bg); this->addChild(ico); return true; } //这是点击动作的回调方法,最终的效果是,点一下屏幕,就开始移动 bool ActionScene::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { //创建一个移动的动作,第一个参数是duration,就是时间,这里为1s,第二个参数是一个点,要移动到的点 //这里的意思是在1s内移动到坐标为(100,200) auto move = MoveTo::create(1,Point(100,200)); //开始执行动作 ico->runAction(move); return false; }
瞬时动作:
是指立刻就能完成的动作,是FiniteTimeAction中动作持续时间为0的特例,就是说,这个动作会在下一帧立刻完成,如设置位置,设定缩放等。这些动作本来可以通过为属性赋值来完成,但封装成动作以后,可以与其它动作一起组合成复杂的动作。
详情,可以看代码:
// void ActionScene::testPlace() { //该动作可以将节点移动到一个指定的点,瞬间完成 auto place = Place::create(Point(100,100)); //开始执行动作 ico->runAction(place); } void ActionScene::testFlip() { //创建一个沿X轴镜面反转的动作 auto flipX = FlipX::create(true); //创建一个沿Y轴镜面反转的动作 auto fileY = FlipY::create(true); ico->runAction(fileY); } void ActionScene::testShowHide() { //创建一个显示的动作 auto show = Show::create(); //创建一个隐藏的动作 auto hide = Hide::create(); //已经在头文件里声明了一个变量,用于判断,达到点一下隐藏,再点一下出现的效果 if(count%2==0){ ico->runAction(show); }else{ ico->runAction(hide); } count++; }
持续性动作:
是在持续的一段时间里逐渐完成的动作,如精灵从一个占连续地移动到另一个点,与瞬时动作相比,持续性动作的种类更加丰富,由于这些动作将持续一段时间,一般都有一个用于控制时间的时间参数duration。
to与by:
每一种持续性动作都分两种,分别具有To和By后缀,to动作描述了节点值的绝对变化,例如moveTo将对象移动到一个指定的位置,by的动作,刚是一个相对变化,moveBy将对象移动一段相对位移。
分类:
位置变化动作
属性变化动作
视觉特效动作
控制动作
位置变化动作:
直线运动:
//测试moveBy动作的方法 void ActionScene::testMoveBy(){ //创建一个moveBy动作,第一个参数是移动时间,第二个参数是要移动到的相对位置 auto moveby = MoveBy::create(5,100)); ico->runAction(moveby); } //测试moveTo动作的方法 void ActionScene::testMoveTo(){ //创建一个moveTo动作,第一个参数是移动时间,第二个参数是要移动到的点 auto moveto = MoveTo::create(5,100)); ico->runAction(moveto); }
按一定的轨迹跳跃到指定的位置:
//测试jumpBy的方法 void ActionScene::testJumpTo(){ //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃到的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数 auto jumpto = JumpTo::create(5,100),30,3); ico->runAction(jumpto); } //测试jumpTo的方法 void ActionScene::testJumpBy(){ //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数 auto jumpby = JumpBy::create(5,3); ico->runAction(jumpby); }
贝赛尔曲线移动:
void ActionScene::testBezierBy(){ //先创建一个ccBezierConfig结构体 ccBezierConfig bezier; //设置控制点1 bezier.controlPoint_1 = Point(20,150); //设置控制点2 bezier.controlPoint_2 = Point(200,30); //设置终点 bezier.endPosition = Point(160,30); //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体 auto bezierBy = BezierBy::create(5,bezier); ico->runAction(bezierBy); } void ActionScene::testBezierTo(){ //先创建一个ccBezierConfig结构体 ccBezierConfig bezier; //设置控制点1 bezier.controlPoint_1 = Point(20,30); //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体 auto bezierTo = BezierTo::create(5,bezier); ico->runAction(bezierTo); }
属性变化动作:
改变大小:
//测试ScaleBy的方法 void ActionScene::testScaleBy(){ //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半 //第二个参数,如果大于1,就表示放大 //构造方法有多个,参数不一样,有的是设置x,y,z轴的缩放倍数 auto scaleBy = ScaleBy::create(3,0.5); ico->runAction(scaleBy); } //测试ScaleTo的方法 void ActionScene::testScaleTo(){ //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半大小 //构造方法有多个,参数不一样,有的是设置x,z轴的缩放倍数 auto scaleTo = ScaleTo::create(3,0.5); ico->runAction(scaleTo); }
旋转:
//测试rotateTo的方法 void ActionScene::testRotateTo(){ //创建一个rotateTo动作,第一个参数是时间,第二个参数是旋转角度 //这里是使用节点在5秒内旋转180度 //也有其它参数的构造方法,比如设置x,y轴等 auto rotateTo = RotateTo::create(5,180); ico->runAction(rotateTo); } //测试rotateBy的方法 void ActionScene::testRoteteBy(){ //创建一个rotateTo动作,第一个参数是时间,第二个参数是旋转角度 //这里是使用节点在5秒内旋转180度 //也有其它参数的构造方法,比如设置x,y轴等 auto rotateBy = RotateBy::create(5,180); ico->runAction(rotateBy); }
淡入淡出的效果:
//测试fadeIn的方法 void ActionScene::testFadeIn(){ //淡入,参数表示时间,这里是5秒 auto fadeIn = FadeIn::create(5); ico->runAction(fadeIn); } //测试fadeOut的方法 void ActionScene::testFadeOut(){ //淡出,参数表示时间 auto fadeOut = FadeOut::create(5); ico->runAction(fadeOut); }
//测试色调tintBy的方法 void ActionScene::testTintBy(){ //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值 auto tintBy = TintBy::create(3,100,100); ico->runAction(tintBy); } //测试色调tintTo的方法 void ActionScene::testTintTo(){ //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值 auto tintTo = TintTo::create(3,100); ico->runAction(tintTo); }
视觉特效动作:
闪烁动作:
//测试闪烁动作的方法 void ActionScene::testBlink(){ //创建一个闪烁的动作,第一个参数是闪烁的时间,第二个参数是闪烁次数 //这里是,在5秒内闪烁10次 auto blink = Blink::create(5,10); ico->runAction(blink); }
动画:
//测试动画效果 void ActionScene::testAnimation(){ //先把动画图片存储进精灵帧缓存 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist"); //声明一个精灵侦的向量集合 Vector<SpriteFrame*> frames; //一个for循环,取出图片里面包含的精灵帧 for (int i=1; i<=14; i++) { //取出一帧的名字,后面是一个图片名字表达式 __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",i); //利用帧的名字,从缓存中取出这一帧的指针 SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_name->getCString()); //把这一帧压进精灵帧的集合 frames.pushBack(frame); } //根据精灵帧建立一个动画,第一个参数是精灵帧的集合,第二个参数是帧与帧之间的延迟时间 Animation* anim = Animation::createWithSpriteFrames(frames,1.0f/24.0f); //运行动画 ico->runAction(Animate::create(anim)); }
控制动作与顺序执行动作:
这是一类特殊的动作,用于对一些动作进行精确地控制,利用这一类动作,可以实现一些非常实用的功能 ,因为它们是十分有用的,这类动作包括DealyTime,Repeat和RepeatForever等。DelayTime可以将动作延迟一定的时间执行,Repeat可以重复一定的次数,RepeatForever可以使一个动作不断重复下去,下面是代码:
void ActionScene::testControlAction(){ //创建一个moveBy动作 auto moveBy = MoveBy::create(2,20)); //这也是一个动作,这表示moveBy动作返回执行 auto r = moveBy->reverse(); //这是一个延迟时间,参数的延迟的时间 auto delayTime = DelayTime::create(3); //一个动作的集合,参数可以添加多个动作,最后以NULL结束 //它会顺序执行这些动作,先执行第一个,然后第二个…… auto sequence = Sequence::create(moveBy,r,delayTime,NULL); //创建一个重复,第一个参数是动作集合,第二个参数是重复次数 auto repeat = Repeat::create(sequence,2); //创建一个永久重复,只需要添加动作就可以了 auto repeatForever = RepeatForever::create(sequence); //执行动作 ico->runAction(repeat); }
并列执行一些动作:
void ActionScene::testSpawnAction(){ //创建一个moveBy动作 auto moveBy = MoveBy::create(2,20)); //先把动画图片存储进精灵帧缓存 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist"); //声明一个精灵侦的向量集合 Vector<SpriteFrame*> frames; //一个for循环,取出图片里面包含的精灵帧 for (int i=1; i<=14; i++) { //取出一帧的名字,后面是一个图片名字表达式 __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",1.0f/24.0f); //一个动作的集合,参数可以添加多个动作,最后以NULL结束 //它会并列执行这些动作,所有的动作,同时执行 auto spawn = Spawn::create(moveBy,Animate::create(anim),NULL); //执行动作,这里,它会一边播放动画,一边移动 ico->runAction(spawn); }
动作的速度控制:
1:speed
可能 线性地改变动作的速度,可以成倍在实现快放或者慢放。
2:ActionEase
代码如下: