CCPoint convertToNodeSpace(const CCPoint& worldPoint);
CCPoint convertToWorldSpace(const CCPoint& nodePoint);
CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);
CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);
在理解这个之前,要多世界坐标和本地坐标有一定的理解,
GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。

屏幕坐标系苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。

世界坐标系也叫做绝对坐标系,cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。世界坐标系和GL坐标系一致,原点在屏幕左下角,

本地坐标系本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。比如用cocos2d-x创建了个矩形colorLayer:CCRect(10,10,100,100),这是的本地坐标系为以(10,10)为坐标原点,x轴向右,y轴向上。如果创建了一个CCSprite,锚点为(0.5,0.5),位置为(100,100),size为(40,40),这时的本地坐标系为以(80,80)为坐标原点,x轴向右,y轴向上。总之,本地坐标系原点为node的左下角坐标

接下来,convertToNodeSpace:调用CCPoint point = node1->convertToNodeSpace(node2->getPosition());

将node2的坐标转化成相对于node1的本地坐标

,

比如坐标如上图所示,node1的锚点为(0,0),node2的锚点为(1,1),转化之后,node的坐标变成了(-25,-60)
而convertToWorldSpace:调用CCPoint point = node1->convertToWorldSpace(node2->getPosition());
是将node的坐标转化成相对于node1的世界坐标,如上图所示:首先将node1的坐标当做世界坐标,然后让node2的坐标位置重置成相对于node1的世界坐标,也就是(15,20)
 
convertToNodeSpaceAR,就是把node1的坐标系原点设置在锚点的位置,这里的锚点是(0,0)所以转化之后的坐标系位置和上面的convertToNodeSpace一样,结果也是一样的,convertToWorldSpaceAR同理
 
 
测试:
CCSprite *sprite1 = CCSprite::spriteWithFile("CloseNormal.png");
sprite1->setPosition(ccp(20,40));
sprite1->setAnchorPoint(ccp(0,0));
this->addChild(sprite1);
CCSprite *sprite2 = CCSprite::spriteWithFile("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)

和预算的一样
这里在将sprite1的锚点设置成(0.5,0.5),对convertToNodeSpaceAR和convertToWorldSpaceAR进行了进一步的测试
sprite1->setAnchorPoint(ccp(0.5,0.5));
sprite1->setPosition(ccp(100,100));
CCPoint point5 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
CCPoint point6 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
CCLog("position = (%f,%f)",point5.x,point5.y);
CCLog("position = (%f,%f)",point6.x,point5.y);
运算结果:
size = (40.000000,40.000000)
position = (-105.000000,-120.000000)
position = (95.000000,80.000000)

分析:重置的sprite1的坐标为(100,100),锚点为(0.5,0.5)所以对于convertToNodeSpaceAR和convertToWorldSpaceAR这两个方法的坐标系为原点(100,100),所以用convertToNodeSpaceAR转化之后的坐标为(-105,-120)用convertToWorldSpaceAR化之后的坐标为(95,80) 

文章来自网络资源:http://blog.163.com/zjf_to/blog/static/201429061201292193855498/

 

上一页 1... -1-1-1-1-1-1-1... -1下一页

转载于:https://www.cnblogs.com/zhidao-chen/archive/2013/03/21/2974538.html

cocos2d-x坐标系相关推荐

  1. UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView

    « 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的 ...

  2. cocos2d-x学习笔记(持续更新)

    接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 粒子系统设计工具:Particle Designer软件  目前只支持MAC平台 导出 plist文件 地图设计工具:Tile ...

  3. 转载了别人的cocos2d-x的学习笔记

    接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 粒子系统设计工具:ParticleDesigner软件目前只支持MAC平台导出plist文件 地图设计工具:Tiles目前有两 ...

  4. Box2D物理引擎入门

    一.什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto早在2007年用C++语言开发. Box2D集成了大量的物理力学和运动学的计算,并将 ...

  5. Android面试,给正在找工作的安卓攻城师们 ... ...

    从java基础技能到安卓进阶技能,有你想象不到的全面. ☆  JAVA技能 « 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是 ...

  6. Android开发面试经典题目

    下面是整理的Android知识点,可以平时巩固知识点,仅供复习使用. ☆  JAVA技能 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说 ...

  7. 游戏开发实战之弹球游戏

    文/Steffen Itterheim.Andreas Löw 为了更好地使用Box2D物理引擎,本文我们将制作一个真实的弹球游戏.弹球游戏桌利用各种物理世界的效果来创造有趣的体验.然而,在使用物理引 ...

  8. Box2D 物理引擎入门

    转自:https://www.jianshu.com/p/7681431618ec 一.什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto ...

  9. 可耻的转载了别人的cocos2d-x的学习笔记

    原文:http://blog.csdn.net/we000636/article/details/8263503 接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 粒子系统设计 ...

  10. linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)

    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏. 提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等.Cocos2d集成了两款常用的物理引擎:Box2D和Chipmunk,两款引擎都是 ...

最新文章

  1. java post 500_Post请求form-data格式时请求返回500的问题
  2. 用Python实现OpenCV特征提取与图像检索 | Demo
  3. Spring boot 如何读取配置文件properties中的信息
  4. numpy a[...,:2]
  5. 使用 mitmproxy + python 做拦截代理
  6. dbf文件怎么创建_ThinkPHP6开发博客实战入门(三),创建admin后台入口
  7. 【Java】Eclipse输入命令行参数的方法
  8. amazeui学习笔记--css(基本样式2)--基础设置Base
  9. VS2012:出现devenv.sln解决方案保存对话框
  10. 从开发到生产上线,如何确定集群大小?
  11. 2022年定位系泊系统市场深度分析及发展研究预测报告
  12. 五款好用的项目进度管理甘特图软件,总有一款能满足你的需求
  13. OPNsense - 多功能高可靠易使用的防火墙(五)
  14. MATLAB图形用户界面设计(GUI)
  15. 委托、事件 茴字有几种写法
  16. 使用Python读取Windows注册表
  17. selenium登录163邮箱,得到cookie,requests后续请求
  18. 安徽省毫州市谷歌卫星地图下载(百度网盘离线包下载)
  19. 【python pypy】pypy安装
  20. otg线是什么,otg线和数据线的区别介绍

热门文章

  1. mse函数(均方误差函数)
  2. DF以某一列的元素筛选其中属于某个集合的元素的所有行(2个版本函数)
  3. Matlab 牛顿方法求解方程
  4. Jupyter Notebook 使用小记
  5. 企业——memcache对PHP页面的缓存加速优化
  6. Android 应用程序之间内容分享详解(二)
  7. Linux下服务器模型 【转载】
  8. UA MATH563 概率论的数学基础 中心极限定理15 Kolmogorov 0-1律
  9. UA SIE545 优化理论基础4 对偶理论简介1 松弛问题与Lagrange对偶
  10. UA MATH566 统计理论1 充分统计量例题答案1