cocos2d-x 坐标辨析

cocos2d-x 坐标辨析

阅读了cocos2d的几个方法

CCPoint convertToNodeSpace(const CCPoint& worldPoint)

CCPoint convertToWorldSpace(const CCPoint& nodePoint)

CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint)

CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint)

一开始无法辨别其中的差异,阅读了cocos2d-x 坐标研究后有所启发,将自己的想法总结后记下这篇博客,作为学习记录


锚点

概念

想像一个钉子,钉在板子上,钉子上连着一条线,线的另一端连着我们的对象。那么,这个钉子就是锚点。对象的旋转,缩放等都是围绕着锚点进行

锚点位置

锚点有两种位置:

  • 对于锚点所对应的对象:

    这个位置的范围在(0,0)到 (1,1)中取。当为(0,0)时,表示锚点在对象的左下角;当为(1,1)时,表示锚点在对象的右上角。当然,为(0.5,0.5)时,锚点则在对象的中央。对于一般的元素来说,锚点默认为(0.5,0.5),对于layer,锚点默认为(0,0)。要更改这个值,需要使用方法setAnchorPoint

  • 对于对象所处的层:

    这个位置表示的就是锚点在layer的位置,决定了整个对象的位置(注意对象围绕锚点而存在)。此时使用函数setPosition 就能修改对象的位置(锚点的位置)

转化函数

谁相对谁

当你调用Layer->addChild(object)时,object的坐标系将在所在的Layer上建立,因此坐标也相对该Layer的锚点建立。当该object与其他Layer的对象进行交互时,就常常需要进行坐标的转化。举个例子,你想让老鼠移动到你想让它移动到的位置,你就得把你的坐标转为老鼠层坐标系的坐标,即相对于老鼠层的锚点进行转化。

  • ALayer -> convertToNodeSpace (location);

    将location转为相对于ALayer的坐标。假如Alayer的锚点坐标为(20,40),相对位置为(0,0)。而location(假设location不在ALayer层)的锚点位置为 (-5,-20),相对位置 (1,1),那么转化后,坐标为 (-25,-60)———> 以(20,40)为坐标系零点

  • ALayer -> convertToWorldSpace (location);

    将location转为相对于ALayer锚点的世界坐标。以上面的数据为例,转化后,结果为(15,20)。

    这个可以这样理解,因为世界坐标是固定的,ALayer的世界坐标只是在固定世界坐标的基础上做了平移,这边是(20,40),而location相对于ALayer的世界坐标也只是做了同样大小的平移而已,也就是(-5,-20)通过(20,40)做了平移,结果(15,20)

    ——–> 原来以 (20,40)为坐标系零点,现在变为以(0,0)为坐标系零点

有没有AR后缀

没有AR后缀在转化的时候,实际上是以参照物的左下角,向上,向右来建立坐标系的,而有AR后缀在转化的时候,以参照物的锚点,向上向右来建立坐标系的

所以,对于锚点的相对位置不是(0,0)的Layer来说,在使用没有AR后缀的方法时,要Layer上面对象的点的坐标全部转化为以(0,0)相对位置的锚点所对应的坐标,再进行转化

猜你喜欢

转载自blog.csdn.net/huangbx_tx/article/details/80470861