• 序列
    • Sequence 示例
    • Spawn

    序列

    动作序列(Sequence) 是一种封装多个动作的对象,当这个对象执行时被封装的动作会顺序执行。

    一个 Sequence 可以包含任何数量的动作对象,回调方法和其它序列。可以包含回调方法? 没错! Cocos2d-x 允许把一个方法添加进去 CallFunc 对象,然后将 CallFunc 添加到 Sequence,这样,在执行序列的时候就能触发方法调用。因此,你能在一个序列中添加一些个性化的功能,而不仅仅是添加 Cocos2d-x 提供的有限动作。下面是一个序列的动作执行示意图:

    动作序列  - 图1

    Sequence 示例

    1. auto mySprite = Sprite::create("mysprite.png");
    2. // create a few actions.
    3. auto jump = JumpBy::create(0.5, Vec2(0, 0), 100, 1);
    4. auto rotate = RotateTo::create(2.0f, 10);
    5. // create a few callbacks
    6. auto callbackJump = CallFunc::create([](){
    7. log("Jumped!");
    8. });
    9. auto callbackRotate = CallFunc::create([](){
    10. log("Rotated!");
    11. });
    12. // create a sequence with the actions and callbacks
    13. auto seq = Sequence::create(jump, callbackJump, rotate, callbackRotate, nullptr);
    14. // run it
    15. mySprite->runAction(seq);

    上面这个 Sequence 做了什么? 按照下面的顺序执行了每一个动作。

    Jump -> callbackJump() -> Rotate -> callbackRotate()

    Spawn

    SpawnSequence 是非常相似的,区别是 Spawn 同时执行所有的动作。Spawn 对象可以添加任意数量的动作和其它 Spawn 对象。

    动作序列  - 图2

    Spawn 的效果和同时运行多个动作的 runAction() 方法是一致的,但是它的独特之处是 Spawn 能被放到 Sequence 中,结合 SpawnSequence 能实现非常强大的动作效果。

    例如,创建两个动作:

    1. // create 2 actions and run a Spawn on a Sprite
    2. auto mySprite = Sprite::create("mysprite.png");
    3. auto moveBy = MoveBy::create(10, Vec2(400,100));
    4. auto fadeTo = FadeTo::create(2.0f, 120.0f);

    使用 Spawn

    1. // running the above Actions with Spawn.
    2. auto mySpawn = Spawn::createWithTwoActions(moveBy, fadeTo);
    3. mySprite->runAction(mySpawn);

    同时调用方法 runAction()

    1. // running the above Actions with consecutive runAction() statements。
    2. mySprite->runAction(moveBy);
    3. mySprite->runAction(fadeTo);

    上面两种方式产生的效果是一样的,现在看把一个 Spawn 添加到一个 Sequence 中是怎样的一种情景,动作的执行流程会看起来像这样:

    动作序列  - 图3

    1. // create a Sprite
    2. auto mySprite = Sprite::create("mysprite.png");
    3. // create a few Actions
    4. auto moveBy = MoveBy::create(10, Vec2(400,100));
    5. auto fadeTo = FadeTo::create(2.0f, 120.0f);
    6. auto scaleBy = ScaleBy::create(2.0f, 3.0f);
    7. // create a Spawn to use
    8. auto mySpawn = Spawn::createWithTwoActions(scaleBy, fadeTo);
    9. // tie everything together in a sequence
    10. auto seq = Sequence::create(moveBy, mySpawn, moveBy, nullptr);
    11. // run it
    12. mySprite->runAction(seq);

    运行本文档的 代码示例 去看一下效果吧!