《转载》深入理解 cocos2d-x 坐标系
原文地址:http://www.cnblogs.com/lyout/p/3292702.html。
首先我们添加两个测试精灵(宽:27,高:40)到场景里面:
CCSprite *sprite1 = CCSprite::create( "player.png" ); sprite1->setPosition(ccp(20, 40)); sprite1->setAnchorPoint(ccp(0, 0)); this ->addChild(sprite1); CCSprite *sprite2 = CCSprite::create( "player.png" ); sprite2->setPosition(ccp(-15, -30)); sprite2->setAnchorPoint(ccp(1, 1)); this ->addChild(sprite2); |
然后调试,在场景中大概是下图这样显示(以左下角为坐标原点,从左到右为x方向,从下到上为y方向,废话了:)):
在cocos2d-x中,每个精灵都有一个锚点,以后对精灵的操作(比如旋转)都会围绕锚点进行,我们暂且可以看作是精灵的中心位置,一般来说有每个方向有三种可能的值:0,0.5,1。上图中红色圆点即为各自的锚点,sprite1 锚点为 (0,0) 左下角,sprite2锚点为(1,1)在右上角。
现在我们来看看坐标系转换,同样地,我们先写点测试代码:
CCPoint p1 = sprite2->convertToNodeSpace(sprite1->getPosition()); CCPoint p2 = sprite2->convertToWorldSpace(sprite1->getPosition()); CCPoint p3 = sprite2->convertToNodeSpaceAR(sprite1->getPosition()); CCPoint p4 = sprite2->convertToWorldSpaceAR(sprite1->getPosition()); |
接着,再打印出各点的x,y值:
CCLog( "p1:%f,%f" , p1.x, p1.y); CCLog( "p2:%f,%f" , p2.x, p2.y); CCLog( "p3:%f,%f" , p3.x, p3.y); CCLog( "p4:%f,%f" , p4.x, p4.y); |
现在开始分析这四个常用坐标系转换函数转换后的值(有兴趣的同学可以先算一算)。
由于cocos2d-x的坐标系(本地坐标系)是以左下角为坐标原点的,所以 sprite1和sprite2的坐标原点在上图的位置分别是(20,40)、(-42,-70),那么很明显的:
p1就是sprite1锚点相对于sprite2原点来说在sprite2坐标系中的位置,经过对比上图,我们可以得到(20-(-42),40-(-70))即(62,110)
p2就是sprite1锚点相对于sprite2原点来说在上图坐标系中的位置,这样我们可以计算出sprite1在sprite2坐标系中的位置:(20+(-42),40+(-70)),即(-22,-30)
p3就是sprite1锚点相对于sprite2锚点来说在sprite2坐标系中的位置,也就是(20-(-15),40-(-30)),即(35,70)
p4就是sprite1锚点相对于sprite2锚点来说在上图坐标系中的位置,也就是(20+(-15),40+(-30)),即(5,10)
现在我们可以知道,计算方法都是用sprite1的坐标去加减sprite2的坐标,针对本地坐标系就用减法,针对世界坐标系就用加法。
好了,方法出来了,有兴趣的可以做计算一下以下几个坐标的值(先不要上机调试):
CCPoint p1 = sprite1->convertToNodeSpace(sprite2->getPosition()); CCPoint p2 = sprite1->convertToWorldSpace(sprite2->getPosition()); CCPoint p3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition()); CCPoint p4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition()); |
最新文章
- SQL基本语句汇总
- selenium结合最新版的sikuli使用
- [原创]VM虚拟机Centos6.4网络配置。
- 递归函数的用法及array_merge的用法
- 配置Python+selenium+firefox自动化测试
- 浏览器使用ActiveX控件
- 数字图像处理-----主成成分分析PCA
- Linux更换python版本 (转载)
- PoolBoy
- Content Provider 小结
- java集合练习
- CentOS 下做端口映射/端口转发
- kafka简单回顾
- DDD「领域驱动设计」分层架构初探
- vue SSR : 原理(一)
- spring 循环依赖问题
- 移动端三合一瀑布流插件(原生JS)
- Android——事务
- PHP 弹出文件下载 原理 代码
- 细说React(二)
热门文章
- SQL约束脚本的用法
- 关于本地$.get(url,function(data)),异步获取数据
- php模板引擎技术简单实现
- pyqt5通过文本对话框打开文件
- Activiti工作流学习-----基于5.19.0版本(3)
- jQuery的Autocomplete插件的远程url取json数据的问题
- oracle分配角色和表空间
- GridView 中Item项居中显示
- Hunt the Wumpus第二个版本---多怪兽,多洞穴,洞穴间双向互通
- BZOJ2768: [JLOI2010]冠军调查