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

相關文章
相關標籤/搜索