cocos2dx坐标体系详解

来源:互联网 发布:php的就业前景好 编辑:程序博客网 时间:2024/04/30 01:59

一、OpenGL坐标系与UI坐标系

OpenGL坐标系:屏幕左下角为原点,x轴向右,y轴向上。
UI坐标系:屏幕左上角为原点,x轴向右,y轴向下。
如图所示:
OpenGL&UI

二、OpenGL坐标UI坐标间的转化

Director类中提供了这样两个方法:

//UI To OpenGLVec2 convertToGL(const Vec2& point);// OpenGL To UIVec2 convertToUI(const Vec2& point);

三、世界坐标系与本地坐标系

世界坐标系:又叫绝对坐标系。屏幕左下角为原点,x轴向右,与轴向上,遵循OpenGL坐标系。
本地坐标系:又叫相对坐标系,节点坐标系。父节点左下角为原点,x轴向右,与轴向上。
我们在实际开发中通常使用本地坐标系,cocos在绘制节点时会将本地坐标映射为世界坐标。

四、世界坐标与本地坐标间的转化

Node类中提供了以下方法:

// 世界坐标 -> 本地坐标Vec2 convertToNodeSpace(const Vec2& worldPoint) const;// 本地坐标 -> 世界坐标Vec2 convertToWorldSpace(const Vec2& nodePoint) const;// Touch对应的点 -> 本地坐标Vec2 convertTouchToNodeSpace(Touch * touch) const;// 世界坐标 -> 本地坐标(考虑锚点)Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const;// 本地坐标 -> 世界坐标(考虑锚点)Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const;// Touch对应的点 -> 本地坐标(考虑锚点)Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;

先说一下不考虑锚点的情况,如下图所示(其中,O1为屏幕左下角原点):
p1

// 假设node2Position以O1为原点的坐标Vec2 node2Position = node2->getPosition();// 调用该方法后返回以O2为原点的坐标Vec2 newPosition = node1->convertToNodeSpace(node2Position);// 假设node2Position以O2为原点的坐标Vec2 node2Position = node2->getPosition();// 调用该方法后返回以O1为原点的坐标Vec2 newPosition = node1->convertToWorldSpace(node2Position);

再解释一下考虑锚点的情况,如下图所示(其中,O1为屏幕左下角原点):
p2

// 假设node2Position以O1为原点的坐标Vec2 node2Position = node2->getPosition();// 调用该方法后返回以O2为原点的坐标Vec2 newPosition = node1->convertToNodeSpaceAR(node2Position);// 假设node2Position以O2为原点的坐标Vec2 node2Position = node2->getPosition();// 调用该方法后返回以O1为原点的坐标Vec2 newPosition = node1->convertToWorldSpaceAR(node2Position);

现在,大家应该清楚的知道了什么叫考虑锚点了吧。

五、锚点

第四小节涉及了锚点的概念,那么,什么是锚点的?

大家先考虑一个问题,我们设置子节点在父节点上的位置时:往具体的说,如之前在基础概念中设置HelloWorld图片的位置,图片这么大,究竟哪个点对应setPosition那个点呢?没错,那就是锚点,说白了,我们设置子节点在父节点中的位置,就是设置锚点在父节点中的位置。

锚点注意的地方:
1、影响节点的缩放、旋转,具体可自己尝试。
2、锚点的Position的两个参数为0~1之间的数,(0.5, 0.5)表示中心点。
3、通常Node的子类如(Layer,Sprite)的默认锚点为(0.5, 0.5)。
4、Scene与Layer默认忽略锚点。

// 此为cocos2d-x中Layer部分源代码_ignoreAnchorPointForPosition = true;setAnchorPoint(Vec2(0.5f, 0.5f));

5、节点设置忽略锚点为true后,设置其在父节点中的位置时,以左下角为准,否则以设置的锚点位置为准。

// 忽略锚点node->ignoreAnchorPointForPosition(true);

6、设置忽略锚点后,缩放和旋转节点时仍以锚点为中心。

六、ZOrder

说的简单点,ZOrder越大,显示的位置越靠前。Node类提供了两个设置ZOrder的方法:

// 本地,相对于父节点virtual void setLocalZOrder(int localZOrder);// 全局,相对于Scenevirtual void setGlobalZOrder(float globalZOrder);

至此,cocos2d-x的坐标系讲解就差不多了,掌握了这些知识,我们就可以在屏幕之中随心所欲地放置我们想要的精灵了。

0 0
原创粉丝点击