在Cocos2d-x中坐标能够分成四种:

1、GL坐标体系:GL坐标体系左下角为坐标原点,X轴向右,Y轴向上

2、UI坐标体系:UI坐标体系左上角为坐标原点,X轴向右,Y轴向上。

3、世界坐标体系:是窗体的坐标体系,它是GL坐标体系,它是左下角为坐标原点,X轴向右,Y轴向上。

4、 结点坐标体系:是Node的坐标体系,它是GL坐标体系,和世界坐标体系不同的是,它的原点是结点的左下角,

   

当一个结点调用SetPosition时,使用的參数是它的父结点(渲染树)的坐标体系

CCLayer默认大小和窗体一样,所以他的坐标体系和世界坐标体系重合

CCScene默认大小和窗体一样,所以他的坐标体系和世界坐标

创建一个精灵,在不设置精灵的坐标时,精灵的默认坐标为(0,0),使用的是Node的父类坐标体系

由于 CCLayer默认大小和窗体一样,所以他的坐标体系和世界坐标体系重合,所以以下代码的精灵位于左下角

//初始化精灵
bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png");
addChild(sprite); return true;
}

运行结果:

创建一个精灵,设置精灵的坐标为(100,100),精灵的默认坐标为(0,0),使用的是父结点坐标体系,原因和上面的一样

//初始化精灵
bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png");
addChild(sprite); //设置精灵的坐标为(100,100),结点坐标
sprite->setPosition(ccp(100, 100)); return true;
}

运行结果:

在场景中创建一个红色的背景,并在背景上创建一个精灵

//初始化精灵
bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //得到窗体的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //创建一个背景颜色为红色的背景
CCLayerColor* layerColor = CCLayerColor::create(ccc4(255, 0, 0, 255),
winSize.width/2, winSize.height/2);
addChild(layerColor); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png"); //将精灵加到红色背景上
layerColor->addChild(sprite); //设置精灵的坐标为(100,100)(是结点坐标体系)
sprite->setPosition(ccp(100, 100)); return true;
}

运行结果

程序解析:上面的代码实现了首先创建一个红色背景,然后在红色背景上添加一个精灵,再将精灵的坐标设置为(100,100),对于精灵,红色背景相当于精灵的父结点,所欲坐标原点位于红色背景的左下角,由于红色背景的坐标原点和窗体的坐标原点同和,所以精灵的位置没有发生变化

设置红色背景的坐标为(100,100)后的代码:

bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //得到窗体的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //创建一个背景颜色为红色的背景
CCLayerColor* layerColor = CCLayerColor::create(ccc4(255, 0, 0, 255),
winSize.width/2, winSize.height/2);
addChild(layerColor); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png"); //将精灵加到红色背景上
layerColor->addChild(sprite); //设置精灵的坐标为(100,100)(是结点坐标体系)
sprite->setPosition(ccp(100, 100)); //设置红色背景的坐标为(100,100)
layerColor->setPosition(ccp(100, 100)); return true;
}

运行结果:

程序解析:代码中设置了红色背景和精灵的坐标都为(100,100),由于红色背景是精灵的父类,所以红色背景的左下角为精灵的坐标原点

程序中的坐标转换:

1、UI坐标和世界坐标之间的转换

CCDirector::sharedDirector()->convertToUI();

  CCDirector::sharedDirector()->convertToGL();

2、 世界坐标和节点坐标之间的转换

  CCNode::convertToNodeSpace(CCPoint ptInWorld);

  CCNode::convertToWorldSpace(CCPoint ptInNode);

3、依照锚点为原点来进行转换的方法

  CCNode::convertToNodeSpaceAR(CCPoint ptInWorld); 这个函数返回的node坐标,是以锚点为原点

  CCNode::convertToWorldSpaceAR(CCPoint ptInNode);

4、 用touch作为參数转换

  CCNode::convertTouchToNodeSpace,直接将触摸转换成节点坐标系的坐标

