在Cocos2d-x中,把統籌遊戲大局的類抽象爲導演類(Director),Director是整個cocos2d-x引擎的核心,是整個遊戲的導航儀。遊戲中的一些常用操作就是由Director來控制的,比如OpenGL ES的初始化,場景的轉換,遊戲暫停繼續的控制,世界座標和GL座標之間的切換,對節點的控制等,還有一些遊戲數據的保存調用,屏幕尺寸的獲取等都要由Director類來管理控制的。
因爲Director是遊戲項目的總導演,會經常調用進行一些控制,所以該Director利用了單件設計模式,也就是整個遊戲裏只有一個導演類。用getInstance() 方法取得Director的實例。
Tips:在cocos2d-x2.x的版本中使用sharedDirector()方法來獲取導演類對象,而在3.x的版本中使用getInstance()來獲取,不過sharedDirector()也可以使用。
Director類的繼承關係如下:
DisplayLinkDirector繼承CCDirector,是一個可以自動刷新的導演類。它支持60/1、1/30和1/15三種動畫間隔(幀間隔)。
Director類的主要公共函數如下:
函數名 |
返回類型 |
描述 |
getRunningScene |
場景類 |
獲取當前正在運行的場景 |
getAnimationInterval |
浮點型 |
獲取每幀的時間 |
setAnimationInterval |
浮點型 |
設置每幀的時間 |
isDisplayStats |
布爾型 |
返回是否在屏幕左下角顯示每幀的時間 |
setDisplayStats |
無 |
設置是否在屏幕左下角顯示每幀的時間 |
getSecondsPerFrame |
浮點型 |
獲取每幀的時間(單位爲秒) |
getOpenGLView |
GL視圖 |
獲取繪製所有對象的OpenGL視圖 |
無 |
設置繪製所有對象的OpenGL視圖 |
|
布爾型 |
導演類對象是否暫停 |
|
整型 |
獲取從導演類開始運行的幀數 |
|
投影類 |
獲取OpenGL投影 |
|
無 |
設置OpenGL投影 |
|
無 |
設置OpenGL接口 |
|
布爾型 |
切換的場景是否接收清除信息 |
|
節點類 |
獲取一個在主場景遍歷後遍歷的節點對象 |
|
無 |
設置一個在主場景遍歷後遍歷的節點對象 |
|
尺寸 |
獲取屏幕大小(單位爲點) |
|
尺寸 |
獲取像素級的屏幕大小(單位爲像素) |
|
尺寸 |
獲取可見屏幕大小 |
|
矢量 |
獲取可見屏幕的方向 |
|
矢量 |
轉化爲OpenGL座標系 |
|
矢量 |
轉化爲UI座標系 |
|
無 |
運行當前場景 |
|
無 |
掛起當前場景,壓入棧中 |
|
無 |
從棧中彈出場景 |
|
無 |
從棧中彈出所有場景直到根場景 |
|
無 |
從棧中彈出所有場景直到某個等級 (等級爲0爲導演,等級爲1爲根場景) |
|
無 |
替換當前場景 |
|
無 |
結束遊戲 |
|
無 |
暫停遊戲 |
|
無 |
恢復遊戲 |
|
無 |
停止動畫 |
|
無 |
開始動畫 |
|
無 |
繪製場景 |
|
無 |
移除所有緩存數據 |
|
無 |
基於配置信息設置默認值 |
|
無 |
設置OpenGL默認值 |
|
無 |
設置OpenGL是否使用alpha通道 |
|
無 |
設置是否測試OpenGL深度 |
|
無 |
設置表面像素大小(不同於屏幕大小) |
|
浮點型 |
獲取表面像素大小 |
|
調度類 |
獲取時間調度對象 |
|
無 |
設置時間調度對象 |
|
動作管理類 |
獲取動作管理對象 |
|
無 |
設置動作管理對象 |
|
事件調度類 |
獲取事件調度對象 |
|
無 |
設置事件調度對象 |
|
渲染器 |
返回渲染器 |
|
浮點型 |
返回控制檯 |
|
浮點型 |
獲取幀率 |
在新建的HelloWorld項目中,打開AppDelegate.cpp,我們可以看到如下代碼:
//初始化函數
boolAppDelegate::applicationDidFinishLaunching() {
//獲取導演對象
auto director =Director::getInstance();
//獲取OpenGL視圖
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLView::create("MyGame");
//設置OpenGL視圖
director->setOpenGLView(glview);
}
// 設置顯示每幀顯示時間
director->setDisplayStats(true);
// 設置每幀時間
director->setAnimationInterval(1.0/ 60);
autoscene = HelloWorld::createScene();
// 運行場景
director->runWithScene(scene);
return true;
}
// 遊戲進入後臺
voidAppDelegate::applicationDidEnterBackground() {
//停止動畫
Director::getInstance()->stopAnimation();
}
// 從後臺返回遊戲
voidAppDelegate::applicationWillEnterForeground() {
//開始動畫
Director::getInstance()->startAnimation();
}
在HelloWorldScene.cpp中有:
//初始化
boolHelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
//獲取OpenGL視圖可見大小
Size visibleSize= Director::getInstance()->getVisibleSize();
//獲取OpenGL視圖可見方向
Vec2 origin =Director::getInstance()->getVisibleOrigin();
…………………………….
}
//導演類結束
voidHelloWorld::menuCloseCallback(Ref* pSender)
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM ==CC_PLATFORM_WINRT)
MessageBox("You pressed the close button.Windows Store Apps do not implement a close button.","Alert");
return;
#endif
//導演類結束
Director::getInstance()->end();
#if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
由此看來,Director不愧是整個遊戲的“導演”。它在遊戲中無所不在,大到整個遊戲的控制,小到獲取屏幕的尺寸,起着至關重要的作用。