分析工程入口如下:
首先要找到main.cpp文件,文件地址在win32/
main.cpp的主要代码如下:
-
AppDelegate app;
-
return CCApplication::sharedApplication()->run();
看到代码 我们会看CCApplication里写了什么,进入CCApplication.h文件,我们会发现CCAplication继承了CCApplicationProtocol
-
class CC_DLL CCApplication : public CCApplicationProtocol
定义了run()成员函数、静态的成员函数sharedApplication()和静态的成员变量sm_pSharedApplication
-
static CCApplication* sharedApplication();
-
static CCApplication * sm_pSharedApplication;
在其.cpp文件里进行了实现,主要代码如下:
1、run()函数实现
-
int CCApplication::run()
-
{
-
-
if (!applicationDidFinishLaunching())
-
{
-
return 0;
-
}
-
}
2、
sharedApplication()函数实现如下:
-
CCApplication* CCApplication::sharedApplication()
-
{
-
return sm_pSharedApplication;
-
}
3、静态的成员变量sm_pSharedApplication实现如下:
(1)、对sm_pSharedApplication进行了初始化
-
CCApplication * CCApplication::sm_pSharedApplication = 0;
(2)、在CCApplication的构造函数里对sm_pSharedApplication进行赋值
-
CCApplication::CCApplication()
-
{
-
sm_pSharedApplication = this;
-
}
现在我们知道CCAplication继承了CCApplicationProtocol,那么我们看一下CCApplicationProtocol写了什么,进入之后我们发现CCApplicationProtocol是一个抽象类
-
class CC_DLL CCApplicationProtocol
-
{
-
public:
-
-
virtual ~CCApplicationProtocol() {}
-
-
virtual bool applicationDidFinishLaunching() = 0;
-
virtual void applicationDidEnterBackground() = 0;
-
virtual void applicationWillEnterForeground() = 0;
-
virtual void setAnimationInterval(double interval) = 0;
-
virtual ccLanguageType getCurrentLanguage() = 0;
-
virtual TargetPlatform getTargetPlatform() = 0;
-
};
回顾上面的代码,我们发现在CCAplication的run()函数里面调用了
applicationDidFinishLaunching
()函数,那么
applicationDidFinishLaunching
()函数是在哪里实现的呢?,通过对代码的追踪 我们会找到一个APPDelegate类,这里实现了applicationDidFinishLaunching
()函数
-
bool AppDelegate::applicationDidFinishLaunching() {
-
// initialize director
-
CCDirector* pDirector = CCDirector::sharedDirector();
-
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
-
-
pDirector->setOpenGLView(pEGLView);
-
-
// turn on display FPS
-
pDirector->setDisplayStats(true);
-
-
// set FPS. the default value is 1.0/60 if you don't call this
-
pDirector->setAnimationInterval(1.0 / 60);
-
-
// create a scene. it's an autorelease object
-
CCScene *pScene = HelloWorld::scene();
-
-
// run
-
pDirector->runWithScene(pScene);
-
-
return true;
-
}
在这段代码里我们会发现这段代码就是工程开发的开始,并且APPDelegate继承了CCAplication。
-
class AppDelegate : private cocos2d::CCApplication
其实以上代码运用了多态,我们分析一下,程序是如何实现的多态的。
首先要写一下多态成立的三个条件
1、要有继承
2、有virtual重写
3、父类指针指向了子类对象
1、要有继承,代码中有继承
2、有virtual重写,代码中有重写
CCApplication::sharedApplication()->run();
CCApplication::sharedApplication()是父类指针,父类指针调用了run,run里面调用的是applicationDidFinishLaunching()接口,applicationDidFinishLaunching()接口在AppDelegate里实现,所有就会跑到AppDelegate这边,AppDelegate继承了 CCApplication,子类复写了父类里的虚接口
3、父类指针指向了子类对象,这个条件是如何实现的呢?
我们分析一下代码
在main.cpp里
AppDelegate app生成了子类对象
AppDelegate app如何
指向了父类指针呢?CCApplication::sharedApplication()指针怎么就是指向的子类的对象呢?
我们进入AppDelegate里 首先我们看到了构造函数和析构函数,但是里面全没有进行实现,在父类的构造函数和析构函数里有一句话 sm_pSharedApplication=this;
我们思考一下this指向的是谁?
this就是AppDelegate,子类对象实例化的时候调用了父类的构造函数,实现了父类指针指向了子类对象。
所有第三个条件也是成立的
以下是我画的分析流程图:
阅读(1281) | 评论(0) | 转发(0) |