[关闭]
@tangyikejun 2014-07-21T09:26:33.000000Z 字数 1437 阅读 4441

cocos2d-x的坐标系统

Cocos2d-x 学习笔记


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




一、坐标系

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


二、Cocos2d-x的坐标系统

1、类别

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

2、定义

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

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

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

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

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

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

世界坐标系与本地坐标系

父节点为一个CCLayer图层节点,子节点为一个CCSprite精灵节点。把子节点放在父节点某个位置的时候,我们需要在子节点上取一个点作为代表,这个点在父节点上的位置作为子节点在父节点上的位置。这个点称为锚点
锚点在本地坐标系上的坐标为(a1,b1)(这里说的坐标是普通意义上的坐标,不是指Cocos2d-x中设置锚点的那种比例坐标);子节点在世界坐标系上的坐标为(a2,b2)。

1、坐标转换

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

  1. CCPoint::convertToNodeSpace();//世界坐标转为本地坐标
  2. 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);
    2. node2->setPostion(pos2);

    与CCPoint::convertToNodeSpace相反,这个函数由相对于node1的相对坐标relativePos得到node2的世界坐标。


2、锚点

在讲世界坐标系和本地坐标系的时候提到锚点,这里对锚点进行一点补充。Cocos2d-x中采用比例坐标来设置锚点。一个节点的锚点默认在节点中心,即(0.5,0.5)。如果设置锚点在节点左上角,那么锚点坐标为(0,1)。


转载指明出处 https://www.zybuluo.com/tangyikejun/note/23258

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注