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)。所以,子对象位置是:

![](http://www.cocos2d-x.org/attachments/1559/parent.jpeg)

锚点

作为例子,下面这个精灵有的锚点位于 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坐标系详解的更多相关文章

  1. Cocos2d-x 3.0坐标系详解(转载)

    Cocos2d-x 3.0坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenG ...

  2. ArcGIS中的北京54和西安80投影坐标系详解

    ArcGIS中的北京54和西安80投影坐标系详解 1.首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为地理 ...

  3. CGJ02、BD09、西安80、北京54、CGCS2000常用坐标系详解

    一.万能地图下载器中的常用坐标系 水经注万能地图下载器中的常用的坐标系主要包括WGS84经纬度投影.WGS84 Web 墨卡托投影.WGS84 UTM 投影.北京54高斯投影.西安80高斯投影.CGC ...

  4. [转]地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系

    转自:http://www.rivermap.cn/docs/show-1829.html 常用坐标系详解 (一)WGS84坐标系 WGS-84坐标系(World Geodetic System一19 ...

  5. (6)Cocos2d-x 3.0坐标系详解

    Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系. 屏幕坐标系和 ...

  6. pyqt-QGrapicsView 坐标系详解

    PTQT——GraphicsView框架 转载 原网址 http://blog.51cto.com/9291927/1879128 一.GraphicsView框架简介 QT4.2开始引入了Graph ...

  7. ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

    convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中.重点说明:基于...   不一定要是真实的,  convertToWorldSpace 的结果也只是一个新 ...

  8. OpenCV相机标定坐标系详解

    在OpenCV中,可以使用calibrateCamera函数,通过多个视角的2D/3D对应,求解出该相机的内参数和每一个视角的外参数. 使用C++接口时的输入参数如下: objectPoints - ...

  9. Unity坐标系详解

    1. World Space(世界坐标系): 我们在场景中添加的物体(如:Cube),他们都是以世界坐标显示在场景中.transform.position 获取的便是这个 坐标数值. 2. Scene ...

随机推荐

  1. nginx基本参数详解

    运行用户 user nobody; 启动进程,通常设置成和cpu的数量相等 worker_processes 1; 全局错误日志及PID文件 error_log logs/error.log; err ...

  2. Java_脚本引擎_03_nashorn支持es6

    一.前言 jdk1.8的nashorn 支持部分es6语法. 二.支持es6 jdk默认是关闭了对es6的支持的,想要开启对es6的支持,需要设置一下jvm参数: -Dnashorn.args=--l ...

  3. 剑指offer--3.用两个栈实现队列

    快速刷一遍,先捏软柿子 ----------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度 ...

  4. git教程3-添加远程库与从远程库拷贝

    一.添加到github 1.github上创建新的库learngit.git 2.git remote add origin git@github.com:moisiet/learngit.git  ...

  5. Git 版本管理工具(一)

    转自:http://blog.csdn.net/ithomer/article/details/7527877 Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介 ...

  6. linux下查找命令两则

    由于本人不会阅读man手册,因此需要几下两个常用的查找命令: (1)在某个目录及其子目录查找某个文件并打印完整路径: find ./ -name "assertions.h" -e ...

  7. Centos下安装禅道

    1.下载禅道安装包:http://dl.cnezsoft.com/zentao/9.7/ZenTaoPMS.9.7.stable.zbox_64.tar.gz 2.将下载的压缩包解压到/opt目录下: ...

  8. 如何安装搜索引擎Elasticsearch?

    最近工作中要用到搜索引擎,由于目前用的搜索引擎是LeanCloud 提供的 ,不太好用,不支持范围等搜索,而且每天还收费30元,请求次数也有限制.基于这些原因,我们只好在自己的服务器上部署搜索引擎了. ...

  9. 一般处理程序+html 的CRUD

    using Console_Core.BLL; using Console_Core.Common; using Console_Core.Model; using System; using Sys ...

  10. JSF拦截ajax请求并传递参数方法

    我们可以利用f:ajax做一些简单的ajax操作,但是遇到复杂的逻辑,它不能简单的去实现,jsf提供了一种方法,可以调用它内部的js方法去实现复杂的逻辑. 首先要在页面引入jsf的js文件: < ...