Cocos2d-JS遊戲導演

什麼是遊戲的導演

  具體來講,Cocos2d-JS中的導演是一個對象,它負責設置遊戲的運行環境,控制遊戲的住循環而且管理場景和場景的切換。node

導演的任務

  Cocos2d-JS中導演對象名爲:cc.director。下面是它主要的任務:緩存

  環境設定  函數

  首先,在進入遊戲以前,導演對象會設置遊戲的運行環境:測試

    1. 設置顯示遊戲的視圖,包含視圖的投射,像素格式,等等。
    2. 設置遊戲運行幀率。
    3. 爲當前導演對象初始化計時器,動做管理器和事件管理器。
    4. 爲當前導演對象初始化貼圖緩存和渲染器。
    5. 導演對象的其餘設置

   執行主循環  動畫

  視頻遊戲的基本原理實際上是和傳統動畫是同樣的。在傳統動畫製做中,畫師們一頁一頁得繪製靜態的畫面,這些畫面最終會以很快的頻率一幅幅展現出來。頻率能夠是好比每秒24張畫,每張畫面被稱爲一幀。this

  視頻遊戲的繪製方式是徹底同樣的,每1/60秒,程序會繪製一張圖片(一幀)到屏幕上,也就是60幀每秒。其中每一幀的繪製過程包含計算全部可視節 點的轉換矩陣以及其餘信息,而後畫面會一幀一幀得顯示到屏幕上。隨着遊戲的進行,每一幀都會改變一點點,最後,玩家的眼前就會呈現出優美的遊戲畫面。spa

  以上所描述的全部過程都是在cc.director的主循環中完成的。主循環中每一次循環繪製一幅畫面到屏幕上。下面是每一幀繪製的詳細過程:    設計

    1. 計算從上一幀開始到如今的時間,這將會被用於提供調試信息。
    2. 讓導演對象中的計時器執行被計劃的任務。
    3. 經過事件管理器通知cc.Director.EVENT_AFTER_UPDATE事件。
    4. 清空遊戲屏幕。
    5. 若是須要進入下一個場景則進行場景切換。
    6. 遍歷當前場景中的節點並更新節點的空間轉換矩陣以及其餘必要信息,而後發送繪製指令給渲染器。
    7. 經過事件管理器通知cc.Director.EVENT_AFTER_VISIT事件。
    8. 渲染器按順序執行全部渲染指令來最終繪製整個場景到屏幕上。
    9. 經過事件管理器通知cc.Director.EVENT_AFTER_DRAW事件。
    10. 增長全局總幀數。

  除此以外,cc.director一樣提供一些函數來控制主循環:調試

    1. 暫停主循環:cc.director.pause()
    2. 恢復主循環:cc.director.resume()

  場景管理code

  導演對象的另外一項重要任務就是場景管理,導演對象在同一時間只能夠運行一個場景,可是你能夠隨意得切換運行場景。因此一般來講,一個遊戲會包含用於不一樣用例的幾個場景,你的程序應該經過cc.director的API來控制場景流。  

// 讓導演對象執行目標場景
cc.director.runScene(scene);

// 獲取當前正在執行的腳本
var scene = cc.director.getRunningScene();

// 將一個新場景推入場景棧中,並替換運行場景爲這個新場景
var scene = cc.director.pushScene(scene);

// 將場景棧頂的場景推出場景棧,並替換運行場景爲推出後棧頂的新場景
cc.director.popScene();

// 將場景棧中除了棧底的根場景之外的全部場景推出,並替換運行場景爲根場景。
cc.director.popToRootScene()

 

  除此以外,你能夠經過cc.TransitionScene的效果類的轉場特效來切換場景。

