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); }

 

 
posted @ 2014-07-22 20:38  滴水瓦  阅读(808)  评论(0编辑  收藏  举报