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