用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 + ;
int month = tm->tm_mon + ;
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 < ) { 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,,); }
点击恢复按钮:
}else if(m_pDialogSpecies == DIALOG_GAME_FORGROUND)
{
timeFlag = ;//这是关键3,此tag用于图片切换
timeSprite = CCSprite::create(RESUME_FIR); CCSize winSize = CCDirector::sharedDirector()->getWinSize();
timeSprite->setPosition(ccp(winSize.width/,winSize.height/));
this->addChild(timeSprite); if (timeSprite) {
this->schedule(schedule_selector(FDDialogLayer::updateTime),);//这是关键4 调度 }
} void FDDialogLayer::updateTime(float dt)
{
if (timeFlag < )
{
timeFlag++;
char temp[];
sprintf(temp, "resume/t%d.png",timeFlag);
CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(temp); CCSize conSize = texture->getContentSize();
timeSprite->setTexture(texture);
timeSprite->setTextureRect(CCRectMake(, , conSize.width, conSize.height)); }else
{
continueGame();//这是关键5 返回场景
this->unschedule(schedule_selector(FDDialogLayer::updateTime));
}
} void FDDialogLayer::continueGame() { MainGameScene *mainGame = (MainGameScene*)CCDirector::sharedDirector()->getRunningScene()->getChildren()->objectAtIndex(); 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);
}