quick-cocos2d-x坐标体系与锚点

笛卡尔右手坐标系:原点在左下角,x轴向右,y轴向上,z轴向外,OpenGL与Cocos2d-x坐标系都为笛卡尔右手坐标系。

OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。

Cocos2d-x坐标系:与OpenGl坐标系一样。

屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下。IOS、Android、Windows Phone开发应用时候都使用标准屏幕坐标系。

世界坐标:也叫做绝对坐标,世界指的是游戏世界,世界坐标与OpenGL坐标方向一致。

本地坐标:是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联的坐标系将随之移动或改变方向。每个节点都有独立的坐标系。我们通过Node的setPosition设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系

    游戏中Scene、Layer与Sprite对象中坐标原点都为左下角;子节点添加到父节点时候,参考父节点对象的左下角,与父节点锚点没关系;子节点在父节点中的位置与子节点的锚点有关系。

    通过触摸得到的坐标是世界坐标。判断是否触摸到某目标的时候,onTouchBegan函数可以获得世界坐标系下的触摸坐标,通过convertToNodeSpace函数转会为节点坐标,最后进行判断。

锚点:将一个节点添加到父节点里时,需要设置其在父节点上的位置,本质上是设置节点的锚点在父坐标系上的位置。

    Anchor Point的两个参数都在0~1之间。它们表示的并不是像素点,而是乘数因子。(0.5, 0.5)表示Anchor Point位于节点长度乘0.5和宽度乘0.5的地方,即节点的中心。

    在Cocos2d - x中CCLayer的Anchor Point为默认值(0, 0),其他Node的默认值为(0.5, 0.5)。


忽略锚点:

    Ignore Anchor Point全称是ignoreAnchorPointForPosition,作用是将锚点固定在一个地方。
    如果设置其值为true,则图片资源的Anchor Pont固定为左下角,否则即为所设置的位置

世界坐标与本地坐标转换:

CCNode中提供了本地坐标与世界坐标转换的方法,CCNode中部分相关代码如下:

用法详解:

1)convertToNodeSpace:用于将一个世界坐标转换到该元素的本地坐标系中。

node2->convertToNodeSpace(node1->getPosition);

    以参照物的左下角作为坐标点原点,向右和向上创建坐标系。

    结合代码意思是:node2不是node1的父节点,把node1坐标转换为以node2的坐下角为坐标原点的坐标。

2)convertToNodeSpaceAR:把世界坐标转换为基于锚点的窗口内的坐标。

node2->convertToNodeSpaceAR(node1->getPosition);

    以参照物的锚点为原点,向右、向上创建坐标系。

    结合代码的意思是:node2不是node1的父节点,把node1坐标转换为以node2的锚点为坐标原点,向左向上坐标系中的坐标。

3)convertToWorldSpace:用于把一个本地坐标系中的位置转换为世界坐标系中,通常父元素可以通过此方法计算一个子元素的世界坐标。

nodeParent->convertToWorldSpace(node->getPosition());

    需要转换坐标的对象的父类对象调用convertToWorldSpace,参数是对象的坐标点(相对于父类的坐标点),返回的是世界坐标。

    以参照物的左下角作为坐标点原点,向右和向上创建坐标系。

    结合代码的意思:node的父节点为nodeParent,node的坐标参考nodeParent左下角坐标原点,转换为世界坐标。

例:判断子弹是否飞出了屏幕,但是子弹是在地图层的,地图又在gameLayer层上,bullet->getPosition() 得到的位置是相对父结点的,即地图层下的局部坐标。

posBullet = (bullet->getParent())->convertToWorldSpace(bullet->getPosition());

4)convertToWorldSpaceAR:该方法用于计算以该元素锚点为原点的坐标系中的某个位置的世界坐标。

nodeParent->convertToWorldSpaceAR(node->getPosition());

    以参照物的锚点为原点,向右、向上创建坐标系。

    结合代码的意思:node的父节点为nodeParent,node的坐标是以nodeParent的锚点为坐标原点向右向上坐标系的坐标,转化为世界坐标。
 

总结:没有AR后缀的函数参考左下角的坐标进行转换;而有AR后缀的函数参照锚点为坐标系原点进行转换。

猜你喜欢

转载自blog.csdn.net/Super_Cola/article/details/81315875