实例:将精灵的结点坐标转换成世界坐标

程序代码:

bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //得到窗体的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //创建一个背景颜色为红色的背景
CCLayerColor* layerColor = CCLayerColor::create(ccc4(255, 0, 0, 255),
winSize.width/2, winSize.height/2); //将红色背景添加到层上
addChild(layerColor); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png"); //将精灵加到红色背景上
layerColor->addChild(sprite); //设置精灵的坐标为(100,100)(是结点坐标体系)
sprite->setPosition(ccp(100, 100)); //设置红色背景的坐标为(100,100)
layerColor->setPosition(ccp(100, 100)); //将精灵的坐标转为世界坐标用ptSpriteInWorld保存转换后的坐标
CCPoint ptSpriteInWorld = layerColor->convertToWorldSpace(sprite->getPosition()); //打印精灵转换后的世界坐标
CCLog("ptSpriteInWorld(%f,%f)", ptSpriteInWorld.x, ptSpriteInWorld.y); return true;
}

运行结果:编译成功红在输出中会看到转换后的坐标为(200,200)

处理触摸事件,而且显示UI坐标

程序代码:

首先在Coord.h中加入以下的代码(Coord为创建的一个场景)

#ifndef _Coord_H_
#define _Coord_H_
//防止代码重包括 #include "cocos2d.h"
USING_NS_CC; class Coord : public CCLayer
{
public: //创建一个场景
static CCScene* scene(); //初始化场景
bool init(); //菜单回调函数
void menuCloseCallback(CCObject* pSender); //响应触摸处理事件
bool ccTouchBegan(CCTouch*, CCEvent*); CCSprite* _sprite; //用于创建创建、精灵、或者层(同create())
CREATE_FUNC(Coord);
}; #endif

然后在Coord.cpp中加入以下的代码

#include "Coord.h"
#include "HelloWorldScene.h" CCScene* Coord::scene()
{
CCScene *scene = CCScene::create(); CCLayer *layer = Coord::create(); scene->addChild(layer); return scene;
} bool Coord::init()
{
//先调用父类的init函数
CCLayer::init(); //得到窗体的尺寸
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //创建一个背景颜色为红色的背景
CCLayerColor* layerColor = CCLayerColor::create(ccc4(255, 0, 0, 255),
winSize.width/2, winSize.height/2); //将红色背景添加到层上
addChild(layerColor); //创建一个精灵
CCSprite* sprite = CCSprite::create("CloseNormal.png"); //将精灵赋值给全局变量
_sprite = sprite; //将精灵加到红色背景上
layerColor->addChild(sprite); //设置精灵的坐标为(100,100)(是结点坐标体系)
sprite->setPosition(ccp(100, 100)); //设置红色背景的坐标为(100,100)
layerColor->setPosition(ccp(100, 100)); //将精灵的坐标转为世界坐标用ptSpriteInWorld保存转换后的坐标
CCPoint ptSpriteInWorld = layerColor->convertToWorldSpace(sprite->getPosition()); //打印精灵转换后的世界坐标
CCLog("ptSpriteInWorld(%f,%f)", ptSpriteInWorld.x, ptSpriteInWorld.y); // 加一个触摸处理,来演示UI坐标和GL坐标的转换
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne); return true;
} //响应触摸处理事件
bool Coord::ccTouchBegan(CCTouch* touch, CCEvent*)
{
//得到触摸点的UI坐标
CCPoint ptInUI = touch->getLocationInView(); //得到触摸点的世界坐标
CCPoint ptInGL = touch->getLocation(); //将UI坐标转换为GL坐标
CCPoint ptUIConvert = CCDirector::sharedDirector()->convertToGL(ptInUI); //打印触摸点的UI坐标
CCLog("ptInUI(%f, %f)", ptInUI.x, ptInUI.y); //打印触摸点的GL坐标
CCLog("ptInGL(%f, %f), ptConvert(%f, %f)", ptInGL.x, ptInGL.y, ptUIConvert.x, ptUIConvert.y); //获取精灵所在的矩形
CCRect rc = _sprite->boundingBox(); // _sprite->getParent()->convertToNodeSpace(touchPoint) 将touch转换成精灵的父节点的坐标体系内的坐标点
//if (rc.containsPoint(_sprite->getParent()->convertToNodeSpace(touchPoint))) if (rc.containsPoint(_sprite->getParent()->convertTouchToNodeSpace(touch)))
{
CCLog("Oh I am touched");
} return true;
}

