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

遊戲的入口AppDelegate

    遊戲啓動後,首先實例化的是AppDelegate這個類,這這個類裏,咱們須要修改兩個函數:applicationDidFinishLaunching和applicationDidEnterBackground。android

    首先介紹applicationDidFinishLaunching(),遊戲啓動後,首先進入的就是這個方法,這裏,咱們能夠設置遊戲的分辨率、幀率、第三方SDK的初始化,以及第一次要出現的場景。windows

bool AppDelegate::applicationDidFinishLaunching()
{
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if (!glview) {
        //定義在Windows下運行窗口的大小
        glview = GLViewImpl::createWithRect("Raiden",
            Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO));
        director->setOpenGLView(glview);
    }

    //橫屏和豎屏選擇不一樣的縮放模式
    auto frameSize = glview->getFrameSize();
    if (frameSize.width >= frameSize.height)
    {
        director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::SHOW_ALL);
    }
    else
    {
        director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::EXACT_FIT);
    }

    //設置幀率爲60幀/秒
    director->setAnimationInterval(1.0f / 60);
    //設置搜索路徑
    FileUtils::getInstance()->addSearchPath("res");

    //建立第一個要進入的場景
    auto scene = LoadingLayer::scene();

    //進入場景
    director->runWithScene(scene);
    //初始化第三方SDK
    BmobSDKInit::initialize("app_id", "app_key");

    return true;
}

      這裏須要注意下面這幾點:app

建立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)定義了窗口的大小,其中的幾個宏的定義以下:ide

const float DESIGN_RES_WIDTH = 540;    //寬度

const float DESIGN_RES_HEIGHT = 960;   //高度

const float RES_RATIO = 0.75f;

因爲本人的筆記本的高度小於960的,因此這裏使用RES_RATIO來進行同比例縮小。若是這裏不縮小窗口,則遊戲窗口則會顯示不全,並且更爲嚴重的,是會出現鼠標點擊定位不許的問題。函數

縮放模式

    咱們使用了setDesignResolutionSize這個函數來設置縮放模式,其中,ResolutionPolicy的取值範圍以下:spa

  • ResolutionPolicy::SHOW_ALL 屏幕寬、高分別和設計分辨率寬、高計算縮放因子,取較(小)者做爲寬、高的縮放因子。保證了設計區域所有顯示到屏幕上,但可能會有黑邊。
  • ResolutionPolicy::EXACT_FIT  屏幕寬 與 設計寬比 做爲X方向的縮放因子,屏幕高 與 設計高比 做爲Y方向的縮放因子。保證了設計區域徹底鋪滿屏幕,可是可能會出現圖像拉伸。
  • ResolutionPolicy::NO_BORDER  屏幕寬、高分別和設計分辨率寬、高計算縮放因子,取較(大)者做爲寬、高的縮放因子。保證了設計區域總能一個方向上鋪滿屏幕,而另外一個方向通常會超出屏幕區域。
  • ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH都是會在內部修正傳入設計分辨率,以保證屏幕分辨率到設計分辨率無拉伸鋪滿屏幕。

    在本程序中,咱們根據屏幕的寬高獲知當前是橫屏仍是豎屏。若是是豎屏,則採用EXACT_FIT,以保證無黑邊的全屏模式;若是是橫屏,則採用SHOW_ALL,以防止遊戲界面縮放變形。.net

 

遊戲轉入後臺的處理邏輯

    當用戶接了一個電話,或者按了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,這時遊戲會彈出暫停場景。上面函數中的一些類和方法,咱們會在後面講到。調試

 

轉載請註明:http://www.javashuo.com/article/p-nrteqlbs-ch.htmlcode

項目首頁:https://www.oschina.net/p/raiden

相關文章
相關標籤/搜索