Cocos2d-x中AppDelegate.cpp這個檔案,這是Cocos2d-x裡面比較重要的一個東西,下面我們詳細解說下: applicationDidFinishLaunching指的是程式啟動完成時
applicationDidEnterBackground指的時程式進入背景時(比如玩家此時接了電話,遊戲就會背景運作)
applicationWillEnterForeground是值得回到前台(比如使用者接完電話傳回了遊戲)
看applicationDidFinishLaunching這個方法 這個方法的意思是,程式啟動完成加載,也就是第一個要加載的東西 第一句 // initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
這句是初始化了一個CCDirector 。這個是這套引擎的一個機制,導演機制,初始化了CCDirector就是有了一個導演。
第二句
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
的意思就是,給這個導演設定它的GLView屬性 為OpenGL
pDirector->setDisplayStats(true);就會顯示
pDirector->setDisplayStats(false);就不會顯示
第一個數字,代表的是目前螢幕上的元素數
第二個是繪制一幀需要的時間
繪制一幀需要的最長時間
第三個數字,是每秒多少幀
pDirector->setAnimationInterval(1.0 / 60); 這個是設定幀率,又叫鎖幀。就是把幀率定死在一個值,這句就是定死在最大1秒60幀。
// create a scene. it's an autorelease object
CCScene *pScene = HelloWorld::scene();
這句裡面就用到一個非常重要的對象CCScene 。CCScene的意思是場景,前面說到了導演,這個就是場景。 導演到位了,然後咱們再搭一個場景,就是這句:
CCScene *pScene = HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
就是把這個場景給了咱們的導演,讓他運作起來。
最後有一個return true;這個要注意,cocos2dx這個引擎裡面大部分方法都要有傳回值bool。這個傳回值隻有為true的時候,引擎才會處理你方法裡面的代碼否則,就會跳過。
c++中的繼承符是:
CCLayer表示的是層,一個場景是由很多個層疊在一起組成的 。
說明:
AppDelegate類繼承了cocos2d::Application,
class CC_DLL Application : public ApplicationProtocol{}
在每個不同的平台都會ApplicationProtocol的實作類,源碼在:
cocos2d-x-3.0/cocos/2d/platform目錄下,大家可以詳細閱讀
各平台都會有自己的入口函數(例如main)
在main 中會建立一個某平台的視窗,之後建立AppDelegate的執行個體,
是以在整個Cocos2d-x中AppDelegate就是一個單例模式:
static AppDelegate s_sharedApplication;(比如在在Mac平台的AppController.mm中)
然後在Application的實作中,如下:
Application* Application::sm_pSharedApplication = 0;
Application::Application()
{
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this;
}
Application::~Application()
{
CC_ASSERT(this == sm_pSharedApplication);
sm_pSharedApplication = 0;
}
//3.0之後用這個方法
Application* Application::getInstance()
{
CC_ASSERT(sm_pSharedApplication);
return sm_pSharedApplication;
}
我們在程式設計中隻需要定義這個類處理3個回調方法就好了,不同平台的視窗消息大概分了3種:
- 系統平台的視窗建立完成
- 系統通平台的視窗被蓋住将進入背景運作
- 系統平台的視窗恢複到前台
分别對應了AppDelegate中的幾個方法
- virtual bool applicationDidFinishLaunching();
- virtual void applicationDidEnterBackground();
- virtual void applicationWillEnterForeground();
一般情況下在applicationDidFinishLaunching方法中:
1.初始化導演
2.建立第一個場景
3.啟動這個場景
然後,我們看Application中的run方法(是系統平台的main方法調用的該方法)
int Application::run()
{
if (applicationDidFinishLaunching())
{
[[CCDirectorCaller sharedDirectorCaller] startMainLoop];
}
return 0;
}
是以,這個方法執行完成後,Cocos2d-x就開始了主邏輯循環。
當android,ios平台來電話,就會有新視窗蓋住目前視窗,applicationDidEnterBackground就會被調用
當windows,mac平台最小化,applicationDidEnterBackground就會被調用
一般在這個方法中處理:
讓所有的螢幕動作停下來
讓所有的音樂和音效停下來
(有時候要儲存目前遊戲狀态持久化到磁盤)
applicationWillEnterForeground中處理
讓所有螢幕動作繼續
讓有音樂和音效繼續
(恢複使用者資料)