[5]Cocos2d-x之坐标系

前端之家收集整理的这篇文章主要介绍了[5]Cocos2d-x之坐标系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
世界坐标系:也叫绝对坐标系,用来描述其他坐标系的位置。世界坐标系的原点在左下角,x轴向右,y向上。绘制屏幕时,节点元素的本地坐标会映射为世界坐标

GL坐标系:cocos使用的坐标系,原点在左下角,x轴向右,y轴向上。

屏幕坐标系:ios、android、windows phone等都是用屏幕坐标系,原点在屏幕左上角,x轴向右,y轴向下。需要把触摸点转换为OpenGL坐标。

本地坐标系:用于标记节点的位置相对于父节点的坐标系,使用position设置的位置为相对于其父节点的位置,与GL坐标系一样。

本地坐标系原点:锚点在左下角,值为(0,0),使用convertToNodeSpace、convertToWorldSpace时做为转换坐标参考,与 convertToNodeSpaceAR、convertToWorldSpaceAR不一样,带AR使用的是我们设置的锚点,不是原点

坐标转换convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR的使用
auto sp1 = Sprite :: create( "HelloWorld.png" );
sp1 ->setAnchorPoint ( Vec2( 0,0 ));
sp1 ->setPosition ( Vec2( 300,400 ));
this ->addChild ( sp1);
auto sp2 = Sprite ::create ( "pk.png" );
sp2 ->setAnchorPoint ( Vec2( 1,1 ));
sp2 ->setPosition ( Vec2( 100,300 ));
this ->addChild ( sp2);
//参考点(100,300)
Vec2 convertNode = sp1 ->convertToNodeSpace ( sp2-> getPosition ());
Vec2 convertWorld = sp1 ->convertToWorldSpace ( sp2-> getPosition ());
Vec2 convertNodeAR = sp1 ->convertToNodeSpaceAR ( sp2-> getPosition ());
Vec2 convertWorldAR = sp1 -> convertToWorldSpaceAR (sp2 -> getPosition());
CCLOG ("sp1,x: %f,y: %f :",sp1 -> getPosition(). x,sp1 ->getPosition (). y);
               CCLOG ("sp2,sp2 -> getPosition(). x,sp2 ->getPosition (). y);
               CCLOG ("convert Node,convertNode . x,convertNode. y );
               CCLOG ("convert World,convertWorld . x,convertWorld. y );
               CCLOG ("convert Node AR,convertNodeAR . x,convertNodeAR. y );
               CCLOG ("convert World AR,convertWorldAR . x,convertWorldAR .y );
               /*sp1,x: 300.000000,y : 400.000000 :
                             sp2,x : 100.000000,y : 300.000000 :
                             convert Node,x : -200.000000,y : -100.000000 :
                             convert World,x : 400.000000,y : 700.000000 :
                             convert Node AR,y : -100.000000 :
                             convert World AR,y : 700.000000 :*/

               //sp2的坐标原点(-140,60)
Vec2 convertNode2 = sp2 ->convertToNodeSpace ( sp1-> getPosition ());//300-(-140)=440,400-60=340
Vec2 convertWorld2 = sp2 ->convertToWorldSpace ( sp1-> getPosition ());//300+(-140)=160,400+60=460
Vec2 convertNodeAR2 = sp2 ->convertToNodeSpaceAR ( sp1-> getPosition ());
Vec2 convertWorldAR2 = sp2 ->convertToWorldSpaceAR ( sp1-> getPosition ());
               CCLOG ("convert Node2,convertNode2 . x,convertNode2. y );
               CCLOG ("convert World2,convertWorld2 . x,convertWorld2. y );
               CCLOG ("convert Node AR2,convertNodeAR2 . x,convertNodeAR2 .y );
               CCLOG ("convert World AR2,convertWorldAR2 . x,convertWorldAR2 .y );
                              //convert Node2,x: 440.000000,y : 340.000000 :
                              //convert World2,x : 160.000000,y : 460.000000 :
                              //convert Node AR2,x : 200.000000,y : 100.000000 :
                              //convert World AR2,y : 700.000000 :

总结:
根据以上例子,可以得出转换世界坐标系与本地坐标系的方法
1、convertToNodeSpace和convertToWorldSpace以坐标原点为参考点,像例子1中的sp2参考点为(300,400),例子2(-140,60)。convertToNodeSpaceAR和convertToWorldSpaceAR则以节点所设置的锚点来进行计算
2、需要转换的节点的坐标,这里不需要使用坐标原点,例子1中sp2(100,300),例子2中sp1(300,400)
3、convertToNodeSpace的计算:需转换的节点的坐标-参考点坐标,例子1:(100-300,300-400),例子2(300-(-140),400-60)
4、convertToWorldSpace的计算:需转换的节点的坐标+参考点坐标,例子1:(100+300,300+400),例子2(300+(-140),400+60)

猜你在找的Cocos2d-x相关文章