Cocos2d-x和时间有关的代码

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获取系统时间,格式为年月日时分秒:

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

2

 

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**    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

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

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

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

}

点击恢复按钮:

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

6

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

}

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

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值