cocos2d-x是基於openGLES的,所以遵循openGL的座標系,也就是說是以屏幕的左下角爲座標原點,如下圖:
屏幕座標系一般是以左下角爲座標原點,如下圖所示:
在開發cocos2d-x程序時一定要注意座標輪換問題,屏幕與openGL座標轉換有相應的函數。
- convertToNodeSpace(const CCPoint& worldPoint): 這個函數把世界座標轉換爲對象窗口內的座標。
-
- convertToWorldSpace(const CCPoint& nodePoint): 這個函數把對象窗口內的座標轉換爲世界座標。
-
- convertToNodeSpaceAR(const CCPoint& worldPoint):這個函數把世界座標轉換爲基於錨點的窗口內的座標。
-
- convertToWorldSpaceAR(const CCPoint& nodePoint):這個函數把基於錨點的對象窗口內的座標轉換爲世界座標。
用到cocos2dX的座標轉換,一般兩種情況:
1)從當前座標點獲取世界座標點(屏幕座標點,opengl的座標系)
2)從當前座標點獲取相對於某個CCNode的座標點;
第一種情況,直接用:nodeParent->convertToWorldSpace(node->getPosition());
這裏一定是需要轉換座標對象的父類調用convertToWorldSpace,參數是對象的座標點(相對於父類的座標點);
返回的是屏幕座標點;
第二種情況,直接用:node2->convertToNodeSpace(node1->getPosition);
node2並不是node1的父類,現在的情況就是:node1想得到相對於node2座標系的座標點;
返回的是相對於node2座標系的座標點。
注意:以上的調用,是沒有考慮nodeParent和node2的anchorPoint的(就是使用了0,0的錨點);考慮到錨點就使用:
convertToWorldSpaceAR()和convertToNodeSpaceAR();
PS:AR的意思是不是Anchor Relative???
nodeParent->convertToWorldSpaceAR(node->getPosition()); //因爲默認是0,0的錨點,
所以其得到的座標點是 ccpAdd(nodeParent->convertToWorldSpace(node->getPosition()),ccp(nodeParent->getContentSize.width*0.5,nodeParent->getContentSize.height*0.5))
node2->convertToNodeSpaceAR(node1->getPosition); //因爲默認是0,0的錨點,
所以其得到的座標點是 ccpSub(nodeParent->convertToWorldSpace(node->getPosition()),ccp(node2->getContentSize.width*0.5,node2->getContentSize.height*0.5))
。