运行结果:

1、当鼠标点击红色矩形框中的精灵时(提示触摸到了精灵)

2、当鼠标没有点击精灵时

Cocos2d-X中的坐标系的更多相关文章

  1. cocos2d-x 中的坐标系

    cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...

  2. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

  3. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  4. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. 如何在Cocos2D游戏中实现A*寻路算法(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  6. ArcGIS中的坐标系:基本概念和常用操作(一)

    本文呢是主要是借鉴李郎平李大大的博士论文和百度百科,里面还有一点点我自己的理解,希望能帮助自己加深对于坐标系的认识. 李大大的博客:http://blog.sciencenet.cn/u/Brume ...

  7. HTML中的坐标系及其在MouseEvent和元素Box中的应用

    HTML中的坐标系及其在MouseEvent和元素中的应用 HTML有四个坐标系统: Screen, Page,Client和offset, 用于描述DOM元素的Box尺寸和MouseEvent中的位 ...

  8. c# winform 中的坐标系

    从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Siz ...

  9. 4.three.js中的坐标系

    Three.js中的坐标系 three.js中坐标系使用的是左手坐标系 左手坐标系和右手坐标系的对比: 当然three.js中使用的是右手坐标系 three.js中的旋转的定义 但是three.js中 ...

  10. Halcon中的坐标系特点及XLD的镜像转换

    我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角.那么Halcon中坐标系和一般的二维坐标系有什么区别呢?我通过下面这个例子来分析. gen_image_const ...

随机推荐

  1. ACM:回溯,八皇后问题,素数环

    (一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...

  2. [TroubleShooting]&#39;trn\bak&#39; is incorrectly formed. SQL Server cannot process this media family.

     SQL Server online consultants came across an interesting scenario where one of our client was una ...

  3. 谈谈Linux内存释放

    上上周吧,一个朋友问我说他公司的服务器内存free 为0 是为什么,意思大概是内存去哪了,这引发了一个小小的讨论,也就是内存释放的问题… 首先我们可能会用free 去查看内存的使用率,它应该是这样的 ...

  4. 关闭 sqlserver提示信息

  5. Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...

  6. iOS8推送消息的回复处理速度

    iOS8我们有一个新的通知中心,我们有一个新的通报机制.当在屏幕的顶部仅需要接收一个推拉向下,你可以看到高速接口,天赋并不需要输入应用程序的操作.锁定屏幕,用于高速处理可以推动项目. 推送信息,再次提 ...

  7. 国内三大PTPrivate Tracker站分析

    除这一行外,下面全部内容都是转载.出处不明. 国内三大PT(Private Tracker)站分析 先郑重的声明一下:本文以下的内容所有是复制粘贴的,不代表老夫的观点. 事实上内容我也没细致看. 贴这 ...

  8. c#操作appsettiongs

    try { //指定要修改的配置文件的路径 Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWe ...

  9. Oracle DG故障诊断一则:alter database recover to logical standby new_logical_dbname卡住

    我们在基于物理standby的基础上搭建逻辑备库过程过程中,在运行: alter database recover to logical standby READDB; 卡住不动,而且alert也没有 ...

  10. 制作service服务,shell脚本小例子(来自网络)

    事先准备工作:源码安装apache .安装目录为/usr/local/httpd 任务需求:1.可通过 service httpd start|stop|status|restart 命令对服务进行控 ...