cocos2d座標系轉換

來自:http://www.cnblogs.com/cppguru/archive/2011/05/10/2041835.html

無論是搞2d還是3d開發,最需要搞清楚的就是座標系,這部分混亂的話就沒啥奔頭了。所以玩cocos2d,一上來就先把各種與座標有關的東西搞清楚。

 

基本的兩個座標系:屏幕座標系和GL座標系。

屏幕座標系x軸朝右,y軸朝下。默認原點在左上角。

GL座標系x軸朝右,y軸朝上。默認原點在左下角。

     

      在調用任何需要設置位置的函數,或從函數獲取位置信息前,必須要明確這個函數使用哪個座標系。比如調用CCNode類的setPosition函數,它使用的就是GL座標系。比如在處理觸摸事件時CCTouch對象中的座標就是屏幕座標系。

      另一個重要的座標系就是和Node相關的本地座標系。這個結構和一般做3D用的場景樹的概念是一樣的。所以從Node拿到的位置是該節點的本地座標,需要通過特定的函數才能把本地座標轉換爲世界座標。而且這裏的座標都用的是GL座標系。在CCNode對象中有幾個方便的函數可以做座標轉換。convertToWorldSpace方法可以把基於當前node的本地座標系下的座標轉換到世界座標系中。convertToNodeSpace方法可以把世界座標轉換到當前node的本地座標系中。

      另一個關鍵的問題就是在cocos2d裏面就是各種對象的大小問題。因爲在cocos2d裏CCNode對象有縮放的方法setScaleX和setScaleY。所以在獲取對象大小的時候就必須根據情況明確指定獲取對象原始大小,還是縮放後的大小。當然cocos2d裏提供了對應的函數來完成這些操作。

getContentSize 函數用來獲得節點原始的大小。

boundingBox 函數用來獲得經過縮放和旋轉之後的外框盒大小。

 

舉個簡單的例子:

bool ret = CCRect::CCRectContainsPoint(

this->boundingBox() , this->getParent()->convertTouchToNodeSpace( pTouch ));

這個例子的功能是來判定當前的觸摸操作是否發生在自己的node對象上。其中pTouch是CCTouch對象的指針,包含了當前觸摸事件發生點的座標。

CCRectContainsPoint這個函數用來判斷一個點是否在一個矩形範圍內。我們就想用這個函數來判斷當前觸摸操作的這個點是否在當前node的範圍內。

this->boundingBox() 方法獲得了當前節點對象在父節點對象下的縮放之後的本地座標大小,並且是用GL座標系表示的。

pTouch對象中的座標是屏幕座標系,所以必須轉換到GL座標系,再轉換到父節點的本地座標下。好在convertTouchToNodeSpace這個函數一次完成了這兩個轉換,可以參考該庫的源碼,其中有具體的計算過程。

所有數據都轉換到同一個座標系下了以後,就可以通過CCRectContainsPoint函數完成最終的判定操作。

 

最後想說的一點是,儘可能用相對座標。換句話說,程序中所有對象在設置大小和位置時,都應該以父對象的大小和位置爲依據。 這樣程序發佈在以各種不同的分辨率發佈時,只需要調整根對象的大小就可以了。

發佈了19 篇原創文章 · 獲贊 15 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章