cocos2d-x坐标系详解
cocos2d-x官方文档
笛卡尔坐标系
不同坐标系简介
笛卡尔坐标系
你可能上学的时候就已经知道“笛卡尔坐标系”了,它在几何课本里经常用到。如果你已经忘得差不多了,下面这些图片可以很快唤起你的记忆:

在移动游戏开发过程中,有三种类型的坐标系你可能遇到:
UI坐标系
iOS/Android/Windows SDK中的通用UI坐标系:
- 起点坐标(x=0, y=0)位于左上角
- X轴从屏幕最左边开始,由左向右渐增
- Y轴坐标从屏幕最上方开始,由上向下渐增
详见下图

Direct3D坐标系
DirectX 使用Left-handed Cartesian Coordinate
OpenGL和Cocos2d坐标系
Cocos2d-x/-html5/-iphone使用的坐标系和OpenGL的坐标系一样,名为“Right-handed Cartesian Coordinate Syste”。

在2D世界中,我们仅会使用x轴和y轴。所以在你的cocos2d游戏中:
- 起点坐标(x=0, y=0)位于左下角,这意味着屏幕位于
- X轴从屏幕最左边开始,由左向右渐增
- Y轴坐标从屏幕最下方开始,由下向上渐增
下面这张图片有助于更好的阐述Cocos2d-x坐标:

一定要注意:通用UI坐标系和DirectX坐标系是不一样的。
Parent and Childrens
由于每个类都继承自CCNode(cocos2d-x的最顶层类),所以每个类都会默认有anchorPoint属性。 当我们在一个位置画一个的对象的时候,cocos2d-x会合并属性位置和anchorPoint。当然,当旋转一个对象时,cocos2d-x会围绕绕anchorPoint旋转的。
我们创建一个灰色父对象和一个蓝色子对象。设置父对象位置是ccp(100,100),子对象的anchor point位于圆心。
CCSprite* parent = CCSprite::create("parent.png");
parent->setAnchorPoint(ccp(0, 0));// Anchor Point
parent->setPosition(ccp(100, 100));
parent->setAnchorPoint(ccp(0, 0));
addChild(parent);
//create child
CCSprite* child = CCSprite::create("child.png");
child->setAnchorPoint(ccp(0.5, 0.5));
child->setPosition(ccp(0, 0));
parent->addChild(child);//add child sprite into parent sprite.
由于我们设置子对象的位置是ccp(0,0),父对象位置是ccp(100,100)。所以,子对象位置是:

锚点
作为例子,下面这个精灵有的锚点位于 ccp(0,0),位置位于ccp(0,0)。

这个矩形精灵将被放到它的父对象(layer)的左下角。
示例:
// create sprite
CCSprite* sprite = CCSprite::create("bottomleft.png");
sprite->setAnchorPoint(ccp(0, 0));// Anchor Point
sprite->setPosition(ccp(0,0));
addChild(sprite);

在另一个例子中,我们会摆放一个坐标为ccp(0.5,0.5)的anchorPoint,以便您更好的理解锚点的相对值。

// create sprite
CCSprite* sprite = CCSprite::create("center.png");
sprite->setAnchorPoint(ccp(0.5, 0.5));// Anchor Point
sprite->setPosition(ccp(0,0));
addChild(sprite);

正如你从图中看出的,锚点取的不是像素值,此值的X和Y是相对于此节点的大小的。
获取可视区域大小, 获取可视区域起点 vs 获取窗口大小
VisibleSize(可视区域大小)会返回此点的OpenGL视图的可视区域大小。如果没有调用CCEGLView::setDesignResolutionSize()的话,此值等于getWinSize的大小。 getVisibleOrigin(获取可视区域起点)会返回此点的OpenGL视图的可视区域起点。请移步Multi resolution support查看详情。
如何转换坐标
convertToNodeSpace:
举例,convertToNodeSpace用于tile-based的游戏,即有一个大地图。convertToNodeSpace会转换openGL触摸点转成.tmx 地图或者其他近似的坐标。
例子:
下面的图片会展现,node1的锚点(0,0),node2的锚点是(1,1)。
我们会调用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 转换node2的屏幕坐标为node1的位置。结果是,node2的位置是(-25,-60).

convertToWorldSpace:
convertToWorldSpace(常量 CCPoint& nodePoint) 转换node坐标为SCREEN坐标。convertToWorldSpace会经常返回你的精灵的SCREEN位置,如果你想捕获精灵的taps而且需要移动/缩放layer的时候,这可能非常有帮助。
CCPoint point = node1->convertToWorldSpace(node2->getPosition());
上面的代码会转换node2坐标为node2在屏幕上对应的坐标。

