概述
Cocos2d-x和时间有关的代码
用cocos2d-x获取系统时间,格式为年月日时分秒:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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
1 2 3 4 5 6 | /** 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| CCSet* CCScheduler::pauseAllTargets() { returnpauseAllTargetsWithMinPriority(kCCPrioritySystem); } CCSet* CCScheduler::pauseAllTargetsWithMinPriority(int nMinPriority) { CCSet* idsWithSelectors = newCCSet();// 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); } } returnidsWithSelectors; } |
暂停之后,我们再次执行的时候需要恢复,方法如下:
CCScheduler.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** Resumes theCocos2d-x和时间有关的代码 Android淘气小公主|2013-09-17 17:28|4007次浏览|代码(34)时间(2)CCDirector(1)0 用cocos2d-x获取系统时间,格式为年月日时分秒:
实现游戏倒计时的代码: 在CCDirector中有个getScheduler()得到时刻表【调度者】,我们可以使用时刻表【调度者】CCScheduler,来暂停所有的调度。在CCScheduler暂停所有的调度是这样子的: CCScheduler.h
CCSchedule.cpp
暂停之后,我们再次执行的时候需要恢复,方法如下: CCScheduler.h
CCScheduler.cpp
在看完源码之后,来说下实际运用: 点击暂停按钮:
点击恢复按钮:
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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); } } |
在看完源码之后,来说下实际运用:
点击暂停按钮:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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); } |
点击恢复按钮:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 | }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); } |
最后
以上就是朴素白羊为你收集整理的Cocos2d-x和时间有关的代码的全部内容,希望文章能够帮你解决Cocos2d-x和时间有关的代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复