这里直接贴出可运行的源代码,用来说明 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 通过基类指针调用虚函数时,最终执行的就是子类的版本。