Cocos2d-x的坐标系统

时间:2022-05-25 00:39:24

推荐转至此处阅读《Cocos2d-x的坐标系统》





目标读者:已经了解Cocos2d-x中结点树的概念


一、坐标系

坐标系用坐标来定量描述物体的位置。同一物体在不同坐标系下的坐标不同。Cocos2d-x中各个坐标系统的不同之处主要体现在原点位置的不同。

 

二、Cocos2d-x的坐标系统

1、类别

  • 屏幕坐标系
  • OpenGL坐标系
  • 世界坐标系
  • 本地坐标系

2、定义

坐标系统 定义
屏幕坐标系 原点在左角,X轴向右,y轴向
其他坐标系 原点在左角,X轴向右,y轴向

三、屏幕坐标系 & OpenGL坐标系

作用对象均为整个屏幕。因此屏幕上物体的坐标可以在这两种坐标系间相互转换。

CCDirector::convertToGL();//将屏幕坐标转为OpenGL坐标
CCDirector::convertToUI();//将OpenGL坐标转为屏幕坐标

四、世界坐标系 & 本地坐标系

这两种坐标系是一对相对的概念,分别是以父节点和子节点为作用对象的坐标系。
举个例子,先上图:

Cocos2d-x的坐标系统

父节点为一个CCLayer图层节点,子节点为一个CCSprite精灵节点。把子节点放在父节点某个位置的时候,我们需要在子节点上取一个点作为代表,这个点在父节点上的位置作为子节点在父节点上的位置。这个点称为锚点

锚点在本地坐标系上的坐标为(a1,b1)(这里说的坐标是普通意义上的坐标,不是指Cocos2d-x中设置锚点的那种比例坐标);子节点在世界坐标系上的坐标为(a2,b2)。

 

1、坐标转换

当父节点有多个子节点时,容易获取子节点的世界坐标,但是很多时候我们希望得到比如子节点A相对于子节点B相对位置,这时就需要知道子节点A在子节点B的本地坐标系中的坐标值。同时,有时候我们需要通过本地坐标获得世界坐标值。

CCPoint::convertToNodeSpace();//世界坐标转为本地坐标
CCPoint::convertToWorldSpace();//将本地坐标转为世界坐标
  • CCPoint::convertToNodeSpace

    1. CCPoint point = node1->convertToNodeSpace(node2->getPosition());

    假设node1对象的世界坐标(a1,b1),node2的世界坐标(a2,b2),这个语句通过函数计算出node2的相对于node1本地坐标系的坐标,即node1指向node2的向量坐标(a2-a1,b2-b1),并把结果返回给point。

  • CCPoint::convertToWorldSpace

    1. 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)。

转载指明出处 http://www.cnblogs.com/tangyikejun/p/3858883.html

https://www.zybuluo.com/tangyikejun/note/23258