你可能上學的時候就已經知道「笛卡爾座標系」了,它在幾何課本里常常用到。若是你已經忘得差很少了,下面這些圖片能夠很快喚起你的記憶:
在移動遊戲開發過程當中,有三種類型的座標系你可能遇到:html
iOS/Android/Windows SDK中的通用UI座標系:html5
詳見下圖
node
DirectX 使用Left-handed Cartesian Coordinategit
Cocos2d-x/-html5/-iphone使用的座標系和OpenGL的座標系同樣,名爲「Right-handed Cartesian Coordinate Syste」。
在2D世界中,咱們僅會使用x軸和y軸。因此在你的cocos2d遊戲中:github
下面這張圖片有助於更好的闡述Cocos2d-x座標:
必定要注意:通用UI座標系和DirectX座標系是不同的。iphone
因爲每一個類都繼承自CCNode(cocos2d-x的最頂層類),因此每一個類都會默認有anchorPoint屬性。 當咱們在一個位置畫一個的對象的時候,cocos2d-x會合並屬性位置和anchorPoint。固然,當旋轉一個對象時,cocos2d-x會圍繞繞anchorPoint旋轉的。
咱們建立一個灰色父對象和一個藍色子對象。設置父對象位置是ccp(100,100),子對象的anchor point位於圓心。post
CCSprite* parent = CCSprite::create("parent.png"); parent->setAnchorPoint(ccp(0, 0));// Anchor Point parent->setPosition(ccp(100, 100)); parent->setAnchorPoint(ccp(0, 0)); addChild(parent); //create child CCSprite* child = CCSprite::create("child.png"); child->setAnchorPoint(ccp(0.5, 0.5)); child->setPosition(ccp(0, 0)); parent->addChild(child);//add child sprite into parent sprite.
因爲咱們設置子對象的位置是ccp(0,0),父對象位置是ccp(100,100)。因此,子對象位置是:
this
做爲例子,下面這個精靈有的錨點位於 ccp(0,0),位置位於ccp(0,0)。
這個矩形精靈將被放到它的父對象(layer)的左下角。
示例:3d
// create sprite CCSprite* sprite = CCSprite::create("bottomleft.png"); sprite->setAnchorPoint(ccp(0, 0));// Anchor Point sprite->setPosition(ccp(0,0)); addChild(sprite);
在另外一個例子中,咱們會擺放一個座標爲ccp(0.5,0.5)的anchorPoint,以便您更好的理解錨點的相對值。orm
// create sprite CCSprite* sprite = CCSprite::create("center.png"); sprite->setAnchorPoint(ccp(0.5, 0.5));// Anchor Point sprite->setPosition(ccp(0,0)); addChild(sprite);
正如你從圖中看出的,錨點取的不是像素值,此值的X和Y是相對於此節點的大小的。
舉例,convertToNodeSpace用於tile-based的遊戲,即有一個大地圖。convertToNodeSpace會轉換openGL觸摸點轉成.tmx 地圖或者其餘近似的座標。
例子:
下面的圖片會展示,node1的錨點(0,0),node2的錨點是(1,1)。
咱們會調用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 轉換node2的屏幕座標爲node1的位置。結果是,node2的位置是(-25,-60).
convertToWorldSpace(常量 CCPoint& nodePoint) 轉換node座標爲SCREEN座標。convertToWorldSpace會常常返回你的精靈的SCREEN位置,若是你想捕獲精靈的taps並且須要移動/縮放layer的時候,這可能很是有幫助。
CCPoint point = node1->convertToWorldSpace(node2->getPosition());
上面的代碼會轉換node2座標爲node2在屏幕上對應的座標。
convertToWorldSpaceAR返回相對錨點的位置:因此若是你的場景 - 根layer有一個錨點位於ccp(0.5f, 0.5f)。- 默認的,convertToNodeSpaceAR應返回相對於屏幕中心的位置。
convertToNodeSpaceAR - 和convertToWorldSpaceAR是同樣的邏輯。
CCSprite *sprite1 = CCSprite::create("CloseNormal.png"); sprite1->setPosition(ccp(20,40)); sprite1->setAnchorPoint(ccp(0,0)); this->addChild(sprite1); CCSprite *sprite2 = CCSprite::cteate("CloseNormal.png"); sprite2->setPosition(ccp(-5,-20)); sprite2->setAnchorPoint(ccp(1,1)); this->addChild(sprite2); CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition()); CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition()); CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition()); CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition()); CCLog("position = (%f,%f)",point1.x,point1.y); CCLog("position = (%f,%f)",point2.x,point2.y); CCLog("position = (%f,%f)",point3.x,point3.y); CCLog("position = (%f,%f)",point4.x,point4.y);
結果:
position = (-25.000000,-60.000000) position = (15.000000,20.000000) position = (-25.000000,-60.000000) position = (15.000000,20.000000)