cocos2d-之座標系

cocos2d-x採用的是笛卡爾平面座標系,也就是平面上兩條垂直線構成的座標系,平面上任意一點都可以用(x,y)來表示。

(1)就座標系方向而言,cocos2d-x分爲屏幕座標系和OpenGL座標系。

(2)就節點本身而言,cocos2d-x分爲絕對座標系和相對座標系。

1.屏幕座標系

屏幕座標系,也叫UIKit座標系,原點在屏幕左上,x軸向右,y軸向下。cocos2d-x的屏幕觸摸事件傳入的位置座標就是採用了屏幕座標系。以320*480的屏幕爲例,如圖座標值爲屏幕座標系。


OpenGL座標系原點在屏幕的左下,x軸向右,y軸向上。cocos2d-x的元素採用的就是OpenGL座標系。同樣的上例,如圖座標值爲OpenGL座標系。


它們的轉換導演類(CCDirector)已經封裝好了兩個函數供我們使用。

  1. //UIKit To OpenGL  
  2. CCPoint convertToGL(const CCPoint& obPoint);  
  3. //OpenGL To UIKit  
  4. CCPoint convertToUI(const CCPoint& obPoint);  


絕對座標系也叫世界座標系,從名字可以看來,絕對座標系是一個恆座標系,不參考也不依賴於其他座標系。在cocos2d-x中它使用的是OpenGL座標系。不過因爲我們多在CCLayer上放置遊戲元素,所以一般比較少直接用到絕對座標系。


cocos2d-x元素是有層次關係的,節點使用的是相對父節點的位置座標,也就是相對座標系(也叫本地座標系),屏幕繪製的時候,cocos2d-x會自動將相對座標系轉換爲絕對座標系,渲染到屏幕的絕對位置上。


在舉例之前有必要先了解一下錨點這個概念。錨點是對節點而言的,它是節點的一個屬性,表明了節點位置的一個參考基準點,同樣放置一個物體在(300,300)這個位置,不同的錨點會產生不同的效果。節點的默認錨點位置在(0.5,0.5)。錨點和節點的位置值沒有關係,錨點只是影響了節點在屏幕上渲染的位置。如下圖,雖然精靈的在屏幕上渲染的位置不一樣,但是它們的position值是一樣的,都是(300,300)。錨點只會影響它本身在父節點中的渲染位置,而不會影響其子節點的相對它本身的位置。


我們先看一個例子,爲了方便演示,節點的錨點都設置爲(0,0)。

  1. CCSprite* big=CCSprite::create("big.png");  
  2. big->setAnchorPoint(ccp(0,0));  
  3. big->setPosition(ccp(50,50));//設置在相對父節點的(50,50)位置  
  4. this->addChild(big);//屏幕是父節點  
  5. CCSprite* little=CCSprite::create("little.png");  
  6. little->setAnchorPoint(ccp(0,0));  
  7. little->setPosition(ccp(50,50));//設置在相對父節點的(50,50)位置  
  8. big->addChild(little);//big是父節點  

效果如下:


CCNode提供給我們相對座標系和絕對座標系的轉換函數。

  1. CCPoint convertToNodeSpace(const CCPoint& worldPoint);  //將世界座標轉換爲對象節點內座標,忽略錨點,以當前父節點左下角座標爲標準  
  2. CCPoint convertToWorldSpace(const CCPoint& nodePoint);  //將對象節點內座標轉換爲事件座標,忽略錨點,以當前父節點左下角座標爲標準  
  3. CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);//將世界座標轉換爲基於錨點的對象節點內座標    
  4. CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);//將局域錨點的對象節點內座標轉換爲世界座標  

如果要獲取big和little的絕對座標

  1. CCPoint wp1=this->convertToWorldSpace(big->getPosition());//wp1(50,50)  
  2. CCPoint wp2=big->convertToWorldSpace(little->getPosition());//wp2(100,100)  

如果要把絕對座標轉換爲big和little的相對座標

  1. CCPoint np1=big->convertToNodeSpace(ccp(200,200));//np1(150,150)  
  2. CCPoint np2=little->convertToNodeSpace(ccp(200,200));//np2(100,100)


轉載自:http://blog.csdn.net/jackystudio/article/details/12830971

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章