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

Cocos2d-x和时间有关的代码,布布扣,bubuko.com

时间: 2024-08-05 07:37:35

Cocos2d-x和时间有关的代码的相关文章

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

不要相信程序员在加班时间写的代码

不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代码可以略过,不影响理解.) 创造力的时限 写代码,与写文章.绘画.思考复杂问题,并没有本质上的区别,都是创造性的活动. 每个人的创造力,都会随着身体状态而波动.广为人知的是,一个人年老体衰后,相比年富力强时,创造力会急剧下降.其实,人每天的状态起伏,也同样会剧烈影响这一点. 如果是拧螺丝,那么在精疲力尽.拧不动以前,身体

vbs获取当前时间日期的代码

vbs获取当前时间日期的代码,文章来源:脚本学堂. 获取当前日期方法一: Currentdate1=date()msgbox Currentdate1 获取当前日期方法二:Currentdate2=year(Now)&"-"&Month(Now)&"-"&day(Now)msgbox Currentdate2 获取当前时间:CurrentTime=Hour(Now)&":"&Minute(Now)&

千万不要相信程序员在加班时间写的代码!

其中最重要的就是这条:不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代码可以略过,不影响理解.) 创造力的时限 写代码,与写文章.绘画.思考复杂问题,并没有本质上的区别,都是创造性的活动. 每个人的创造力,都会随着身体状态而波动.广为人知的是,一个人年老体衰后,相比年富力强时,创造力会急剧下降.其实,人每天的状态起伏,也同样会剧烈影响这一点. 如果是拧螺丝,那么在精疲

Cocos2d : 模拟IOS时间选择器

使用引擎:cocos2d-js 3.0 使用语言:javascript 运行平台:手机web --------------------------------------------------------------- 初步分析: 操作过程: 滑动,转动,放缓速度,平衡,停止. 时间选择器的功能分析: 1. 滑动 2. N个选项结果(eg. 0~10) 3. 部分数字可见 4. 根据最近原则,自动平衡到结果item 5. ... --------------------------------

C基础 时间业务实战代码

引言 业务代码中遇到这样需求, 1. 二者是同一天吗, 2. 时间戳和时间串来回转, 3. 其它扩展需求 等. C写代码同样需要处理这方面时间问题. 本文就是为了解决这个问题. 相比其它时间库, 这里做了一些扩展. 一般而言 一天开始时间为 00:00:00 , 这里 可以配置一天的开始时间. 举一个实际用的业务例子. 暴雪游戏, 魔兽世界 或者 炉石传说, 每次活动刷新都是以 05:00:00 开始. 这里说明了什么呢, 可以理解为这类游戏世界里, 时间循环的起点就是"05:00:00&quo

自己写的echarts计算时间坐标的代码

1 数据库sql查询的数据 2 最终echarts画出来的图 3 代码如下 计算主方法方法 /** * echarts算时间轴代码(算流量的代码),这里的时间间隔为5秒钟,一分钟的流量,totalSize = 12 * ebuStreamList 为EbuStream的集合, EbuStream的属性有totalStream,time * totalSize为x轴有多少点 * startTime 为起始时间 * */ private String[] getEbuStream(List<EbuS

java8时间搓计算代码运行时间

Instant start = Instant.now(); // XXXXXXXX(你的代码) Instant end = Instant.now(); //时间搓对象 Duration timeElapsed = Duration.between(start, end); //不同格式展示,下面是分钟和秒的样子,还有小时天这些 long l = timeElapsed.toMinutes(); long ls = timeElapsed.toMillis(); System.out.prin

Easyui-datagrid显示时间的格式化代码

{field: 'Time', title: '时间', formatter: function (value, row, index) { var date = new Date(value); var year = date.getFullYear().toString(); var month = (date.getMonth() + 1); var day = date.getDate().toString(); var hour = date.getHours().toString()