天天看點

AppDelegate詳解

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中處理

讓所有螢幕動作繼續

讓有音樂和音效繼續

(恢複使用者資料)

繼續閱讀