cocos2dx坐标体系详解
来源:互联网 发布:php的就业前景好 编辑:程序博客网 时间:2024/04/30 01:59
一、OpenGL坐标系与UI坐标系
OpenGL坐标系:屏幕左下角为原点,x轴向右,y轴向上。
UI坐标系:屏幕左上角为原点,x轴向右,y轴向下。
如图所示:
二、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为屏幕左下角原点):
// 假设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为屏幕左下角原点):
// 假设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的坐标系讲解就差不多了,掌握了这些知识,我们就可以在屏幕之中随心所欲地放置我们想要的精灵了。
- cocos2dx坐标体系详解
- cocos2dx 坐标系统详解
- cocos2dx 坐标系统详解
- cocos2dx 坐标系统详解
- cocos2dx 坐标系统详解
- 坐标体系
- 坐标体系
- cocos2dx坐标
- Cocos2DX坐标
- 地图坐标体系 简介
- VC 坐标体系
- OpenGL中坐标体系
- OpenCV坐标体系
- Cocos坐标体系
- java--绘图坐标体系
- android - 坐标体系图
- 【java】绘图坐标体系
- View坐标体系
- 数据库复习(1)
- Nexus私服的安装和配置
- 跟我一起写shell补全脚本(Zsh篇)
- ES6入门——Set和Map数据结构
- scala 叠加在一起的特质 举例
- cocos2dx坐标体系详解
- 敏捷故事 4小时产品上线
- 线程(七)CallableAndFuture
- Oracle中导出一条记录的SQL
- ES6入门 —— Class和Module
- App推广平台有哪些
- 进程与线程之间的关系与区别分析
- 剑指offer——斐列那契数列(递归)
- 16.7.3菲波那契数列