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()裏面實現了遊戲開始的場景。