1.Schedule是一个定时器,是单线程的定时器
2.scheduleUpdate和update
scheduleUpdate函数是为了把当前节点添加到队列里,只要把这个节点添加到队列里,那么这个节点就会在游戏的每一帧调用一次update函数。
update的float dt参数,是上一次调用到这一次间隔的时间
3.schedule和回调函数
void myUpdate(float dt);
//指定每一帧都执行的函数
schedule(schedule_selector(HelloWorld::myUpdate));
//指定间隔时间的定时器,每隔2s执行一次
schedule(schedule_selector(HelloWorld::myUpdate),2.0f);
4.取消定时器
unscheduleUpdate();
unschedule(schedule_selector(HelloWorld::myUpdate));
取消所有的update函数
unscheduleAllSelectors();
5.触发器
scheduleOnce(schedule_selector(HelloWorld::myUpdate),2.0f);
6.不精确的时间
不管是schedule还是scheduleOnce,都有可能出现时间差,因为我们无法预计在某段时间内是否会有耗时的操作发生
7.更准确的计时
可以根据当前时间的总和来判断时间
TimeCounter #include "cocos2d" USING_NS_CC; class TimerCounter : public Node{ public: CREATE_FUN(TimerCounter); virtual bool init(); virtual void update(float dt); void start();//开始计时 float getCountTime();//获取当前时间 private: float m_time; } #include "TimeCounter.h" bool TimeCounter::init(){ return true; } void TimeCounter::update(float dt){ m_time += dt; } float TimeCounter::getCountTime(){ return m_time; } void TimeCounter::start(){ m_time = 0; this->scheduleUpdate(); }
8.定时回调功能封装类
TimeCounter #include "cocos2d" USING_NS_CC; class TimerCounter : public Node{ public: CREATE_FUN(TimerCounter); virtual bool init(); virtual void update(float dt); void start(float callBackTime,std::function<void()> func);//开始计时 //指定回调时间和回调函数 private: float m_time; float m_callBackTime;//回调时间 bool m_isCounting;//是否正在计时 std:function<void()> m_func;//回调函数 } #include "TimeCounter.h" bool TimeCounter::init(){ m_isCounting = false; this->scheduleUpdate(); return true; } void TimeCounter::update(float dt){ if(!m_isCounting){ return; } m_time += dt; if(m_time >= m_callBackTime){ m_func(); m_isCounting = false; } } void TimeCounter::start(float callBackTime,std::function<void()> func){ m_time = 0; m_callBackTime = callBackTime; m_func = func; m_isCounting = true; }