上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个参数就是触发器将会在多少秒后被调用,非常简单。