一个简单示例:
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 它是一些效果的封装。它包括了15个动作,可以概括为5类,如下图所示:
代码如下:
//测试速度的方法voID ActionScene::testSpeed(){ //创建一个move动作,时间是5秒 auto moveto = Moveto::create(5,100)); //创建一个速度控制,第一个参数是一个动作,第二个参数是速度的倍数,这里把动作提高到5倍 auto speed = Speed::create(moveto,5); //创建其它速度控制的方法是一样的,这里一并写下来 auto easeIn = EaseIn::create(moveto,5); //动行动作 ico->runAction(speed);}总结
以上是内存溢出为你收集整理的cocos2d:——第七节:动作全部内容,希望文章能够帮你解决cocos2d:——第七节:动作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)