cocos动作使用示例(2)

来源:互联网 发布:java 培训 被辞退 编辑:程序博客网 时间:2024/06/03 16:42

动作应用2

创建一个随机飘动的精灵,并且精灵随着飘动方向旋转。(CallFuncN+Bezier+递归+定时器)

 

Vec2 _prevPos;  //为了便于旋转计算

Sprite* _sprite;

 

DrawNode* _drawNode;

bool init()

{   Layer::init();

auto winSize = Director::getInstance()->getWinSize();

        /* 1.创建精灵 */

    Sprite* sprite = Sprite::create("Images/blocks.png");

    _sprite = sprite;           addChild(sprite);

    sprite->setPosition(winSize.width / 2,winSize.height / 2);

    _prevPos = sprite->getPosition();

 

    _drawNode = DrawNode::create(); addChild(_drawNode);

 

    // 2. 随机运动精灵

    runRandom(sprite);

 

    // 6. 增加旋转控制

    scheduleUpdate();

    return true;

}

void runRandom(Node*sprite)

{

        auto winSize = Director::getInstance()->getWinSize();

        // 3. 随机bezier曲线实现随机运动

        ccBezierConfig cfg;

        cfg.controlPoint_1 = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);

        cfg.controlPoint_2 = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);

        cfg.endPosition = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);

       

// 4. 不能RepeatForever,使用sequence,当随机运动完毕之后,再调用自己实现新的随机曲线运动,形成递归

BezierTo* b = BezierTo::create(cfg.endPosition.getDistance(sprite->getPosition())/ 60, cfg);

CallFuncN* call = CallFuncN::create(CC_CALLBACK_1(T020403ActionP2::runRandom,this));

        sprite->runAction(Sequence::createWithTwoActions(b,call));//用CallFuncN递归调用这个函数实现无线贝塞尔飘动,参数还是这个节点精灵

        // 5. 绘制debug

        // 到此,我们能看到精灵随机运动,但是精灵没有旋转

        if (_drawNode)_drawNode->removeFromParent();

        _drawNode = DrawNode::create();

        addChild(_drawNode);

        _drawNode->drawCubicBezier(sprite->getPosition(),

            cfg.controlPoint_1,

            cfg.controlPoint_2,

            cfg.endPosition, 100, Color4F::RED);

}

//7. 计算当前位置和原来位置的角度,调用setRotation去旋转精灵

    // 旋转完毕之后,当前位置赋值给原来位置,准备下一帧的计算

void update(float)

{

        Vec2 pos =_sprite->getPosition();

 

        /* 计算角度,并且旋转 */

        float angle = (pos -_prevPos).getAngle();//位置偏角的结果是弧度,但90减去这个结果才是旋转弧度

        _sprite->setRotation(90-CC_RADIANS_TO_DEGREES(angle)); //将弧度转换成角度的函数,

        _prevPos = pos;

}

总结:

1. 和旋转有关的东西都会用到求位置差,然后用这个结果求getAngel()函数

2. CC_RADIANS_TO_DEGREES函数完成弧度角度转换

3. CallFuncN的用法,其参数Node*很灵活

4. DrawNode::drawCubicBezier()绘制高阶贝塞尔的方法

5. 递归的应用

 

0 0
原创粉丝点击