这里直接贴出可运行的源代码,用来说明 cocos2d-x 中 scheduleUpdate 定时器背后的实现思路。
#include <iostream>
#include <windows.h>
using namespace std;
class Ref
{
protected:
Ref(){isLoop = false;}
virtual void update(){cout<< "super loop" << endl;}
bool isLoop;
public:
void unScheduleUpdate(){isLoop = false;}
void ScheduleUpdate(){isLoop = true;}
void mainLoop(){if (isLoop)this->update();}
};
class myClass :public Ref
{
public:
virtual void update(){cout << "this loop" << endl;}
};
int main(int argc, char* argv[])
{
Ref*ref = new myClass;
ref->ScheduleUpdate();
for (;;)
{
cout << "loop" << endl;
Sleep(500);
ref->mainLoop();
ref->unScheduleUpdate();
}
return(0);
}
运行结果和 cocos 中的 scheduleUpdate 定时器功能一致。
这个问题困扰了我很久,根本原因还是 C++ 基础不够扎实。实际上这就是一个典型的虚函数应用场景:父类 Ref 声明了虚函数 update,子类 myClass 覆盖它,mainLoop 通过基类指针调用虚函数时,最终执行的就是子类的版本。