【Cocos2d-x游戲開發】淺談游戲中的坐標系


  無論是開發2D還是開發3D游戲,首先必須弄清楚坐標系的概念。在Cocos2d-x中,需要了解的有OpenGL坐標系、世界坐標系和節點坐標系。

 1.UI坐標系

  IOS/Android/Windows SDK中通用的UI坐標系默認起點坐標(x=0,y=0)位於坐上角,x軸從屏幕最左邊開始,由左向右逐漸增加;Y軸坐標從屏幕最上方開始,由上至下逐漸增加,如圖所示:

  UI坐標系又被稱為紋理坐標系,在Cocos2d-x中,只有從紋理截取部分矩形時才使用這個坐標系,例如Sprite的TextureRect屬性。

 

2.OpenGL坐標系

  OpenGL坐標系又稱為繪圖坐標系,Cocos2d-x以OpenGL和OpenGL ES為基礎,所以支持的自然是OpenGL坐標系。OpenGL坐標系默認原點坐標(X=0,Y=0)在屏幕左下角,X軸從屏幕最左邊開始,由左向右逐漸增加, Y軸從屏幕最下方開始,由下至上逐漸增加。

  而IOS設備的屏幕坐標系(即UI坐標系)默認原點在左上角,X軸向右,Y軸向下(Y軸和OpenGL坐標正好相反)。IOS的屏幕觸摸時間Touch傳入的位置信息使用的是屏幕坐標系,因此在Cocos2d-x中對觸摸時間進行處理時,需要先把觸摸點的位置轉換成OpenGL坐標,可以使用Director類中的convertToGL函數來進行轉換。

 

3.世界坐標系

  世界坐標系又稱絕對坐標系,是游戲開發中的概念,它建立了描述其他坐標系所需要的參考標准。我們可以用世界坐標系來描述其他坐標系的位置。

  Cocos2d-x中的元素結構是有父子關系的層級結構,通過Node的position設定元素的位置使用的是相對其父節點的本地坐標系,而非世界坐標系。最后在繪制屏幕的時候,Cocos2d-x會把這些元素的本地節點坐標映射成世界坐標系坐標。世界坐標系和OpenGL坐標系一致,原點默認在屏幕左下角,X軸向右,Y軸向上。

 

4.節點坐標系 

  節點坐標系又稱本地坐標系,是特定節點相關聯的坐標系。每個節點都有獨立的坐標系。當節點移動或者改變方向的時候,和該節點關聯的坐標系(它的子節點)也將隨之移動或者改變方向。這是相對的。

  例如乘坐出租車的時候對駕駛員說“向左轉”,使用的是節點(出租車)坐標系,“前”、“后”、“左”、“右”只有在相對於出租車的坐標系中才有意義。但是如果我們說“向東開”,我們使用的就是世界坐標系了,無論是車內還是車外的人都知道應該向什么方向開了。

 

5.Vec2和Point

  在Cocos2d-x3.0版本中,使用Point來表示一個坐標點,Point中包含了一個x和一個y坐標,都是浮點數。從Cocos2d-x 3.1版本開始,使用Vec2來代替Point,而Point作為typedef存在,在Vec2.h源代碼中是這樣定義的:

typedef Vec2 Point;

 

6.錨點

  錨點是Cocos2d-x中一個非常重要的概念,每一個Node都有一個錨點(anchor point),錨點指定了紋理圖像和所在節點原點(即position所表示的點)重合的點的位置。錨點值的范圍從(0,0)到(1,1)之間,默認情況下,錨點位於紋理圖像的幾何中心,即(0.5,0.5),該值表示的並不是一個像素點,而是一個乘數因子。(0.5,0.5)表示錨點位於紋理圖像長度乘以0.5的地方,即紋理圖像的中心。因此,只有在Node類節點使用了紋理圖像的情況下,錨點才有意義。

  錨點的最大作用就是輔助節點進行界面布局定位。可以將錨點想象成使用圖釘在一面空白的牆上固定一張照片,被釘住的照片就相當於節點,牆壁就相當於設備的屏幕,而圖釘就是錨點。在Cocos2d-x中,錨點的默認位置在紋理圖像的幾何中心位置。例如將某個精靈圖像的位置設為(50,50)的時候,該精靈圖像的幾何中心位置默認情況下也應該是(50,50)。但是如果將錨點設置在精靈圖像的左下角(0,0),並將精靈圖像的位置設置為(50,50),那么此時應該是精靈圖像的左下角位於(50,50)的位置,而不是精靈圖像的幾何中心處在(50,50)的位置了。

  Node的position使用的就是父節點的節點坐標系,它和OpenGL坐標系也是一致的,X軸向右,Y軸向上,原點默認在父節點的左下角。如果父節點是場景樹中的頂層節點,那么它使用的節點坐標系就和世界坐標系重合了。

  Node類有兩個方便的函數可以用於坐標轉換:

    *convertToNodeSpace: 把世界坐標轉換成當前節點的節點坐標。

    *convertToWorldSpace; 把基於當前節點的節點坐標系下的坐標轉換成世界坐標。

  需要注意的是,這兩種轉換都是基於當前的節點坐標,並且不考慮錨點,而一個節點的position所使用的坐標是基於它父節點的坐標的,因此,我們要把Node的位置轉換到世界坐標系中應該調用父節點的convertToWorldSpace函數。Node類還提供了convertToNodeSpaceAR和convertToWorldSpaceAR兩個函數。這兩個函數完成同樣的轉換功能,但是他們是基於坐標錨點的。

 

了解並掌握了以上幾種最基本的坐標系知識,才能高效快捷的使用Cocos2d-x開發游戲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM