我的Cocos2d-x学习笔记(一)Windows下程序如何开始运行
来源:互联网 发布:pta编程 编辑:程序博客网 时间:2024/05/10 03:20
现在开始学习Cocos2d-x开发手机游戏,做这个笔记记录学习中的一些收获,同时利于复习。利用的Cocos2d-x2.2.6引擎。
每个程序都是有入口函数的,Cocos2d-x也不例外,在Windows下的VS开发环境中,入口函数在Win32筛选器下的main.cpp中。我们看一下main.cpp文件中内容。
#include "main.h"
首先包含了main.h头文件,头文件中包含了Win32编程的用到的windows.h和宽字符支持文件tchar.h;
还包含了CCStdC.h文件,cocos2d-x中c语言的头文件,其中包含了数学文件和网络支持,不继续深入研究了。
#include "AppDelegate.h"
包含了AppDelegate.h文件,这个文件是程序运行的关键。#include "CCEGLView.h"USING_NS_CC;int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // create the application instance AppDelegate app;//创建一个AppDelegate对象 CCEGLView* eglView = CCEGLView::sharedOpenGLView(); eglView->setViewName("HelloWorld"); eglView->setFrameSize(480, 320); return CCApplication::sharedApplication()->run();}上述代码中需要重点关注AppDelegate app;与CCApplication::sharedApplication()->run()这两行,CCApplication是程序中一个单例,在程序运行中只存在一个对象;CCApplication.cpp中部分代码如下:
CCApplication * CCApplication::sm_pSharedApplication = 0;CCApplication* CCApplication::sharedApplication(){ CC_ASSERT(sm_pSharedApplication); return sm_pSharedApplication;}其中sm_pSharedApplication是一个CCApplication的对象指针,运行CCApplication::sharedApplication()返回当前这个单例对象的指针。而run()这个函数则是游戏开始运行的关键。重点关注CCApplication类成员函数run()中部分代码:
int CCApplication::run(){ // Initialize instance and cocos2d. if (!applicationDidFinishLaunching()) { return 0; }applicationDidFinishLaunching()这个函数是CCApplication的父类中定义的纯虚函数,并且在CCApplication类中没用重写。这个函数是在AppDelegate中进行覆写了。
下面看看AppDelegate和CCApplication和CCApplicationProtocol之间的关系。
class AppDelegate : private cocos2d::CCApplicationclass CC_DLL CCApplication : public CCApplicationProtocol由上诉代码可以看出类AppDelegate继承自CCApplication,而CCApplication继承自CCApplicationProtocol。
而类CCApplication是一个单例对象,在main.cpp中CCApplication::sharedApplication()->run()可见它已经被初始化,那么它是在哪里初始化的呢?
这时候回来看AppDelegate app,在AppDelegate 初始化app时候,会先调用父类的构造函数,CCApplicationProtocol的构造函数是空函数,然后CCApplication构造函数执行,CCApplication构造函数代码如下:
CCApplication::CCApplication(): m_hInstance(NULL), m_hAccelTable(NULL){ m_hInstance = GetModuleHandle(NULL); m_nAnimationInterval.QuadPart = 0; CC_ASSERT(! sm_pSharedApplication); sm_pSharedApplication = this;}在CCApplication::CCApplication()中我们可以看到CCApplication对象指针sm_pSharedApplication赋值为this,也就是AppDelegate app。
所以CCApplication单例对象在子类AppDelegate定义app时候,通过调用首先执行父类CCApplication构造函数时候被初始化。
知道了CCApplication什么时候被初始化后,再继续看看程序如何被运行,上面提到的CCApplication类成员函数run()中部分代码,
applicationDidFinishLaunching()这个函数是CCApplication的父类中定义的纯虚函数,并且在CCApplication类中没用重写,是在AppDelegate中进行覆写。
其中applicationDidFinishLaunching()则是程序运行的关键点!AppDelegate中代码如下:
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);CCScene *pScene = HelloWorld::scene(); // run pDirector->runWithScene(pScene); return true;}
CCApplication中的run()函数调用了其子类AppDelegate具体实现后的applicationDidFinishLaunching()函数,applicationDidFinishLaunching()中开始运行游戏程序。
CCScene* pScene = HelloWorld::scene()获取一个HelloWorld的场景,并且通过pDirector->runWithScene(pScene)运行此场景。到此为止,HelloWorld运行起来了!
- 我的Cocos2d-x学习笔记(一)Windows下程序如何开始运行
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-X 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- Cocos2d-X 程序是如何开始运行与结束的
- Cocos2d-x 程序是如何开始运行与结束的
- COCOS2DX学习笔记(一) windows下cocos2d-x的环境配置
- cocos2d-x学习日志(18) --程序是如何开始运行与结束?
- java设计模式学习(一)-工厂方法模式2
- 【九度】题目1554:区间问题
- driver的结构体
- Django新书2015.5_pdf
- Android - DrawerLayout的使用
- 我的Cocos2d-x学习笔记(一)Windows下程序如何开始运行
- 读书笔记之Java程序性能优化
- 并发模型
- C/C++中关于struct内存对齐问题
- saw(获取随机数)
- ACM-鸡兔同笼
- hdu1716 排列2(排列生成算法)
- java里面<>的语法
- 当复制LoadRunner脚本内容至记事本中文出现乱码