cocos2d-x坐标系
?
屏幕坐標系蘋果的Quarze2D使用的是不同的坐標系統,原點在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該坐標系。因此在cocos2d中對觸摸事件做出響應前需要首先把觸摸點轉化到GL坐標系。可以使用CCDirector的convertToGL來完成這一轉化。
?
世界坐標系也叫做絕對坐標系,cocos2d中的元素是有父子關系的層級結構,我們通過CCNode的position設定元素的位置使用的是相對與其父節點的本地坐標系而非世界坐標系。最后在繪制屏幕的時候cocos2d會把這些元素的本地坐標映射成世界坐標系坐標。世界坐標系和GL坐標系一致,原點在屏幕左下角,本地坐標系本地坐標系也叫做物體坐標系,是和特定物體相關聯的坐標系。每個物體都有它們獨立的坐標系,當物體移動或改變方向時,和該物體關聯的坐標系將隨之移動或改變方向。比如用cocos2d-x創建了個矩形colorLayer:CCRect(10,10,100,100),這是的本地坐標系為以(10,10)為坐標原點,x軸向右,y軸向上。如果創建了一個CCSprite,錨點為(0.5,0.5),位置為(100,100),size為(40,40),這時的本地坐標系為以(80,80)為坐標原點,x軸向右,y軸向上。總之,本地坐標系原點為node的左下角坐標
?
接下來,convertToNodeSpace:調用CCPoint point = node1->convertToNodeSpace(node2->getPosition());
將node2的坐標轉化成相對于node1的本地坐標
?
?, 比如坐標如上圖所示,node1的錨點為(0,0),node2的錨點為(1,1),轉化之后,node的坐標變成了(-25,-60) 而convertToWorldSpace:調用CCPoint point = node1->convertToWorldSpace(node2->getPosition()); ? 是將node的坐標轉化成相對于node1的世界坐標,如上圖所示:首先將node1的坐標當做世界坐標,然后讓node2的坐標位置重置成相對于node1的世界坐標,也就是(15,20) ? convertToNodeSpaceAR,就是把node1的坐標系原點設置在錨點的位置,這里的錨點是(0,0)所以轉化之后的坐標系位置和上面的convertToNodeSpace一樣,結果也是一樣的,convertToWorldSpaceAR同理 ? ? 測試: CCSprite *sprite1 = CCSprite::spriteWithFile("CloseNormal.png"); sprite1->setPosition(ccp(20,40)); sprite1->setAnchorPoint(ccp(0,0)); this->addChild(sprite1); CCSprite *sprite2 = CCSprite::spriteWithFile("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) 和預算的一樣 這里在將sprite1的錨點設置成(0.5,0.5),對convertToNodeSpaceAR和convertToWorldSpaceAR進行了進一步的測試 sprite1->setAnchorPoint(ccp(0.5,0.5)); sprite1->setPosition(ccp(100,100)); CCPoint point5 = sprite1->convertToNodeSpaceAR(sprite2->getPosition()); CCPoint point6 = sprite1->convertToWorldSpaceAR(sprite2->getPosition()); CCLog("position = (%f,%f)",point5.x,point5.y); CCLog("position = (%f,%f)",point6.x,point5.y); 運算結果: size = (40.000000,40.000000) position = (-105.000000,-120.000000) position = (95.000000,80.000000) 分析:重置的sprite1的坐標為(100,100),錨點為(0.5,0.5)所以對于convertToNodeSpaceAR和convertToWorldSpaceAR這兩個方法的坐標系為原點(100,100),所以用convertToNodeSpaceAR轉化之后的坐標為(-105,-120)用convertToWorldSpaceAR化之后的坐標為(95,80)??文章來自網絡資源:http://blog.163.com/zjf_to/blog/static/201429061201292193855498/?
?
?
??
上一頁 1... -1-1-1-1-1-1-1... -1下一頁
轉載于:https://www.cnblogs.com/zhidao-chen/archive/2013/03/21/2974538.html
總結
以上是生活随笔為你收集整理的cocos2d-x坐标系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式软件常考题
- 下一篇: 什么牌子的鸡精带奖金?