今天开发(呵呵 其实就是学习,现在还没有学到自己开发的地步)一个小游戏 Director::getInstance()->pause()后遇见了一个BUG ,
这个BUG导致了定时器处于暂停状态 ,没有再次启用。导致了我用Director::getInstance()->replace(Scene)后动作始终不能动,我设置的连续触发按钮都没有了作用.
最开始以为是没有将定时器关闭的后果 ,然后在onExit()函数中关闭了定时器,问题还没有解决。
经过了半天思考,最终认为可能是因为DIrector::getInstance()->pause()后没有Director::geinstance()->resume();导致定时器没有能够重新开启,
下面我们通过源代码来分析一下
void Director::pause()
{
if (_paused)
{
return;
}
_oldAnimationInterval = _animationInterval;
// when paused, don't consume CPU
setAnimationInterval(1 / 4.0);
_paused = true;
}
void DisplayLinkDirector::setAnimationInterval(float interval)
{
_animationInterval = interval;
if (! _invalid)
{
stopAnimation();
startAnimation();
}
}
这个pause()先保存先前的时间间隔
_oldAnimationInterval = _animationInterval;
然后将时间间隔设置为1/4.0
setAnimationInterval(1 / 4.0);
_animationInterval = interval;
让程序暂停的时候很少量的使用cpu
再看看resume()代码
void Director::resume()
{
if (! _paused)
{
return;
}
setAnimationInterval(_oldAnimationInterval);
_paused = false;
_deltaTime = 0;
// fix issue #3509, skip one fps to avoid incorrect time calculation.
setNextDeltaTimeZero(true);
}
将原来的时间间隔恢复
setAnimationInterval(_oldAnimationInterval);
所以不通过resume重新恢复时间间隔, 定时器是没有用的
总的来说 用了pause() 就要用resume()重新开启定时器