cocos2dX–坐标系
- OpenGL坐标系
OpenGL坐标的坐标系原点在手机屏幕的左下角,向右是X轴正方向,向上Y轴正方向。cocos2dx以OpenGL和OpenGL ES
为基础,所以支持的自然是OpenGL坐标系。节点坐标系和世界坐标系在cocos2dx中都属于OpenGL坐标系,只是他们的坐标原点不同。
-
- 世界坐标系
世界坐标系和GL坐标系一致,原点在屏幕左下角,x轴向右,y轴向上。世界坐标系,也叫绝对坐标系,是游戏开发中的概念,它建立了描述其它坐标系所需要的参考标准,可以用世界坐标系来描述其它坐标系的位置。
Cocos2dx中的元素结构是有父子关系的层级结构,通过node的position设定元素的位置使用的是相对其父节点的本地坐标系,而非世界坐标系。
最后在绘制屏幕时,Cocos2dx会把这些元素的本地节点坐标映射成世界节点坐标。
-
- 屏幕坐标系(UI坐标系)
屏幕坐标系,即UI坐标系,又称为纹理坐标系,默认原点在左上角,x轴向右,y轴向下。iOS的触摸事件的Touch传入的位置信息使用的是屏幕坐标系,在cocos2dx中对触摸事件进行处理时,需要先把触摸点的位置转换成OpenGL坐标,可以使用Director类的convertToGL函数来进行转换。
- 节点坐标系(本地坐标系)
节点坐标系是和特定节点相关联的的坐标系。也叫相对坐标系,它是相对于父节点的。它的坐标原点在父对象的左下角。每个节点都有独立的坐标系,节点移动或改变方向时,和该节点关联的坐标系(其子节点)也将随之移动或改变方向。
将mySprite的位置设置为Vec2(50,50),并非是设置mySprite的锚点距离世界坐标系原点位置为Vec2(50,50)。而是指相对于mySprite的父节点的左下角为Vec2(50,50)的位置。
几乎所有的游戏引擎(包括cocos2dx在内)都会使用这样的节点坐标系来指定元素的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独立计算,最后再加上坐标系的运动即可,这是物理研究中常用的思路。
例如一个在行驶的车厢内上下跳动的人,我们只需要在每帧绘制的时候计算他在车厢坐标系中的位置,然后加上车的位置就可以计算出人在世界坐标系中的位置,如果使用单一的世界坐标系,人的运动轨迹就变复杂了。
-
- 坐标系转换:
在Node类中为我们提供了坐标转换的四个函数:
(1)convertToWorldSpace(Vec2 p)方法可以把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。
(2)convertToNodeSpace(Vec2 p)方法可以把世界坐标转换到当前节点的本地坐标系中。
上述两个方法都是不考虑锚点的,也就是以节点的左下角为基准。 (3)convertToWorldSpaceAR(Vec2 p) )
convertToNodeSpaceAR(Vec2 p) 功能和上述两个函数相同,但是是基于锚点的。