重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口
来源:互联网 发布:中国木制品数据 编辑:程序博客网 时间:2024/05/22 05:06
你看很多视频,很多教程,很多人会告诉你,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" class="cpp">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 stubsm_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 3.4版-游戏继续,游戏重新开始,回到主界面的实现《赵云要格斗》
- Cocos2d-x 3.0学习笔记(1).引擎的入口和结束
- 第一篇 cocos2d-x学习总结
- Cocos2d-x游戏暂停、继续游戏、重新开始界面的实现---之游戏开发《赵云要格斗》(10)
- cocos2d-x box2d物理引擎深入研究 第一篇续
- 从游戏概念开始:迈出游戏开发的第一步-----------------------cocos2d-x 3.0正式版本(7.9)
- cocos2d-x 第一篇
- Cocos2d-x 游戏引擎介绍
- 【手游游戏引擎】学习游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D (一)
- 【手游游戏引擎】学习游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D (二)
- cocos2d-x(vs2012)环境搭建(第一篇)[版本:cocos2d-x-3.1.1]
- 游戏开发学习-Cocos2d-x学习(一) HelloWorld 开始
- Cocos2D-X SimpleGame cocos2d-x完成游戏后的一些锦上添花修饰 (6) ----版本cocos2d-2.0-x-2.0.3 .
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第八课: Cocos2D-X引擎框架3
- cocos2d-x重新学习的经历(第一天)---使用animation播放动画
- 使用Cocos2D-x引擎在Mac下开发运行在iOS设备上的《植物大战僵尸》第一篇
- cocos2d-x学习笔记-box2d实现物理引擎新旧版本的不同
- Longest Palindromic Substring
- 批量修改文件后缀名
- C语言swap函数总结
- 两台电脑怎么共享文件
- [Leetcode]Gas Station
- 重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口
- POJ 1089 解题报告
- printf( )的格式字符
- NSDate NSString NSArray NSDictionary 数据类型相互转换
- fs4412开发板学习笔记(九)
- container-with-most-water
- 一些实用PHP代码片段
- Two Sum
- ZigZag Conversion