你看很多视频,很多教程,很多人会告诉你,cocos2dx引擎的游戏入口都是从如下代码开始
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;}
现在跟着问题一步步回溯,我们就回到C++程序的起点,也就是mian函数。
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdline,int nCmdshow){ UNREFERENCED_ParaMETER(hPrevInstance); UNREFERENCED_ParaMETER(lpCmdline); // create the application instance AppDelegate app; CCEGLVIEw* eglVIEw = CCEGLVIEw::sharedOpenGLVIEw(); eglVIEw->setVIEwname("Test"); eglVIEw->setFrameSize(480,320); return CCApplication::sharedApplication()->run();}
从该代码大家可以发现一开始顶一个一个AppDelegate app 之后都没见用过,有经验的人可能会发现这个类的名字,同过名字可以看出,这是设计模式之中的代理模式,并且也是C++种的多态特性。
这个问题我们先不管,就当做问号放在这,现在我们要关系的是 最后一句话,CCApplication::sharedApplication()->run();
我们对着run()一直按F12你就会路过
int CCApplication::run(){ //此处略去代码 // Initialize instance and cocos2d. if (!applicationDIDFinishLaunching()) { return 0; } //此处略去代码}接下来你在进入applicationDIDFinishLaunching()你会发现如下
bool AppDelegate::applicationDIDFinishLaunching() { //此处略去代码 return true;}
是不是很熟悉也就是游戏的入口,但是你会发现该函数是AppDelegate的成员,然而并不是CCApplication的成员,但为什么CCApplication可以直接调用呢,有人会说是继承的关系,没错他继承了CCApplicationProtocol,看看CCApplicationProtocol的定义
class CC_DLL CCApplicationProtocol{public: //略去一部分代码 /** @brIEf Implement CCDirector and CCScene init code here. @return true Initialize success,app continue. @return false Initialize Failed,app terminate. */ virtual bool applicationDIDFinishLaunching() = 0;};// end of platform group/// @}NS_CC_END#endif // __CC_APPliCATION_PROTOCol_H__
这里声明该方法。也就是说有这么一个继承体系
CCApplicationProtocol->CCApplication->AppDelegate
而且三个类中只有AppDelegate中的applicationDIDFinishLaunching定义了,其他里面也只有声明而已。但是我们还没解决为什么
CCApplication::sharedApplication()->run();中里面的applicationDIDFinishLaunching会是AppDelegate里面的,而不是CCApplication。
这里有一段CCApplication.cpp代码如下
<pre name="code" >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;}
这里面的sm_pSharedApplication = this,中的this是整个问题的关键,一般人直接看可能会觉得this指的是当前类的实例也就是CCApplication。其实并不是这样的,这里的this是指AppDelegate,所以最后调用的applicationDIDFinishLaunching是AppDelegate中的
更贴切的来说是AppDelegate app这句话调用的时候,初始化了构造函数,进而调用了父类的构造函数,所以此时的this的调用者本身,也就是AppDelegate
下列是为什么方便理解所写得简化版
/* * CCApplicationProtocol.h * */#ifndef SRC_CCAPPliCATIONPROTOCol_H_#define SRC_CCAPPliCATIONPROTOCol_H_class CCApplicationProtocol {public: CCApplicationProtocol(); virtual ~CCApplicationProtocol(); virtual bool applicationDIDFinishLaunching()=0;};#endif /* SRC_CCAPPliCATIONPROTOCol_H_ */
/* * CCApplication.h * */#ifndef CCAPPliCATION_H_#define CCAPPliCATION_H_#include "CCApplicationProtocol.h"class CCApplication: public CCApplicationProtocol {public: CCApplication(); virtual ~CCApplication(); int run(); static CCApplication * sharedApplication(); static CCApplication * sm_pSharedApplication;};#endif /* CCAPPliCATION_H_ */
#include "CCApplication.h"#include "stddef.h"CCApplication * CCApplication::sm_pSharedApplication = NulL;CCApplication::CCApplication() { // Todo auto-generated constructor stub sm_pSharedApplication = this;}CCApplication::~CCApplication() { // Todo auto-generated destructor stub}int CCApplication::run(){ applicationDIDFinishLaunching(); return 1;}CCApplication * CCApplication::sharedApplication(){ if(sm_pSharedApplication != NulL) return sm_pSharedApplication;}
/* * main.cpp * */#include <iostream>#include "CCApplication.h"#include "AppDelegate.h"using namespace std;int main(){ AppDelegate app; //AppDelegate * pp = &app;// CCApplication * p = &app;// p->applicationDIDFinishLaunching(); return CCApplication::sharedApplication()->run();}
最后输出结果是Game start
总结以上是内存溢出为你收集整理的重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口全部内容,希望文章能够帮你解决重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)