0

我在我的 cocos2d-x 游戏 (c++) ios 中使用了一个计时器。我使用的是 cocos2d-x 2.2 版本。我的时间函数在我的初始化中如下

this->schedule(schedule_selector(HelloWorld::UpdateTimer), 1);

我已将功能定义如下。

void HelloWorld::UpdateTimer(float dt)
{
if(seconds<=0)
{
    CCLOG("clock stopped");
    CCString *str=CCString::createWithFormat("%d",seconds);
    timer->setString(str->getCString());
    this->unschedule(schedule_selector(HelloWorld::UpdateTimer));

}
else
{
CCString *str=CCString::createWithFormat("%d",seconds);
timer->setString(str->getCString());
seconds--;
}

}

一切工作正常。但是即使游戏进入后台状态,我也有这个计时器继续运行。我曾尝试在 appdelegate 中评论 didEnter Background 的主体,但没有成功。任何帮助将不胜感激谢谢

4

2 回答 2

0

在我的 AppDelegate.cpp 中,我在 applicationDidEnterBackground 函数中编写了以下代码。在这里,每当应用程序进入后台并将其存储在 CCUserdefault 键中时,我都会以秒为单位计算时间值。当应用程序进入前台时,我再次使用本地系统时间并从我存储在密钥中的时间中减去它。以下是我的代码

void AppDelegate::applicationDidEnterBackground() 
{
    time_t rawtime;
    struct tm * timeinfo;
    time (&rawtime);
    timeinfo = localtime (&rawtime);

    CCLog("year------->%04d",timeinfo->tm_year+1900);
    CCLog("month------->%02d",timeinfo->tm_mon+1);
    CCLog("day------->%02d",timeinfo->tm_mday);

    CCLog("hour------->%02d",timeinfo->tm_hour);
    CCLog("minutes------->%02d",timeinfo->tm_min);
    CCLog("seconds------->%02d",timeinfo->tm_sec);

    int time_in_seconds=(timeinfo->tm_hour*60)+(timeinfo->tm_min*60)+timeinfo->tm_sec;
    CCLOG("time in seconds is %d",time_in_seconds);
    CCUserDefault *def=CCUserDefault::sharedUserDefault();
    def->setIntegerForKey("time_from_background", time_in_seconds);

    CCDirector::sharedDirector()->stopAnimation();

// if you use SimpleAudioEngine, it must be pause
// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

void AppDelegate::applicationWillEnterForeground() 
{

    CCUserDefault *def=CCUserDefault::sharedUserDefault();
    int time1=def->getIntegerForKey("time_from_background");
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime (&rawtime);

    CCLog("year------->%04d",timeinfo->tm_year+1900);
    CCLog("month------->%02d",timeinfo->tm_mon+1);
    CCLog("day------->%02d",timeinfo->tm_mday);

    CCLog("hour------->%02d",timeinfo->tm_hour);
    CCLog("mintus------->%02d",timeinfo->tm_min);
    CCLog("seconds------->%02d",timeinfo->tm_sec);

    int time_in_seconds=(timeinfo->tm_hour*60)+(timeinfo->tm_min*60)+timeinfo->tm_sec;
    int resume_seconds= time_in_seconds-time1;
    CCLOG("app after seconds ==  %d", resume_seconds);
    CCDirector::sharedDirector()->startAnimation();

// if you use SimpleAudioEngine, it must resume here
// SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

您可以查看并计算应用程序在后台停留的时间。

于 2014-08-06T05:49:49.963 回答
0

如果应用程序进入后台,除了一些特殊的后台线程,没有其他线程被执行。对您来说最好的方法是在 didEnterBackground 期间将 unix 时间戳保存在一个变量中,当应用程序恢复时,获取当前的 unix 时间戳并比较增量,以获得经过的总时间并相应地更新您的计时器。

于 2014-07-14T06:50:45.927 回答