具體來講,Cocos2d-JS中的導演是一個對象,它負責設置遊戲的運行環境,控制遊戲的住循環而且管理場景和場景的切換。node
Cocos2d-JS中導演對象名爲:cc.director
。下面是它主要的任務:緩存
環境設定 函數
首先,在進入遊戲以前,導演對象會設置遊戲的運行環境:測試
執行主循環 動畫
視頻遊戲的基本原理實際上是和傳統動畫是同樣的。在傳統動畫製做中,畫師們一頁一頁得繪製靜態的畫面,這些畫面最終會以很快的頻率一幅幅展現出來。頻率能夠是好比每秒24張畫,每張畫面被稱爲一幀。this
視頻遊戲的繪製方式是徹底同樣的,每1/60秒,程序會繪製一張圖片(一幀)到屏幕上,也就是60幀每秒。其中每一幀的繪製過程包含計算全部可視節 點的轉換矩陣以及其餘信息,而後畫面會一幀一幀得顯示到屏幕上。隨着遊戲的進行,每一幀都會改變一點點,最後,玩家的眼前就會呈現出優美的遊戲畫面。spa
以上所描述的全部過程都是在cc.director
的主循環中完成的。主循環中每一次循環繪製一幅畫面到屏幕上。下面是每一幀繪製的詳細過程: 設計
cc.Director.EVENT_AFTER_UPDATE
事件。cc.Director.EVENT_AFTER_VISIT
事件。cc.Director.EVENT_AFTER_DRAW
事件。 除此以外,cc.director
一樣提供一些函數來控制主循環:調試
cc.director.pause()
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 //這個事件在導演對象的投影屬性被修改以後觸發