仿《雷霆戰機》飛行射擊手遊開發--遊戲的入口,《雷霆戰機》射擊手

來源:互聯網
上載者:User

仿《雷霆戰機》飛行射擊手遊開發--遊戲的入口,《雷霆戰機》射擊手
遊戲的入口AppDelegate

    遊戲啟動後,首先執行個體化的是AppDelegate這個類,這這個類裡,我們需要修改兩個函數:applicationDidFinishLaunching和applicationDidEnterBackground。

    首先介紹applicationDidFinishLaunching(),遊戲啟動後,首先進入的就是這個方法,這裡,我們可以設定遊戲的解析度、幀率、第三方SDK的初始化,以及第一次要出現的情境。

 1 bool AppDelegate::applicationDidFinishLaunching() 2 { 3     auto director = Director::getInstance(); 4     auto glview = director->getOpenGLView(); 5     if (!glview) { 6         //定義在Windows下運行視窗的大小 7         glview = GLViewImpl::createWithRect("Raiden", 8             Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO)); 9         director->setOpenGLView(glview);10     }11 12     //橫屏和豎屏選擇不同的縮放模式13     auto frameSize = glview->getFrameSize();14     if (frameSize.width >= frameSize.height)15     {16         director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::SHOW_ALL);17     }18     else19     {20         director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::EXACT_FIT);21     }22 23     //設定幀率為60幀/秒24     director->setAnimationInterval(1.0f / 60);25     //設定搜尋路徑26     FileUtils::getInstance()->addSearchPath("res");27 28     //建立第一個要進入的情境29     auto scene = LoadingLayer::scene();30 31     //進入情境32     director->runWithScene(scene);33     //初始化第三方SDK34     BmobSDKInit::initialize("app_id", "app_key");35 36     return true;37 }

      這裡需要注意下面這幾點:

建立Windows視窗
glview = GLViewImpl::createWithRect("Raiden", Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO));

  這裡是為在windows下啟動並執行時候建立一個視窗。為了調試方便,我們在開發遊戲的時候會先在windows下編譯調試,等到windows版本調試通了,再編譯android版本。Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO)定義了視窗的大小,其中的幾個宏的定義如下:

const float DESIGN_RES_WIDTH = 540;    //寬度const float DESIGN_RES_HEIGHT = 960;   //高度const float RES_RATIO = 0.75f;

  由於本人的筆記本的高度小於960的,所以這裡使用RES_RATIO來進行同比例縮小。如果這裡不縮小視窗,則遊戲視窗則會顯示不全,而且更為嚴重的,是會出現滑鼠點擊定位不準的問題。

縮放模式

    我們使用了setDesignResolutionSize這個函數來設定縮放模式,其中,ResolutionPolicy的取值範圍如下:

  • ResolutionPolicy::SHOW_ALL 螢幕寬、高分別和設計解析度寬、高計算縮放因子,取較(小)者作為寬、高的縮放因子。保證了設計地區全部顯示到螢幕上,但可能會有黑邊。
  • ResolutionPolicy::EXACT_FIT  螢幕寬 與 設計寬比 作為X方向的縮放因子,螢幕高 與 設計高比 作為Y方向的縮放因子。保證了設計地區完全鋪滿螢幕,但是可能會出現映像展開。
  • ResolutionPolicy::NO_BORDER  螢幕寬、高分別和設計解析度寬、高計算縮放因子,取較(大)者作為寬、高的縮放因子。保證了設計地區總能一個方向上鋪滿螢幕,而另一個方向一般會超出螢幕地區。
  • ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH都是會在內部修正傳入設計解析度,以保證螢幕解析度到設計解析度無展開鋪滿螢幕。

    在本程式中,我們根據螢幕的寬高獲知當前是橫屏還是豎屏。如果是豎屏,則採用EXACT_FIT,以保證無黑邊的全螢幕模式;如果是橫屏,則採用SHOW_ALL,以防止遊戲介面縮放變形。

 

遊戲轉入背景處理邏輯

    當使用者接了一個電話,或者按了home鍵使得遊戲進入後台後,就會觸發applicationDidEnterBackground()這個函數。

void AppDelegate::applicationDidEnterBackground() {    Director::getInstance()->stopAnimation();    //判斷當前是否在遊戲中,如果是,則使遊戲暫停    PlaneLayer* pPlaneLayer = dynamic_cast<PlaneLayer*>(GameLayer::getPlaneLayer());    HubLayer* pHubLayer = dynamic_cast<HubLayer*>(GameLayer::getHubLayer());    if (pHubLayer && pPlaneLayer && !pPlaneLayer->isPause())    {        pHubLayer->menuPauseCallback(nullptr);    }}

這裡我們只需要知道我們做了暫停遊戲的動作,即menuPauseCallback,這時遊戲會彈出暫停情境。上面函數中的一些類和方法,我們會在後面講到。

下載原始碼 

 

下一篇,我們將進入LoadingLayer類探究遊戲資源載入機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.