本文主要是介绍cocos2d-x基础知识(四) 简单菜单及坐标系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于cocos2d坐标系的一点点心得
cocos2d-x 中关于convertToNodeSpace 的用法:
cocos2d-x 中关于convertToNodeSpace 的用法:
A->converToNodeSpace(CCPoint point )的意思是将point 转换成A的坐标系中的位置点。
我在做连连游戏中由于精灵在自定义的CCNode 中如果想判断精灵是否被点击话 需要想下面代码中写 *************************
起点坐标(x=0, y=0)位于左上角--UI 起点坐标(x=0, y=0)位于左下角,这意味着屏幕位于--GL
在cocos2d-x中一共有四种坐标:
(1)屏幕坐标系
在windows系统中,默认的原点在屏幕的左上角,X轴向右,Y轴向下。
1 | CCPoint location = touch->locationInView(touch->View) //获取点击处在屏幕坐标系的位置 |
(2)GL坐标系
原点在左下角,X轴向右,Y轴向上。由于cocos2d-x使用的是open gl渲染引擎,而不是win的directx 3d引擎,苹果的Quarze2D引擎,那么GL坐标系就不和屏幕坐标系重合,这是要注意的一点。因此,当我们调用了一个屏幕响应事件时,如ccTouchEnded(CCTouch* touch, CCEvent* event);
此时我们CCPoint location = touch->locationInView(touch->View)返回点击处在屏幕坐标系的位置,而不是GL坐标系。因此就有将屏幕坐标系转换成GL坐标系的函数。
1 | CCPoing convertedLocation = CCDirector::sharedDirector()->convertToGL(location); |
(3)本地坐标系
游戏中,每一个对象都有一个自己的坐标系,这些坐标系就叫做本地坐标系。
相对于父对象的坐标系,原点在左下角,X轴向右,Y轴向上。举个例子,以我自己作为坐标原点,那么在我附近(在我这个坐标系内)的对象就是子对象,而我就是父对象,这些子对象的位置都是本地坐标系,是相对于我(父对象)来说的。下面我举一个代码来做说明:
1 | addChild(player, 1); |
在这里,player对象就是子对象,layer就是父对象,那么player相对于layer的位置就是在本地坐标系中的位置。如果,layer(父对象)发生移动,就是我们说的背景移动,那么,player(子对象)也会跟着移动,但子对象在本地坐标系中的位置不变,改变的是子对象在世界坐标系中的位置。
另外一文中是这么解释的:
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。例如坐出租车的时候对驾驶员说“向左转”,我们使用的是车的物体坐标系,“前”、“后”、“左”、“右”只有在物体坐标系中才有意义。但如果我们说“向东开”,我们使用的就是世界坐标系了,无论是车内还是车外的人都知道应该向什么方向开。CCNode的position使用的就是父节点的本地坐标系,它和GL坐标系也是一致的,x轴向右,y轴向上,原点在父节点的左下角。如果父节点是场景树中的顶层节点,那么它使用的本地坐标系就和世界坐标系重合了。在CCNode对象中有几个方便的函数可以做坐标转换:convertToWorldSpace方法可以把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。convertToNodeSpace方法可以把世界坐标转换到当前节点的本地坐标系中。注意这些方法转换的是基于当前节点的坐标,而一个节点的position所使用的坐标是基于它父节点的本地坐标,因此我们要把node的位置转换到世界坐标系中应该调用父节点的convertToWorldSpace函数 [node.parent convertToWorldSpace:[node position]]。几乎所有的游戏引擎都会使用本地坐标系而非世界坐标系来指定元素的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独立计算,最后再加上坐标系的运动即可,这是物理研究中常用的思路。例如一个在行驶的车厢内上下跳动的人,我们只需要在每帧绘制的时候计算他在车厢坐标系中的位置,然后加上车的位置就可以计算出人在世界坐标系中的位置,如果使用单一的世界坐标系,人的运动轨迹就变复杂了。
(4)世界坐标系
世界坐标就是所谓的绝对坐标,所有的对象虽然都有自己的本地坐标系,但这些对象同样的在世界坐标系中也有一个坐标。例如,整个地球就是一个世界坐标系,在地球上的每一个人。而cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。
其实,opengl坐标系就是世界坐标系,用法如下:
关于节点的:
1 2 3 4 5 6 7 8 9 | CCPoint convertToNodeSpace ( const CCPoint &worldPoint) CCPoint convertToNodeSpaceAR ( const CCPoint &worldPoint) CCPoint convertTouchToNodeSpace (CCTouch *touch) CCPoint convertTouchToNodeSpaceAR (CCTouch *touch) CCPoint convertToWorldSpace ( const CCPoint &nodePoint) CCPoint convertToWorldSpaceAR ( const CCPoint &nodePoint) CCPoint convertTouchToNodeSpace(CCTouch *touch) CCPoint convertTouchToNodeSpaceAR(CCTouch *touch) CCPoint convertToWindowSpace( const CCPoint& nodePoint) |
关于CCDirector:
1 2 | CCPoint convertToGL( const CCPoint& obPoint) CCPoint convertToUI( const CCPoint& obPoint) |
其中convertToWindowSpace对应convertToUI,而convertToWorldSpace(AR)对应convertToUI。
好了,今天就到这里吧,呼呼……
参考:http://blog.csdn.net/wen294299195/article/details/7867595
http://blog.csdn.net/ring0hx/article/details/6962401
这篇关于cocos2d-x基础知识(四) 简单菜单及坐标系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!