Cocos2d3.0学习笔记-Action复杂动作

今天我们来学习一下,较为复杂的动作。
内容主要有

  • 贝塞尔曲线运动
  • 重复动作
  • 组合动作

贝塞尔曲线运动 - BezierTo BezierBy

不了解贝塞尔曲线的,可以百度一下相关知识,这里只做实现就不解释了。
一共有两种,BezierTo和 BezierBy

  • BezierTo 是向目标位置进行移动,与精灵当前位置无关
  • BezierBy 是在当前精灵的位置基准下进行移动的

BezierTo实现

//---------------------------BezierTo 贝塞尔曲线运动-------------------------------------
    //获得屏幕尺寸
    Size visiableSize = Director::getInstance()->getVisibleSize();

    //添加一个精灵,这里测试时,可以尝试改变panda_spr1的 y值,就可以发现BezierTo的特性了
    Sprite* panda_spr1 = Sprite::create("panda2.png");
    panda_spr1->setPosition(ccp(0, 400));
    this->addChild(panda_spr1);


    //创建贝塞尔曲线的配置
    ccBezierConfig bezier;
    bezier.controlPoint_1 = Point(100, 0);   //波谷偏向值
    bezier.controlPoint_2 = Point(200, 250);     //波峰偏向值
    bezier.endPosition = Point(300, 0); //动作终点

    //创建 BezierTo 动作对象, BezierTo 是向目标位置进行移动,与精灵当前位置无关
    BezierTo* bezierToAct = BezierTo::create(4.0f, bezier);

    //执行动作
    panda_spr1->runAction(bezierToAct);

BezierBy 实现

    //---------------------------BezierBy 贝塞尔曲线运动-------------------------------------
    //获得屏幕尺寸
    Size visiableSize = Director::getInstance()->getVisibleSize();

    //添加一个精灵
    Sprite* panda_spr1 = Sprite::create("panda2.png");
    panda_spr1->setPosition(ccp(50, 180));
    this->addChild(panda_spr1);


    //创建贝塞尔曲线的配置
    ccBezierConfig bezier;
    bezier.controlPoint_1 = Point(100, 0);   //波谷偏向值
    bezier.controlPoint_2 = Point(200, 250);     //波峰偏向值
    bezier.endPosition = Point(300, 0); //动作终点


    //创建 BezierBy 动作对象,BezierBy 是在当前精灵的位置基准下进行移动的
    BezierBy* bezierByAct = BezierBy::create(4.0f, bezier);

    //执行动作
    panda_spr1->runAction(bezierByAct);

重复运动-RepeatForever

先实现一个弹跳 jumpBy 效果,跳两秒,向上1/3width向右1/3height,跳跃高度200,一共跳两次

    //获取屏幕大小
    Size visiableSize = Director::getInstance()->getVisibleSize();

    //新建一个精灵
    Sprite* panda_spr = Sprite::create("panda2.png");
    panda_spr->setPosition(ccp(0, 0));
    this->addChild(panda_spr);

    //创建一个 弹跳 对象,参数分别是,跳两秒,向上1/3width向右1/3height,跳跃高度200,一共跳两次
    JumpBy* jpByAct = JumpBy::create(2.0f, ccp(visiableSize.width / 3, visiableSize.height / 3), 200, 2);

    //runAction 启动动作
    panda_spr->runAction(jpByAct);

我们让他重复执行跳跃操作,只需要一句话

-RepeatForever* repForAct = RepeatForever::create(jpByAct);
然后将启动动作,改成重复动作repForAct,他就一直做动作,不停喽。


    //获取屏幕大小
    Size visiableSize = Director::getInstance()->getVisibleSize();

    //新建一个精灵
    Sprite* panda_spr = Sprite::create("panda2.png");
    panda_spr->setPosition(ccp(0, 0));
    this->addChild(panda_spr);

    //创建一个 弹跳 对象,参数分别是,跳两秒,向上1/3width向右1/3height,跳跃高度200,一共跳两次
    JumpBy* jpByAct = JumpBy::create(2.0f, ccp(visiableSize.width / 3, visiableSize.height / 3), 200, 2);

    RepeatForever* repForAct = RepeatForever::create(jpByAct);

    //runAction 启动动作
    panda_spr->runAction(repForAct);

组合动作-Sequence 和 Spawn

  • Sequence 就是所有 动作 按顺序 一个一个 做
  • Spawn 就是所有 动作 一起 做
  • 最终动作结束点,两者是一样的,只是过程不一样。可以自己试一下,体验一下,还是很好玩的。
    //获取屏幕大小
    Size visiableSize = Director::getInstance()->getVisibleSize();

    //新建一个精灵
    Sprite* panda_spr = Sprite::create("panda2.png");
    panda_spr->setPosition(ccp(0, 0));
    this->addChild(panda_spr);

    //创建一个 弹跳 对象,参数分别是,跳两秒,向上1/3width向右1/3height,跳跃高度200,一共跳两次
    JumpBy* jpByAct = JumpBy::create(2.0f, ccp(visiableSize.width / 3, visiableSize.height / 3), 200, 2);

    //创建一个 移动 对象
    MoveBy* moveByAct = MoveBy::create(4.0f, ccp(visiableSize.width / 3, visiableSize.height / 3));

    //创建一个 旋转 对象,转转转,哈哈
    RotateBy* rotaByAct = RotateBy::create(6.0f, 3600, 3600);

    //------------------------Spawn所有动作一起运动----------------------------
    Action* action = Spawn::create(jpByAct, moveByAct, rotaByAct, NULL);

    //------------------------Sequence所有动作按顺序运动----------------------------
    //Action* action = Sequence::create(jpByAct, moveByAct, rotaByAct, NULL);

    //runAction 启动动作
    panda_spr->runAction(action);

成功了没,是不是很好玩?嘿嘿。这种组合动作明显有趣多了。

你可能感兴趣的:(cocos2d)