cocos2d-x(2.2) 学习之坐标转换

坐标转换
GL坐标系:
Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。

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

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

本地坐标系:
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。
每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。
比如用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的左下角坐标

先定义几个变量

CCSize targetSize = target.getContentSize();
CCPoint targetAnchorPoint = target.getAnchorPoint();
CCPoint tempPoint = CCPointMake(targetSize.width * targetAnchorPoint.x, targetSize.height * targetAnchorPoint.y);//本地坐标系中描点坐标
CCPoint returnPoint ;

下面我们来看一下几个转换函数:

//将一个世界坐标系的点转化为本地坐标系

CCPoint CCNode::convertToNodeSpace(const CCPoint& worldPoint)

其具体算法如下:

CCPoint p1 = ccpSub(worldPoint,target->getPosition());
returnPoint= ccpAdd(p1,tempPoint);

//将一个本地坐标系的点转化为世界坐标系

CCPoint convertToWorldSpace(const CCPoint& nodePoint);

其具体算法如下:

CCPoint p2 = ccpAdd(nodePoint,target->getPosition());
returnPoint = ccpSub(p2,tempPoint);

//将一个世界坐标系的点转化为本地坐标系(与描点没有关系)

CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);

其具体算法如下:

returnPoint = CCPointMake(ccpSub(worldPoint,target.getPosition()));

//将一个本地坐标系的点转化为世界坐标系(与描点没有关系)

CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);

其具体算法如下:

returnPoint = CCPointMake(ccpSub(worldPoint,target.getPosition()));

对于
CCPoint convertToGL(const CCPoint& obPoint);
CCPoint convertToUI(const CCPoint& obPoint);
就更好理解了;理解GL坐标系和屏幕坐标系的概念就明白了,就是坐标原点的转换。

cocos2d-x(2.2) 学习之坐标转换

时间: 2024-08-30 12:33:14

cocos2d-x(2.2) 学习之坐标转换的相关文章

[原创]cocos2d-lua学习笔记(0)-提纲

cocos2d-lua的学习提纲 搭建 cocos2d -lua 开发环境 cocos2d -lua 基础入门 cocos2d -lua 进阶框架学习,提高开发效率 导出自定义C++对象到Lua中 在 C++ 和 Lua 间传递数据与对象 Lua 中的异步网络请求 编译并加密 Lua 脚本 发布游戏

cocos2d3.2 渲染学习篇1

好久没写BLOG了,也是这一年都在项目上混,没什么时间去学习其他的东西,刚好最近闲下来了,就开始研究cocos2d了.最近学习了下它的渲染模式,和大家分享一下,其实具体的流程网上教程一抓一大把,我只是用几个例子来分析一下. 例子一: <span style="font-size:18px;">for(int i=0;i<100;i++){ Sprite* sprite1 = Sprite::create("CloseNormal.png"); sp

和我一起开发Android应用(一)——开发一款安卓多功能背单词软件

大家好,很久没有在博客园写过东西.前一段时间尝试学过一段时间cocos2d,但是由于学习资料有限,文档较少,一直难有进展,因此在刚刚过去的三周里,我又回到了我的老本行:java ,Android.在假期里我算是正式开发了我的第一个安卓应用: i背单词.经过三个星期的磕磕绊绊,终于写出一个较稳定的版本,现在这款应用已经成功上架GooglePlay,并且很快会在百度移动应用和安智网上架.当然由于这款软件只是由我个人维护,我也不奢求会有多大的下载量了呵呵,但我想有必要把这短时间开发应用的体会做一个总结

iOS手势学习UIGestureRecognizer &amp; cocos2d 手势推荐

iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按UIPanGestureRecognizer  // 慢速拖动UIPinchGestureRecognizer  // 两指向內或向外拨动UIRotationGestureRecognizer   // 旋转UISwipeGestureRecognizer   // 快速滑动UITapGestureRecognizer   //

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

Cocos2D学习笔记(1)- 常用的类

1.坐标系 >屏幕坐标系(UIKit):原点在左上角! >OpenGl坐标系:原点在屏幕的左下角! 2.游戏设计:Director--Scene--Layer--Sprite. >CCDirector:导演类,相当于是游戏策划,负责整个游戏的布局和运行规则的制定. >CCScene:场景类,每个场景可以是一个界面或一个关卡. >CCLayer:图层类,为了方便游戏界面的渲染管理. >CCSprite:精灵类, 小结:一个导演类(CCDirector)可以指挥多个场景类(

cocos2d&amp;amp;cocos2dx学习资源

汇总一下自己学习Cocos2d和cocos2dx认为比較好的一些资源: 书籍: <iPhone&iPad cocos2d游戏开发实战> Steffen Itterheim <IOS游戏编程从零開始> 李华明 <Cocos2dx游戏开发之旅> 笨木头 站点: 子龙山人 泰然网 笨木头 黑米 9TECH raywenderlich cocoaChina code4app supersuraccoon

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

cocos2d-x学习笔记(三)解决cocos2d::Director没有成员getTouchDispatcher问题

初学者在学习代码阶段偶尔会把项目代码拿过来编译,然后看下运行结果再研究代码.如果别人的项目代码是用cocos2d-x 3.0之前的版本编写的,而自己用的cocos2d-x是3.0以后的,编译的时候经常会碰到如下问题: Error:class "cocos2d::Director"没有成员"getTouchDispatcher" 在3.0版本以前,之前所用的 CCTouchBegan.CCTouchMoved.CCTouchEnd这些都已经不能再用了,现在是让监听器自