
Cocos2d-x工程组织形式如图所示:
Classes一般用来放用户自己编写的类。在Win32下,可以看到main.cpp和main.h两个文件,程序的入口就是在main.cpp中。
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("block"); eglVIEw->setFrameSize(320,480); return CCApplication::sharedApplication()->run();} 从上述代码中可以看出,程序主要是通过一个CCApplication::sharedApplication()->run()来运行的,根据经验,CCApplication应该是一个类,sharedApplication()应该是该类的一个静态方法。
在CCAppliction.cpp中:
CCApplication* CCApplication::sharedApplication(){ CC_ASSERT(sm_pSharedApplication); return sm_pSharedApplication;} sm_pSharedApplication也是CCApplcation的一个静态成员。但是该程序初始化的时候:
// sharedApplication pointerCCApplication * CCApplication::sm_pSharedApplication = 0;
那么该成员是在那创建的!? 首先需要了解下面这几个类:
AppDelegate – app代理类,继承自CCApplication
class AppDelegate:privatecocos2d::CCApplication
CCApplication – app应用类,继承自CCApplicationProtocol
class CC_DLLCCApplication:public 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;};
上图就表示出了整个的过程,有个问题就是sm_pSharedApplication = this,那么这个this代表的究竟是什么意思呢?
上述中的this应该事项的是CCApplication的父类,也就是AppDelegate,因为在构造的过程中先去构造父类,父类构造后再构造子类。实际上就是使用AppDelegate类来进行设计。
在CCAplication::run()中通过调用applicationDIDFinishLaunching()来启动程序,也就是网上很多资料都说的程序入口。
int CCApplication::run(){ PVRFrameEnableControlWindow(false); // Main message loop: MSG msg; LARGE_INTEGER nFreq; LARGE_INTEGER nLast; LARGE_INTEGER nNow; queryPerformanceFrequency(&nFreq); queryPerformanceCounter(&nLast); // Initialize instance and cocos2d. if (!applicationDIDFinishLaunching()) { return 0; } CCEGLVIEw* pMainWnd = CCEGLVIEw::sharedOpenGLVIEw(); pMainWnd->centerWindow(); ShowWindow(pMainWnd->getHWnd(),SW_SHOW); while (1) { if (! PeekMessage(&msg,NulL,PM_REMOVE)) { // Get current time tick. queryPerformanceCounter(&nNow); // If it's the time to draw next frame,draw it,else sleep a while. if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart) { nLast.QuadPart = nNow.QuadPart; CCDirector::sharedDirector()->mainLoop(); } else { Sleep(0); } continue; } if (WM_QUIT == msg.message) { // Quit message loop. break; } // Deal with windows message. if (! m_hAcceltable || ! TranslateAccelerator(msg.hwnd,m_hAcceltable,&msg)) { TranslateMessage(&msg); dispatchMessage(&msg); } } return (int) msg.wParam;}
对于cocos2d的用户来说:
在applicationDIDFinishLaunching中调用自己设计的场景类就可以实现自己想要的功能。
bool AppDelegate::applicationDIDFinishLaunching() { // initialize director CCDirector* pDirector = CCDirector::sharedDirector(); CCEGLVIEw* pEGLVIEw = CCEGLVIEw::sharedOpenGLVIEw(); pDirector->setopenGLVIEw(pEGLVIEw); //pEGLVIEw->setDesignResolutionSize(480,320,kResolutionUnKNown); pEGLVIEw->setDesignResolutionSize(320,480,kResolutionShowAll); // 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 = MainScene::CreateScene(); // run pDirector->runWithScene(pScene); return true;} 2、Cocos2d的逻辑结构
Cocos2d游戏是通过一系列的元素来进行定义的,其中包括:导演,场景,层,演员。元素具有以下特点:
一个导演同一时间只能运行一个场景;
一个场景当中,可以同时加载多个层;
一个层同可以加载多个精灵;
层中还可以加层。
总结以上是内存溢出为你收集整理的Cocos2d-x学习(2) - cocos2d运行分析全部内容,希望文章能够帮你解决Cocos2d-x学习(2) - cocos2d运行分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)