zoukankan      html  css  js  c++  java
  • Cocos2d-x和时间有关的代码

    用cocos2d-x获取系统时间,格式为年月日时分秒:

    void GetTime(float dt)
     {
        struct tm *tm;
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
        //win32平台
        time_t timep; 
        time(&timep); 
        tm = localtime(&timep);
    #else 
        //android、ios平台
     
        struct cc_timeval now; 
        CCTime::gettimeofdayCocos2d(&now, NULL);
        tm = localtime(&now.tv_sec);
    #endif  
         int year = tm->tm_year + 1900;
         int month = tm->tm_mon + 1;
         int day = tm->tm_mday;
         int hour=tm->tm_hour;
         int min=tm->tm_min;
         int second=tm->tm_sec;
    }

    实现游戏倒计时的代码:

    在CCDirector中有个getScheduler()得到时刻表【调度者】,我们可以使用时刻表【调度者】CCScheduler,来暂停所有的调度。在CCScheduler暂停所有的调度是这样子的:

    CCScheduler.h

    /** Pause all selectors from all targets.
    You should NEVER call this method, unless you know what you are doing.
    //提示我们不应该调用此方法,但是目前我测试中没有出现什么问题
    @since v2.0.0
    */
    CCSet* pauseAllTargets();

    CCSchedule.cpp

    CCSet* CCScheduler::pauseAllTargets()
    {
    return pauseAllTargetsWithMinPriority(kCCPrioritySystem);
    }
      
    CCSet* CCScheduler::pauseAllTargetsWithMinPriority(int nMinPriority)
    {
    CCSet* idsWithSelectors = new CCSet();// setWithCapacity:50];
    idsWithSelectors->autorelease();
    // Custom Selectors
    for(tHashSelectorEntry *element = m_pHashForSelectors; element != NULL;
    element = (tHashSelectorEntry*)element->hh.next)
    {
    element->paused = true;
    idsWithSelectors->addObject(element->target);
    }
      
    // Updates selectors
    tListEntry *entry, *tmp;
    if(nMinPriority < 0) { DL_FOREACH_SAFE( m_pUpdatesNegList, entry, tmp ) { if(entry->priority >= nMinPriority)
    {
    entry->paused = true;
    idsWithSelectors->addObject(entry->target);
    }
    }
    }
      
    if(nMinPriority) paused = true;
      
    idsWithSelectors->addObject(entry->target);
      
    }
      
    }
      
    DL_FOREACH_SAFE( m_pUpdatesPosList, entry, tmp )
      
    {
      
    if(entry->priority >= nMinPriority)
      
    {
      
    entry->paused = true;
      
    idsWithSelectors->addObject(entry->target);
      
    }
      
    }
      
    return idsWithSelectors;
      
    }

    暂停之后,我们再次执行的时候需要恢复,方法如下:

    CCScheduler.h

    /** Resumes the target.
      
    The 'target' will be unpaused, so all schedule selectors/update will be 'ticked' again.
      
    If the target is not present, nothing happens.
      
    @since v0.99.3
      
    */
      
    void resumeTarget(CCObject *pTarget);
      
    /** Resume selectors on a set of targets.
      
    This can be useful for undoing a call to pauseAllSelectors.
      
    @since v2.0.0
      
    */
      
    void resumeTargets(CCSet* targetsToResume);

    CCScheduler.cpp

    void CCScheduler::resumeTarget(CCObject *pTarget)
      
    {
      
    CCAssert(pTarget != NULL, "");
      
    // custom selectors
      
    tHashSelectorEntry *pElement = NULL;
      
    HASH_FIND_INT(m_pHashForSelectors, &pTarget, pElement);
      
    if (pElement)
      
    {
      
    pElement->paused = false;
      
    }
      
    // update selector
      
    tHashUpdateEntry *pElementUpdate = NULL;
      
    HASH_FIND_INT(m_pHashForUpdates, &pTarget, pElementUpdate);
      
    if (pElementUpdate)
      
    {
      
    CCAssert(pElementUpdate->entry != NULL, "");
      
    pElementUpdate->entry->paused = false;
      
    }
      
    }
      
    void CCScheduler::resumeTargets(CCSet* pTargetsToResume)
      
    {
      
    CCSetIterator iter;
      
    for (iter = pTargetsToResume->begin(); iter != pTargetsToResume->end(); ++iter)
      
    {
      
    resumeTarget(*iter);
      
    }
      
    }

    在看完源码之后,来说下实际运用:

    点击暂停按钮:

    void MainGameScene::pauseMenuCallBack( CCObject *pSender )
    {
        FDDialogLayer *dialogLayer = FDDialogLayer::create(DIALOG_GAME_PAUSE);
        _m_pBeforeTargetSets = CCDirector::sharedDirector()->getScheduler()->pauseAllTargets();    //这是关键1
        _m_pBeforeTargetSets->retain();    //这是关键2
      
      this->addChild(dialogLayer,500,500);
      
    }    

    点击恢复按钮:

    }else if(m_pDialogSpecies == DIALOG_GAME_FORGROUND)
    {
      timeFlag = 1;//这是关键3,此tag用于图片切换
      timeSprite = CCSprite::create(RESUME_FIR);
      
      CCSize winSize = CCDirector::sharedDirector()->getWinSize();
      timeSprite->setPosition(ccp(winSize.width/2,winSize.height/2));
      this->addChild(timeSprite);
      
      if (timeSprite) {
        this->schedule(schedule_selector(FDDialogLayer::updateTime),1);//这是关键4 调度
      
      }
    }
      
    void FDDialogLayer::updateTime(float dt)
    {
      if (timeFlag < 3) 
      {
        timeFlag++;
        char temp[32];
        sprintf(temp, "resume/t%d.png",timeFlag);
        CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(temp);     CCSize conSize = texture->getContentSize();     timeSprite->setTexture(texture);     timeSprite->setTextureRect(CCRectMake(0, 0, conSize.width, conSize.height));   }else   {     continueGame();//这是关键5 返回场景     this->unschedule(schedule_selector(FDDialogLayer::updateTime));   } } void FDDialogLayer::continueGame() {   MainGameScene *mainGame = (MainGameScene*)CCDirector::sharedDirector()->getRunningScene()->getChildren()->objectAtIndex(0);   CCSet *set = mainGame->getBeforeTargetSets();//这是关键6,这是暂停所有调度者时的返回值   CCDirector::sharedDirector()->getScheduler()->resumeTargets(set);//这是关键7 恢复游戏   this->removeFromParentAndCleanup(true);   CCTextureCache::sharedTextureCache()->removeTextureForKey(RESUME_FIR);   CCTextureCache::sharedTextureCache()->removeTextureForKey(RESUME_SEC);   CCTextureCache::sharedTextureCache()->removeTextureForKey(RESUME_TIR); }
     
  • 相关阅读:
    Amount of Degrees(数位dp)
    【BZOJ2820】【XSY1721】GCD(莫比乌斯反演)
    【XSY2671】【BZOJ2693】jzptab(莫比乌斯反演)
    【模板】莫比乌斯反演
    CDQ分治&&整体二分
    线性方程组之高斯消元
    矢量及【模板】二维凸包
    回收数据表Ⅰ
    Spring的bean管理(注解)
    jquery与ajax的XMLHttpRequest对象介绍
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/3861321.html
Copyright © 2011-2022 走看看