浅析cocos2dx3.0版本引擎的骨干继承关系,以及入门须要了解的总体观念,在脑海中构造一个简单的游戏实现过程,初学者容易看晕的各类继承关系。

 

Aplication继承ApplicationProtocolapp

AppDelegate继承Application函数

 

AppDelegate类是cocos2dx要求实现游戏应用委托对象,在游戏运行的不一样生命周期会触发它的不一样函数。this

 

2.0和3.0版本有必定的差别性,其中3.0版本中去掉了CC,getInstance()替换了sharedApplication()spa

 

 

 

 

如下是cocos2dx的精简代码:命令行

 

首先是从main主函数开始指针

#include "main.h"对象

#include "AppDelegate.h"继承

#include "cocos2d.h"接口

 

USING_NS_CC; //宏定义,至关于using namespace cocs2d;生命周期

 

//命令行参数,不用管。cocos2dx是跨平台的,不用全懂。

int WINAPI _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

 

//建立一个AppDelegate实例,采用单例方式,即一个类只有一个对象实现;

//建立子类的时候,为了初始化从父类中继承过来的成员,系统须要调用父类的构造方法,

//无参数就调用无参数的,

//有参数的就调用有参数的.

AppDelegate app;

//将子类对象指针赋给父类对象指针,父类对象指针调用run(),子类当中复写了父类的接口。

 

 

//静态的类成员函数getInstance()返回Application的一个对象

//Application::getInstance() 单例模式,静态指针为空的话就建立,不为空的话就跳过直接返回,屡次调用,返回的是惟一的单例。

return Application::getInstance()->run();//返回run()

}

 

 

AppDelegate的基类,抽象类。

class CC_DLL ApplicationProtocal

{

public:

//初始化

virtual bool applicationDidFinishLaunching() = 0;//定义了一个纯虚函数

/*

虚函数定义:

虚函数是指一个类中你但愿重载的成员函数,

当你用一个基类指针或引用指向一个继承类对象的时候,

你调用一个虚函数,实际调用的是继承类的版本。

*/

/*

纯虚函数的做用:

在基类中不能对虚函数给出有意义的实现,

它的实现留给该基类的派生类去作。

*/

//至关于Java中的接口

//C++中没有接口定义

 

//后台

virtual void applicationDidEnterBackground() = 0;

//前台

virtual void applicationWillEnterForeground() = 0;

};

--------------------------------------------------------------------------------------------------------------

 

 

class CC_DLL Application : public ApplicationProtocol

{

public:

Application();

virtual ~Application();

 

int run()//调用了applicationDidFinishLaunching

{

//真正的applicationDidFinishLaunching()实现是在AppDelegate里面

//这里仅仅只是调用appDidFinishLaunching()

if(!applicationDidFinishLaunching())

{

return 1;

}

}

 

//定义了静态的对象指针

static Application* getInstance();

CC_DEPRECATED_ATTRIBUTE static Application* sharedApplication();

 

 

Application* Application::getInstance()

{

CC_ASSERT(sm_pSharedApplication);

return sm_pSharedApplication;

}

 

 

Application* Application::sharedApplication()

{

return Application::getInstance();

}

 

};

 

---------------------------------------------------------------------------------------------

class AppDelegate : private Application

{

/*

头文件中定义virtual bool applicationDidFinishLaunching()这个函数不是纯虚函数,

所以能够在main中实现.

纯虚函数在子类中复写以后就不属于纯虚函数了。

*/

//真正的游戏入口在这里

//实现游戏入口

//复写了虚函数Application::applicationDidFinishLaunching()

bool Application::applicationDidFinishLaunching()

{

//游戏运行的内容

//初始化导演对象和场景对象

Director director = Director::getInstance();

Scene scene = Scene::createScene();

director -> runWithScene(scene);//运行该场景,使游戏进入该场景。

return true;

}

};

 

----------------------------------------------------------------------------------------------------

 

 

下面讲解main主函数中AppDelegate app是如何执行run()

 

 

AppDelegate 中的构造函数没有实现任何代码,首先会调用父类Application的构造器

 

//nullptr是C++11引入的新特性,空指针类型的关键字。

Application * Application::sm_pSharedApplication = nullptr;

 

//继承了_instance()和_accelTable()

Application::Application()

: _instance(nullptr)

, _accelTable(nullptr)

{

_instance = GetModuleHandle(nullptr);

_animationInterval.QuadPart = 0;

/*

宏定义,等同于assert()断言

3.0版本以前是

if(sm_pSharedApplication != NULL)

return sm_pSharedApplication;

意思是同样的

*/

CC_ASSERT(! sm_pSharedApplication);

sm_pSharedApplication = this;

 

//这个this指针就是app,AppDelegate的一个实例。

//返回了一个application的对象指针sm_pSharedApplication ,而后调用run()方法

//run方法里面调用游戏的开始applicationDidFinishLaunching()

//applicationDidFinishLaunching()里面实现了游戏启动的各类实现。

}

 

 

再次精简一下,大致来讲就是:

main主函数里面实例了一个Appdelegate对象,而后调用父类构造器,在父类构造器里面返回一个application对象指针,有这个对象指针调用application类里面的run方法,run方法里面调用applicationDidFinishLaunching(),applicationDidFinishLaunching()里面实现了游戏开始的场景。

相关文章
相关标签/搜索