我是靠谱客的博主 朴素白羊,最近开发中收集的这篇文章主要介绍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);

}

 

最后

以上就是朴素白羊为你收集整理的Cocos2d-x和时间有关的代码的全部内容,希望文章能够帮你解决Cocos2d-x和时间有关的代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部