1. 程式人生 > >cocos2d-x中錨點設定及定位方式

cocos2d-x中錨點設定及定位方式

  前面: 以下  基於 cocos2d-2.0-x-2.0.3   總結

在cocos2d示例程式碼HelloCpp中,為什麼要將CCMenu設定位置到CCPointZero,即使CCMenu的錨點是在(0.5, 0.5)?

這是因為CCMenu沒有使用錨點進行座標定位,而是使用的座標原點。也就是說,CCMenu的座標原點放到了其父節點的座標原點。

不光是CCMenu沒有使用錨點定位,像CCLayer,CCScene都沒有使用錨點定位。具體設定是在建構函式中設計標記m_bIgnoreAnchorPointForPosition = true;下表描述了節點的預設錨點位置及定位方式

節點型別 錨點位置 使用錨點?
CCNode (0, 0)
CCScene及其子類 (0.5, 0.5)
CCLayer及其子類 (0.5, 0.5)
CCSprite及其子類 (0.5, 0.5)

說明:CCNode的其它子類如果沒有特殊指定,都是繼承了CCNode的錨點位置及定位方式。典型的是CCLabelAtlas,它就是使用CCNode的定位方式,因為它及它的父類CCAtlasNode都沒有對錨點位置和是否使用錨點進行設定,而CCLabelFont使用與CCSprite的錨點和定位方式,因為它是CCSprite的子類。

錨點位置和定位方式都是可以改變的。前者通過CCNode::setAnchorPoint()改變,後者通過設定CCNode::m_bIgnoreAnchorPointForPosition來改變。一般情況下,使用預設的就可以了,什麼情況下需要改變呢?像下圖這種情形可能需要改變錨點位置。

這是同一個視窗中使用了兩個頁面,第一個頁面包含一個背景、一幅圖和一個字標,後者包含一個背景、一幅圖和一個按鍵。這兩個頁面可以切換,如果為了實現比較方便地進行變換,每個頁面由一個節點表示是比較合理的。但是是使用哪一個類來表示根節點呢?可選的有四種,分別是CCNode、CCLayer、CCScene和CCSprite。

  • 對於使用CCSprite,如果背景是影象,則比較方便實現,但是對於label是影象的孩子理解上有些彆扭。
  • 對於使用CCLayer,推薦是不使用那麼多的Layer,因為第一個頁面不需要互動,但是它仍然佔用了訊息處理的時間。
  • 比較好的方式CCScene或CCNode,雖然使用CCScene對於理解上仍然有一些彆扭。無論是使用CCScene和CCNode作為根節點,容易操作的方式都是將錨點設定到(0.5, 0.5),並且使用錨點進行定位。所以 如果使用CCScene需要設定CCNode::m_bIgnoreAnchorPointForPosition=false,而如果使用CCNode需要設定CCNode::setAnchorPoint(ccp(0.5, 0.5))
     。

getAnchorPointInPixel

對於錨點在中心(0.5, 0.5)的結點,使用getAnchorPointInPixel獲取到的是此結點的中心座標。利用此介面,可以方便地定位到結點的中心。當然,使用getContentSize取半也可以。此資訊用於對齊結點很有用處。