1. 程式人生 > >淺談Cocos2d-js cc.director

淺談Cocos2d-js cc.director

計時器 nim event cocos2d-x view top 函數 chan 常用

在cocos2d-x裏面,遊戲的任何時間,只有一個場景對象實例處於運行狀態,該對象可以作為當前遊戲內容的整體包對象。

環境設定

進入遊戲之前,導演會設置遊戲的運行環境:

  1. 設置遊戲視圖,包含視圖的投射,像素格式等。
  2. 設置遊戲的運行幀率。
  3. 初始化定時器,動作管理器和事件管理器(為當前導演對象服務)
  4. 初始化貼圖緩存和渲染器(為當前導演對象服務)
  5. 導演對象的其他設置。

執行主循環

主循環中每一次循環渲染一副畫面到屏幕上。下面是每一幀繪制的詳細過程

  1. 計算上一幀開始到現在的時間(用於提供調試信息)
  2. 讓導演對象中計時器執行被計劃的任務。
  3. 通過時間管理器通知cc.Director.EVENT_AFTER_UPDATE事件。
  4. 清空屏幕。
  5. 如果需要進入下一個場景則進行場景切換。
  6. 遍歷當前場景中的節點並更新節點的空間轉換矩陣以及其他必要的信息,然後發送繪制指令給渲染器
  7. 通過時間管理器通知cc.Director.EVENT_AFTER_VISI事件。
  8. 渲染器按順序執行所有渲染指令來最終繪制整個場景到屏幕上。
  9. 增加全局總幀數。

cc.director同樣提高一些函數來控制主循環:

暫停主循環:cc.director.pause()

恢復主循環:cc.director.resume()

場景管理

通常來說,一個遊戲包含用於不同用例的幾個場景,程序應該通過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);

環境設置和屬性

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

// 獲取遊戲主循環是否被暫停
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`
var view = cc.director.getOpenGLView();
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);

導演對象系統事件

cc.director.EVENT_AFTER_DRAW: 這個事件在每一幀圖像繪制完成之後被觸發。

cc.director.EVENT_AFTER_VISIT: 這個事件在每一幀場景樹遍歷之後被觸發。

cc.director.EVENT_AFTER_UPDATE: 這個事件在每一幀計時器任務執行完成之後被觸發。

cc.director.EVENT_PROJECTION_CHANGED: 這個事件在導演對象的投影屬性被修改之後觸發。

淺談Cocos2d-js cc.director