浅析cocos2dx3.0版本引擎的骨干继承关系入门

Aplication继承ApplicationProtocol
AppDelegate继承Application

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

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

以下是cocos2dx的精简代码:

首先是从main主函数开始

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值