哈喽 各位小伙伴,人最害怕的是不敢,我一个小小码农,今天号称要深入了解cocos2d-x-3.2alpha0 的原理,说干就干。
首先,记住一句话,计算机上展示给我们看的都是画出来的。
win32程序的入口为main函数,找到我们要的main函数;
会发现这两句话:
AppDelegate app;
return Application::getInstance()->run();
不得不说很简洁,先看第2句话,跟进去看看。
在run方法中
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())
{
return 0;
}
擦 调用了applicationDidFinishLaunching()方法 ,我们在AppDelegate.cpp中确实在这个方法里进行了初始化一些设置,和运行场景,不过调用run方法是Application::getInstance()这个东东啊,带着疑问接着看下去。你会看到:
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);//查询定时器的计数值
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
director->mainLoop();//这名字赤裸裸啊 主循环
glview->pollEvents();
}
else
{
Sleep(0);
}
}
while循环而且从条件名一看就知道当glview不应该被关闭也就是游戏没有关闭的情况下这是一个永真的循环(注意逻辑,游戏没有关闭永真的循环)下面是设置帧数的函数(1/帧数)
void Application::setAnimationInterval(double interval)
{
LARGE_INTEGER nFreq;
QueryPerformanceFrequency(&nFreq);//返回硬件支持的高精度计数器的频率。
_animationInterval.QuadPart = (LONGLONG)(interval * nFreq.QuadPart);
}
言归正传,看看传说中的mainLoop
void DisplayLinkDirector::mainLoop()
{
if (_purgeDirectorInNextLoop)// this flag will be set to true in end() 所以不管他
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else if (! _invalid)
{
drawScene();//看见没有又是赤裸裸的绘制场景啊 记住一起都是画出来的
// release the objects
PoolManager::getInstance()->getCurrentPool()->clear();//每一次绘制完成清理autorelease pool.
}
}
Application* Application::getInstance()
{
CC_ASSERT(sm_pSharedApplication);
return sm_pSharedApplication;
}
我擦 直接就return了 搞什么,竟然不是一个单例模式

AppDelegate::AppDelegate() {
}
不愧是无参构造函数 ,真什么都没写啊。难道我系列第一篇就挂了,当然不是(

class AppDelegate : private cocos2d::Application
如果子类构造函数没有显式调用父类构造函数会隐式调用父类无参构造函数。
Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
_instance = GetModuleHandle(nullptr);
_animationInterval.QuadPart = 0;
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this;//找到你了
}
Yes 写完了。