6.1 定时器的基本使用
假设你现在喜欢上了一个女孩,那么就应该大胆地去表白。可是这时候你发现了一个悲伤的事实,那就是她现在有男朋友。这时候呢,你就面临着两个选择:一是果断放弃然后另找一个喜欢的女孩,但是不出例外的话你还会默默地关注一下他们分手了没有,然后再进行下一轮的抉择;或者是干脆就偷偷地关注着,一发现他们有分手的迹象就立即行动。
在设计模式中,对这样子追女孩的方法有一个经典的概括就是观察者模式(关于设计模式的内容将在本书第12章详细介绍,在此只做一点了解)。而在游戏中常常也需要采用类似的方法达到某些目的。比如说,主角行走在地图上,需要知道主角有没有行走到地图边界之外的地方,那么就需要不断地获取主角当前的位置坐标与地图的范围进行比较。
Cocos2d-x提供了一个对象schedule,可以被简单地看作是一个定时器,通过它可以按照一定的频率不断地调用某个函数,从而达到观察并掌控游戏中一切的目的。
新创建一个Cocos2d-x项目并命名为ChapterSix01,在HelloWorldScene.h中加入一个update方法,用来实现回调,此时对类HelloWorld的定义如下:
class HelloWorld : public Cocos2d::Layer { public: static Cocos2d::Scene* createScene(); virtual bool init(); virtual void update(float dt); //重写update方法 CREATE_FUNC(HelloWorld); };
然后在HelloWorldScene.cpp中重写该方法:
void HelloWorld::update(float dt) { CCLOG("update:%d",GetCurrentTime()); }
其中GetCurrentTime方法的作用是获得以毫秒为单位的时间戳,然后在init方法中加入如下代码:
scheduleUpdate();
系统就会不断地调用update方法输出当前的时间戳,运行程序之后的结果如图6-1所示。
图6-1 不断输出当前系统的时间戳
有聪明的读者应该已经联想到了,在第4章的最后曾经介绍过一个利用Cocos2d-x实现虚拟摇杆的例子,但是那时并没有实际介绍摇杆的使用方法。不过相信现在读者已经能够猜到了,可以使用update方法不断地读取摇杆的方向属性,然后根据其方向不断地进行响应就可以了。