// 轉場特效持續兩秒
var transitionTime = 2;
// 建立下一個場景
var nextScene = new cc.Scene();
// 使用下一個場景建立轉場特效場景
var transitionScene = new cc.TransitionProgressInOut(transitionTime, nextScene);
// 替換運行場景爲轉場特效場景
cc.director.runScene(transitionScene);

 

  在上面的例子中能夠看出,咱們使用了一個cc.TransitionProgressInOut轉場特效,沒有使用cc.TransitionScene是由於這個基礎特效類沒有任何實際效果,只提供運行機制。Cocos2d-JS引擎中還提供其餘不少種預設轉場特效,你能夠參考API文檔或是TransitionScene測試用例。

  環境設置和屬性

  因爲導演對象控制整個遊戲運行環境,導演對象中還提供一些經常使用的設置和屬性:

  

// 獲取遊戲主循環是否被暫停
var paused = cc.director.isPaused();

// 設置或獲取動畫幀間隔,這個設置會直接影響幀率
var interval = cc.director.getAnimationInterval();
cc.director.setAnimationInterval(value);

// 設置或獲取導演對象的內容放縮比例
var scale = cc.director.getContentScaleFactor();
cc.director.setContentScaleFactor(scaleFactor);

// 設置或獲取遊戲世界可視窗口的原點和大小
var origin = cc.director.getVisibleOrigin();
var size = cc.director.getVisibleSize();

// 獲取遊戲世界大小,winSize的大小一般等同於設計分辨率,而winSizeInPixel的大小是遊戲世界的像素大小
var winSize = cc.director.getWinSize();
var winSizeInPixel = cc.director.getWinSizeInPixels();

// 設置或獲取調試信息是否被顯示
var isDisplaying = cc.director.isDisplayStats();
cc.director.setDisplayStats(displayStats);

// 設置或獲取視圖,它指向`cc.view`
cc.director.var view = cc.director.getOpenGLView();
cc.director.cc.director.setOpenGLView(openGLView);

// 設置或獲取WebGL/OpenGL的投影,
// 可能的投影類型包括:cc.Director.PROJECTION_2D, cc.Director.PROJECTION_3D, cc.Director.PROJECTION_CUSTOM
cc.director.getProjection();
cc.director.setProjection(projection);

 

  計時器  

  正如以前提到的,遊戲主循環會經過計時器執行預約的任務。這個計時器是導演對象的一個內部子系統,你能夠對當前運行場景的節點執行一些類型的任務。計時器將會計劃什麼時候以及如何執行這些任務。

  下面的代碼片斷展現了一些經常使用的建立任務的方式:

var node = new cc.Node();

// node的update函數將會在每一幀被執行
node.scheduleUpdate();
// callback回調函數會重複得在每一個interval時間間隔以後被執行,重複次數爲repeat次,而且這個任務會在delay延時以後開始執行
node.schedule(callback, interval, repeat, delay);
// callback回調函數會在delay延時以後被執行一次
node.scheduleOnce(callback, delay);
// 取消callback任務
node.unschedule(callback);
// 取消node節點全部計劃中的任務
node.unscheduleAllCallbacks();

 

  注意

    全部任務中的回調函數會在本身的目標節點環境下被執行,也就是說,回調函數中的this對象將會指向目標節點

    即便delay延時爲0的狀況下,任務回調函數的第一次執行也是在註冊任務以後的下一幀中。

  動做管理器

  動做管理器是導演對象另外一個重要的內部系統。它管理當前運行場景中的全部動做,它會在每一幀調用全部進行中動做的update函數。動做系統的細節會在後面的章節中詳細討論。

  導演對象系統事件

  導演對象還有一些內建的系統事件,可能會對你控制遊戲的邏輯有幫助。

cc.Director.EVENT_AFTER_DRA、// 這個事件在每一幀圖像的繪製完成以後被觸發。
cc.Director.EVENT_AFTER_VISIT // 這個事件在每一幀場景樹遍歷以後被觸發。
cc.Director.EVENT_AFTER_UPDATE // 這個事件在每一幀計時器任務執行完成以後被觸發。
cc.Director.EVENT_PROJECTION_CHANGED //這個事件在導演對象的投影屬性被修改以後觸發
相關文章
相關標籤/搜索