convertToWorldSpaceAR
convertToWorldSpaceAR返回相对锚点的位置:所以如果你的场景 - 根layer有一个锚点位于ccp(0.5f, 0.5f)。- 默认的,convertToNodeSpaceAR应返回相对于屏幕中心的位置。
convertToNodeSpaceAR - 和convertToWorldSpaceAR是一样的逻辑。
示例代码:
CCSprite *sprite1 = CCSprite::create("CloseNormal.png");
sprite1->setPosition(ccp(20,40));
sprite1->setAnchorPoint(ccp(0,0));
this->addChild(sprite1);
CCSprite *sprite2 = CCSprite::cteate("CloseNormal.png");
sprite2->setPosition(ccp(-5,-20));
sprite2->setAnchorPoint(ccp(1,1));
this->addChild(sprite2);
CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
CCLog("position = (%f,%f)",point1.x,point1.y);
CCLog("position = (%f,%f)",point2.x,point2.y);
CCLog("position = (%f,%f)",point3.x,point3.y);
CCLog("position = (%f,%f)",point4.x,point4.y);
结果:
position = (-25.000000,-60.000000) position = (15.000000,20.000000) position = (-25.000000,-60.000000) position = (15.000000,20.000000)
cocos2d-x坐标系详解的更多相关文章
- Cocos2d-x 3.0坐标系详解(转载)
Cocos2d-x 3.0坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenG ...
- ArcGIS中的北京54和西安80投影坐标系详解
ArcGIS中的北京54和西安80投影坐标系详解 1.首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为地理 ...
- CGJ02、BD09、西安80、北京54、CGCS2000常用坐标系详解
一.万能地图下载器中的常用坐标系 水经注万能地图下载器中的常用的坐标系主要包括WGS84经纬度投影.WGS84 Web 墨卡托投影.WGS84 UTM 投影.北京54高斯投影.西安80高斯投影.CGC ...
- [转]地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系
转自:http://www.rivermap.cn/docs/show-1829.html 常用坐标系详解 (一)WGS84坐标系 WGS-84坐标系(World Geodetic System一19 ...
- (6)Cocos2d-x 3.0坐标系详解
Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系. 屏幕坐标系和 ...
- pyqt-QGrapicsView 坐标系详解
PTQT——GraphicsView框架 转载 原网址 http://blog.51cto.com/9291927/1879128 一.GraphicsView框架简介 QT4.2开始引入了Graph ...
- ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。
convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中.重点说明:基于... 不一定要是真实的, convertToWorldSpace 的结果也只是一个新 ...
- OpenCV相机标定坐标系详解
在OpenCV中,可以使用calibrateCamera函数,通过多个视角的2D/3D对应,求解出该相机的内参数和每一个视角的外参数. 使用C++接口时的输入参数如下: objectPoints - ...
- Unity坐标系详解
1. World Space(世界坐标系): 我们在场景中添加的物体(如:Cube),他们都是以世界坐标显示在场景中.transform.position 获取的便是这个 坐标数值. 2. Scene ...
随机推荐
- MySQL 事物和数据库锁
1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一 ...
- hdu 4445 Crazy Tank(物理过程枚举)
遇到物理题,千万不要一味的当成物理题去想着推出一个最终结果来,这样ACM竞赛成了物理比赛,出题人就没水平了...往往只需要基础的物理分析,然后还是用算法去解决问题.这题n小于等于200,一看就估计是暴 ...
- Number Sequence (KMP的应用)
个人心得:朴素代码绝对超时,所以要用到KMP算法,特意了解了,还是比较抽象,要多体会 Given two sequences of numbers : a11, a22, ...... , aNN, ...
- 下载安装jdk
阿里云服务器部署第一步:下载-安装jdk 1.下载路径:http://www.oracle.com/ 2.通过windows远程桌面连接上服务器:连接方式: 然后在服务器上c:/user/下创建jav ...
- (C#)Windows Shell 外壳编程系列5 - 获取图标
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 有 ...
- bzoj 5092 [Lydsy1711月赛]分割序列——高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一个前缀异或和,就变成 f[ i ]=max_{j=0}^{i} { s[ j ...
- maven工程编译成jar包
在pom文件的project节点下增加build节点,mvn package即可 <build> <plugins> <plugin> <artifactId ...
- unix下网络编程之I/O复用(三)
poll函数 在上文unix下网络编程之I/O复用(二)中已经介绍了select函数的相关使用,本文将介绍另一个常用的I/O复用函数poll.poll提供的功能与select类似,不过在处理流设备时, ...
- POJ1063Cable master(二分搜索)
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36288 Accepted: 7743 Des ...
- FileStream 常用的属性和方法
FileStream常用的属性和方法 (转) 对流进行操作时要引用 using System.IO; 命名空间 FileStream常用的属性和方法: 属性: CanRead 判断当前流是否支持读取, ...