Cocos2d-x2.2.3 入口解析
在此我们使用vs2013打开工cocos2d-x工程程那么我们 我们使用win32的。拿到一个这种程序我们该怎么做呢? 第一步当然是找入口点了。因此 我们在工程目录下直接就可以找到这个win32的路口点。
1 int APIENTRY _tWinMain(HINSTANCE hInstance, 2 HINSTANCE hPrevInstance, 3 LPTSTR lpCmdLine, 4 int nCmdShow) 5 { 6 UNREFERENCED_PARAMETER(hPrevInstance); 7 UNREFERENCED_PARAMETER(lpCmdLine); 8 9 // create the application instance 10 AppDelegate app; 11 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); 12 eglView->setViewName("MyGame"); 13 eglView->setFrameSize(480, 320); 14 return CCApplication::sharedApplication()->run(); 15 }
像这种庞大的工程 一般来说 机制都不会简单。简单的只有main 函数而已。
在此我们可以看到 AppDelegate app;在栈中定义了一个类 app 类。而
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setViewName("MyGame");
eglView->setFrameSize(480, 320);
只是用来 设置 标题和 窗口大小的。
真正的主体出现在
CCApplication::sharedApplication()->run();
那我们就要对这一句进行分析了。
我们很容易可以看出 sharedApplication(); 是一个静态函数。
依据是啥?
CCApplication 它是一个类。
而->run();
这句可以看出什么呢?
从这里我有理由相信。
sharedApplication() 这个静态函数的返回值绝对是一个 类指针。
因此我们从这里可以使用vs2013的 F12键 来对程序进行跟踪。
static CCApplication* sharedApplication();
在这里找到了 它的定义
CCApplication* CCApplication::sharedApplication()
{
CC_ASSERT(sm_pSharedApplication);
return sm_pSharedApplication;
}
CC_ASSERT 这个是一个宏,如果为空就直接退出。
那我们看看那个sm 到底是个什么玩意。
CCApplication * CCApplication::sm_pSharedApplication = 0;
其实它就是一个静态变量。
CCApplication::CCApplication()
: m_hInstance(NULL)
, m_hAccelTable(NULL)
{
m_hInstance = GetModuleHandle(NULL);
m_nAnimationInterval.QuadPart = 0;
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this;
}
它在构造函数里 对它进行了实现。在构造的时候 使用this
也就是说 CCApplication::sharedApplication() 返回的其实就是指向app的指针。
run();
函数会继续向下调用。
会调用到applicationDidFinishLaunching() 这个纯虚基类的一个接口。