在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. 再见,CSDN

    这是第三次的博客, 首先是从百度改变自己 从他的变化二CSDN 看看多年的积累, 真的不想,但CSDN搜电缆和编辑(新MarkDown更烂)实在不敢恭维 再见CSDN, 新的博客 http://my. ...

  2. 【原创】leetCodeOj --- Sliding Window Maximum 解题报告

    天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...

  3. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  4. C# Out和Ref区别

    rel是有进有出,out是只出不进 ref 要求参数在传递给函数前要初始化,out则不需要

  5. Cocos2d-x实现简单的翻牌效果

    触发器互联网影响找了很多.有自己的点重写一个复杂的sprite类来实现.简单的操作来对引擎的使用CCOrbitCamera实现,但是,也存在一些问题,后变反了. 我在用的仅仅是一个简单的翻牌效果,点击 ...

  6. Xamarin.Android 入门实例(4)之实现对 SQLLite 进行添加/修改/删除/查询操作

    1.Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  7. HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)

    pid=4508">http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n開始,表示每天的食物清 ...

  8. poj 2288 Islands and Bridges

    题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目: 其中权值计算方法是  列如 ABCD  权值是a+b+c+d+ab+bc+cd 如果 A,B,C  和B ...

  9. 【Web探索之旅】第二部分第四课:数据库

    内容简介 1.第二部分第四课:数据库 2.第二部分第五课预告:响应式网站 第二部分第四课:数据库 说到“数据库”,顾名思义,是“数据的仓库”的意思. 所以数据库的一大作用就是储存数据咯. 为什么Web ...

  10. 交换A与B值的四种方法

    在网上看到了这样一道面试题,"int A=5,int B=2,怎样交换A与B的值",或许这是一道简单到不能再简单的题,但能作为一道面试题,肯定有其独特之处 大多数人会通过定义第三个 ...