Cocos2d-x游戏开发实战精解
上QQ阅读APP看书,第一时间看更新

6.4 使用定时器实现触发器

上一节学习了定时器的注册和取消,通过这两个操作已经能够实现一些类似于定时炸弹那样的效果了。比如说预计在游戏开场10秒时播放一段爆炸的动画,就可以将定时器触发的时间间隔设为1秒,然后在第10次触发的时候,在回调函数中执行相应的操作。

实际上Cocos2d-x还提供了一个更方便的方法来实现这样的功能,具体实现如范例6-2所示,完整项目可见源文件目录下的项目ChapterSix04。

【范例6-2】利用定时器实现定时炸弹。

01 bool HelloWorld::init()
02      {
03          if ( !Layer::init() )
04          {
05              return false;
06              }
07              //加入白色背景
08              auto* background = LayerColor::create(ccc4(255, 255, 255, 255));
09              addChild(background);
10          //在场景中加入“炸弹”
11              bomb = Sprite::create("bomb.png");
12              bomb->setPosition(320, 180);
13              addChild(bomb);
14              scheduleOnce(schedule_selector(HelloWorld::bang),5.0f);
                //注册定时器
15          return true;
16      }
17      void HelloWorld::bang(float dt)
18      {
19              //设置动画
20              auto* m_frameCache = SpriteFrameCache::getInstance();
21              m_frameCache->addSpriteFramesWithFile("bang.plist", "bang. 
                png");
22              Vector<SpriteFrame*> frameArray;
23              for (int i = 1; i < 11; i++)
24              {
25                      auto* frame = 
26              m_frameCache->getSpriteFrameByName(String::createWithFormat
                "bang%d.png", i)->getCString());
27                      frameArray.pushBack(frame);
28              }
29              Animation* animation = Animation::createWithSpriteFrames 
                (frameArray);
30              animation->setLoops(1);                              //动画只播放一次
31              animation->setDelayPerUnit(0.1f);            
                //每两张图片的时间隔,图片数目越少,间隔最小就越小
32              auto* action = Animate::create(animation);
33              bomb->runAction(action);
34      }

运行程序之后出现如图6-5显示的界面,在白色的场景中央有一个“炸弹”,大约5秒之后炸弹爆炸,最终定格在如图6-6所示的画面。

图6-5 最初屏幕中央显示炸弹图样,炸弹无动作

图6-6 5秒后炸弹爆炸最终定格在结束帧

在该范例中,自定义方法bang仅仅被调用了一次。阅读代码就能够发现这是由于此范例使用了scheduleOnce方法来注册触发器的原因。其中的第2个参数就是触发器将会在多少秒后被调用,非常简单。