cocos2d:——第七节:动作

cocos2d:——第七节:动作,第1张

概述简介: cocos2d中为了让游戏画面动起来,有两种方法,一是直接修改属性,例如位置,大小,旋转,等。另外一种就是使用动作。 cocos2d提供了丰富的动作类,这些动作类分为瞬时动作,持续动作,复合动作和速度变化等。 Action是动作类的基类,所有的动作都派生这个类,它创建的一个对象代表一个动作,动作用于Node,因为,任何一个动作都需要由Node对象来执行。 一个简单示例: bool Act 简介: cocos2d中为了让游戏画面动起来,有两种方法,一是直接修改属性,例如位置,大小,旋转,等。另外一种就是使用动作。 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 它是一些效果的封装。它包括了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:——第七节:动作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存