序列

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

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

 动作序列  - 图1

Sequence 示例

C++

  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 能实现非常强大的动作效果。

例如,创建两个动作:

C++

  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

C++

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

同时调用方法 runAction()

C++

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

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

 动作序列  - 图3

C++

  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);

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

原文: http://docs.cocos.com/cocos2d-x/manual/zh/actions/sequences.html