推荐转至此处阅读《Cocos2d-x的坐标系统》
目标读者:已经了解Cocos2d-x中结点树的概念
一、坐标系
坐标系用坐标来定量描述物体的位置。同一物体在不同坐标系下的坐标不同。Cocos2d-x中各个坐标系统的不同之处主要体现在原点位置的不同。
二、Cocos2d-x的坐标系统
1、类别
- 屏幕坐标系
- OpenGL坐标系
- 世界坐标系
- 本地坐标系
2、定义
坐标系统 | 定义 |
---|---|
屏幕坐标系 | 原点在左上角,X轴向右,y轴向下 |
其他坐标系 | 原点在左下角,X轴向右,y轴向上 |
三、屏幕坐标系 & OpenGL坐标系
作用对象均为整个屏幕。因此屏幕上物体的坐标可以在这两种坐标系间相互转换。
CCDirector::convertToGL();//将屏幕坐标转为OpenGL坐标 CCDirector::convertToUI();//将OpenGL坐标转为屏幕坐标
四、世界坐标系 & 本地坐标系
这两种坐标系是一对相对的概念,分别是以父节点和子节点为作用对象的坐标系。
举个例子,先上图:
父节点为一个CCLayer图层节点,子节点为一个CCSprite精灵节点。把子节点放在父节点某个位置的时候,我们需要在子节点上取一个点作为代表,这个点在父节点上的位置作为子节点在父节点上的位置。这个点称为锚点。
锚点在本地坐标系上的坐标为(a1,b1)(这里说的坐标是普通意义上的坐标,不是指Cocos2d-x中设置锚点的那种比例坐标);子节点在世界坐标系上的坐标为(a2,b2)。
1、坐标转换
当父节点有多个子节点时,容易获取子节点的世界坐标,但是很多时候我们希望得到比如子节点A相对于子节点B相对位置,这时就需要知道子节点A在子节点B的本地坐标系中的坐标值。同时,有时候我们需要通过本地坐标获得世界坐标值。
CCPoint::convertToNodeSpace();//世界坐标转为本地坐标 CCPoint::convertToWorldSpace();//将本地坐标转为世界坐标
CCPoint::convertToNodeSpace
CCPoint point = node1->convertToNodeSpace(node2->getPosition());假设node1对象的世界坐标(a1,b1),node2的世界坐标(a2,b2),这个语句通过函数计算出node2的相对于node1本地坐标系的坐标,即node1指向node2的向量坐标(a2-a1,b2-b1),并把结果返回给point。
CCPoint::convertToWorldSpace
CCPoint pos2 = node1->convertToWorldSpace(relativePos); node2->setPostion(pos2);
与CCPoint::convertToNodeSpace相反,这个函数由相对于node1的相对坐标relativePos得到node2的世界坐标。
2、锚点
在讲世界坐标系和本地坐标系的时候提到锚点,这里对锚点进行一点补充。Cocos2d-x中采用比例坐标来设置锚点。一个节点的锚点默认在节点中心,即(0.5,0.5)。如果设置锚点在节点左上角,那么锚点坐标为(0,1)。
3、ContentSize
由于锚点只是一个比值向量,实际锚点在节点中的位置还需要由ContentSize决定,注意ContentSize不一定就是节点图形大小,ContentSize可以自行设定。
举个例子,比如一个精灵对象的图片尺寸是30*30,其ContentSize初时也是30*30,现在设置ContentSize为20*20,锚点默认为(0.5,0.5),这时锚点的位置在本地坐标系下(10,10)。