Director::getInstance()->pause()后遇见的问题

在开发小游戏过程中遇到一个问题,使用Director::getInstance()->pause()后,定时器暂停且未重新启动,导致场景替换后动作无法进行,按钮失效。尽管在onExit()中关闭定时器,问题仍未解决。经分析,原因是未调用Director::getInstance()->resume()恢复时间间隔,从而影响了定时器。解决方案是确保使用resume()来重新激活定时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天开发(呵呵 其实就是学习,现在还没有学到自己开发的地步)一个小游戏 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()重新开启定时器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值