本系列博客基于cocos2dx_3.14.1版本
1.程序入口
main.cpp
#include "main.h"
#include "../Classes/AppDelegate.h"
USING_NS_CC;
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// create the application instance
AppDelegate app;
return Application::getInstance()->run();
}
此处
(1)创建了 AppDelegate 的实例 app
(2)运行该 app
2.AppDelegate app; 具体内容
(1) 类的继承关系
AppDelegate.h
class AppDelegate : private cocos2d::Application
{
...
}
CCApplication-win32.h
class CC_DLL Application : public ApplicationProtocol
{
...
}
(2) 构造函数
AppDelegate.cpp
AppDelegate::AppDelegate() {
}
Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
//返回自身应用程序的句柄
_instance = GetModuleHandle(nullptr);
_animationInterval.QuadPart = 0;
//此时应该为 nullptr
CC_ASSERT(! sm_pSharedApplication);
// 赋值为 AppDelegate* 类型
sm_pSharedApplication = this;
}
此处需要注意的就是 sm_pSharedApplication,
看它的声明
CCApplication-win32.h
static Application * sm_pSharedApplication;
它是一个静态变量,保存的是Application* ,用于单例,即每次只会存在一个应用,且保存在sm_pSharedApplication。以后可以使用Application的静态方法来获得sm_pSharedApplication。
目前遇到了一些其他没有详细解释的内容,暂时把它当做细枝末节,以后再深究。
3.Application::getInstance()->run(); 具体内容
(1)Application::getInstance()
CCApplication-win32.h
static Application* getInstance();
CCApplication-win32.cpp
Application* Application::getInstance()
{
CC_ASSERT(sm_pSharedApplication);
//返回的是 AppDelegate* 类型
return sm_pSharedApplication;
}
该方法为静态成员方法,可以直接通过类名来访问。
作用:返回刚才保存的 app
(2) -run();
CCApplication-win32.cpp
int Application::run()
{
PVRFrameEnableControlWindow(false);//注册表相关,暂时不用理会
// 主消息循环:
LARGE_INTEGER nLast;
LARGE_INTEGER nNow;
QueryPerformanceCounter(&nLast);//获得当前的准确时间
initGLContextAttrs();
// 初始化实例和cocos2d。
if (!applicationDidFinishLaunching())
{
return 1;
}
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
// Retain glview 避免在主循环被释放掉
glview->retain();
while(!glview->windowShouldClose())//一直循环
{
QueryPerformanceCounter(&nNow);
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart);
director->mainLoop();
glview->pollEvents();
}
else
{
Sleep(1);
}
}
// 如果窗口是手动关闭,那么Director还需要执行清理。
if (glview->isOpenGLReady())
{
director->end();
director->mainLoop();
director = nullptr;
}
glview->release();
return 0;
}
可以看到这里的内容很多,不过主要分为初始化、主循环和退出主循环三部分。
其中 initGLContextAttrs(),applicationDidFinishLaunching() 均在AppDelegate 中有相应的重载,该处调用的函数也均为AppDelegate的相应函数,因为Application::getInstance()获得的是AppDelegate类型的指针。
到此程序的主要逻辑流程已经差不多了。下面就是对之前遇到的主要的类的分析了,包括Application,Director等。