壹、Cocos編輯器
自動布局系統主要涉及固定與拉伸屬性:
如圖,總***可以修改控件的上下左右四個圖釘和中間的兩個拉伸條六個屬性。效果
1.當打開其中的任意壹個圖釘時,當前節點與父節點的對應邊的距離即被固定。當父節點的大小修改時,當前節點與父節點對應邊的距離總是不變。 2.當打開其中的任意兩個相對的圖釘時,當前節點與父節點對應的兩邊的距離成固定比例。即當修改父節點的大小時,當前節點到父節點對應兩條邊的距離之比總是不變的。 3.當開啟中間任意壹條拉伸條,如橫向拉伸條,節點的寬度與父節點的寬度之比固定不變。其他
1. 不開啟上述任意屬性時,對象默認相對左下角位置不變。 2. 當前僅控件對象(文本、FNT字體也沒有)和容器兩種類型有拉伸條屬性。二、Cocos 2d-x(Cocos Framework)中的相關概念及代碼設置
設計分辨率和屏幕分辨率:
首先我們需要了解兩個概念:在Cocos2d-x中有兩種分辨率:設備分辨率、屏幕分辨率。設備分辨率即當前遊戲所運行平臺的實際分辨率;設計分辨率就是我們設計的遊戲的分辨率。 設計分辨率是可設置的,是我們的遊戲程序能夠“感知到”的分辨率大小,我們的界面超過這個區域的部分都不會顯示。 設計分辨率壹般在啟動時進行設置AppDelegate::applicationDidFinishLaunching
中進行,代碼如下:director->getOpenGLView()->setDesignResolutionSize(960,640,ResolutionPolicy::FIXED_HEIGHT);
(這句代碼上邊還有壹句createWithRect這個是在桌面系統上,創建遊戲模擬器用的。可以修改裏邊的Rect的後邊兩個值來修改設備分辨率,但這個值在移動設備上是無效的。) 這句代碼什麽意思呢? 這裏把設計分辨率設置為960,640,並把遊戲界面調整方案設置為固定寬度。但這麽設置之後,我們後邊再獲取設計分辨率時得到的大小卻不壹定是960,640。這又是為什麽呢? 看看源碼: 轉到setDesignResolutionSize的定義看看。裏邊做了壹些判斷和賦值,最終調用了updateDesignResolutionSize,繼續轉到updateDesignResolutionSize裏邊,這個函數的部分代碼如下://1.計算遊戲界面在縮放至充滿屏幕的情況下X、Y軸的縮放率:_scaleX= (float)_screenSize.width/ _designResolutionSize.width;
_scaleY= (float)_screenSize.height/ _designResolutionSize.height;//2.根據設配策略,調整縮放率和設計分辨率:if(_resolutionPolicy== ResolutionPolicy::NO_BORDER){//將X、Y軸縮放值設置為其中的最大者
_scaleX = _scaleY = MAX(_scaleX,_scaleY);
}else if(_resolutionPolicy== ResolutionPolicy::SHOW_ALL){//將X、Y軸縮放值設置為其中的最小者
_scaleX = _scaleY = MIN(_scaleX,_scaleY);
}else if( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
_scaleX = _scaleY;//將X、Y軸縮放值固定為Y軸縮放值,調整設計分辨率的寬度,使設計分辨率的寬度在縮放後依然能夠充滿屏幕。
_designResolutionSize.width= ceilf(_screenSize.width/_scaleX);
}else if( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
_scaleY= _scaleX;//將X、Y軸縮放值固定為X軸縮放值,調整設計分辨率的高度,使設計分辨率的高度在縮放後依然能夠充滿屏幕。
_designResolutionSize.height= ceilf(_screenSize.height/_scaleY);
}//其他縮放策略:EXACT_FIT不作調整
這段代碼主要做了兩件事: 1.根據設備分辨率和設計分辨率計算遊戲界面的縮放率; 2.調整設計分辨率。 根據以上源碼我們應該很容易就能夠理解幾種縮放策略的意義: ·NO_BORDER就是在保持設計分辨率大小不變的情況下,將遊戲界面按比例縮放至充滿屏幕。遊戲的上下或者左右兩邊可能會被裁剪。 ·SHOW_ALL(Cocos 2d-x默認方案)就是在保持設計分辨率大小不變的情況下,將遊戲界面按比例縮放至設計分辨率的其中壹邊頂住屏幕。遊戲上下或者左右兩邊可能會有黑邊。 ·FIXED_HEIGHT就是固定設計分辨率的高度,調整設計分辨率的寬度,使設計分辨率的長寬比與設備分辨率的長寬比相同,然後縮放遊戲界面至充滿屏幕。 ·FIXED_WIDTH同上,不同的是保持寬度不變。 ·EXACT_FIT是最粗暴的方式,直接將遊戲界面縮放到充滿整個屏幕,X軸Y軸縮放比率不壹定壹致。那麽,我們應該選擇哪個方案呢?必然的我們應該選擇FIXED_HEIGHT或者FIXED_WIDTH。因為只有這兩個方案下,界面是會自動根據設備分辨率調整設計分辨率的大小並且充滿屏幕。
接下來加載界面。
加載界面在HelloWorld::init中進行:auto rootNode= CSLoader::createNode("MainScene.csb");
auto size= Director::getInstance()->getVisibleSize();
rootNode->setContentSize(size);
ui::Helper::doLayout(rootNode);
addChild(rootNode);
這裏除了用createNode把界面加載出來,並添加到HelloWorld之外,還做了兩件事情:設置加載出來的界面的ContentSize,調用對rootNode調用了ui::Helper::doLayout對加載出來的界面進行處理。
為什麽要這麽設計呢,做成自動的多好啊?
第壹個理由:跟編輯器不壹致;第二個理由是:自動調整界面被設計為是被動的,如果是主動進行的話,可能會造成大量的性能損失——如果每次設置大小都要重新遍歷計算所有的子節點的位置,那得浪費多少CPU時間啊。效果:
設備分辨率X/Y相對設計分辨率X/Y較大,設配策略為固定高度
請點擊輸入圖片描述
設備分辨率X/Y相對設計分辨率X/Y較大,設配策略為固定寬度
請點擊輸入圖片描述
設備分辨率X/Y相對設計分辨率X/Y較小,設配策略為固定高度
請點擊輸入圖片描述
設備分辨率X/Y相對設計分辨率X/Y較小,設配策略為固定高度
請點擊輸入圖片描述
PS:枚舉類型ResolutionPolicy是框架提供給我們的方便的默認方案。其實我們在設置設計分辨率之前可以獲取設備分辨率,然後自己根據設備分辨率調整設計分辨率。