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()里面实现了游戏开始的场景。