http://cocos2d-x.org/projects/cocos2d-x/wiki/Coordinate_System
介绍不同的坐标体系
笛卡尔坐标系
你可能在以前的几何课里学到了笛卡尔坐标系。如果忘记了,下面的图片可以很快让你想起来。
以下三种坐标系将在以后的手机游戏中用到。
UI坐标系
这个坐标系在 IO/Android/Windows SDK平台中的共性:
- 原点(x=0,y=0)在屏幕的左上角。
- x轴线沿着屏幕向右边延伸。
- y轴线沿着屏幕向下延伸。
如图:
Direct3D 坐标系
DirectX 采用的是左手式的笛卡尔坐标系。
OpenGL 和 Cocos2d 坐标系
Cocos2d-x/-html5/-iphone 采用的坐标系与OpenGL一致。采用的是右手式的笛卡尔坐标系。
在2D游戏世界里,我们只需要X与Y轴所构成的坐标系。所以,在cocos2d中:
- 坐标系原点(x=0,y=0)是屏幕的左下角,屏幕所在就是右手笛卡尔坐标系的第一象限。
- X轴沿着屏幕往右边延伸。
- Y轴沿着屏幕往上延伸。
下面图片能更好的阐明cocos2d坐标系:
注意该坐标系与世界坐标系和DirectX坐标系的区别。
父节点与子节点
每个继承CCNode的类都会有一个锚点属性。当要显示一个对象时(sprite、layer等)元素时,cocos2d将根据对象的位置和锚点两个属性去绘制。如果该对象需要旋转角度,那它的旋转是以锚点为定点的。
创建一个灰色的节点作为父节点,蓝色的作为子节点,设置父节点的位置为(100,100),子节点的锚点为(0.5,0.5),即圆的中心 。
我们设置了子节点的位置为(0,0),父节点的位置为(100,100),因而,子节点的位置如图:
锚点的介绍:
见此文: http://blog.csdn.net/o_longzhong/article/details/9493215
getVisibleSize、getVisibleOrigin 与 getWinSize
getVisibleSize获取OpenGL视图的可视界面的尺寸(像素),如果没有调用CCEGLView::setDesignResolutionSize()函数,这个值与用getWinSize获取的值是一样的。
getVisibleOrigin获取OpenGL视图的原点。点击查看更多信息Multi resolution support。
转换坐标系
convertToNodeSpace:
当你有一个基于小贴块地图的游戏,但是地图很大。covertToNodeSpace可以将OpenGL坐标系的点转换为.tmx地图的坐标。
下图中node1的锚点为(0,0),node2的锚点为(1,1)。
当调用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 将转换node2的坐标相对于node1的坐标原点的坐标位置,这里node2的位置就是(-25,-60)。(就是把世界坐标系转换到当前节点的本地坐标系中)
convertToWorldSpace:
convertToWorldSpace(const CCPoint)将当前节点的本地坐标系转化为世界坐标系。它总是返回节点在视图中的位置。当需要移动或缩放地图才能看到节点时,而又想获取这个节点的taps(不懂),这个函数很有用。
一般是父节点调用这个方法,来返回它的子节点在世界坐标系中的位置。因此,如果没有子节点,一般节点不会调用这个方法。
例如:1CCPoint point = node1->convertToWorldSpace(node2->getPosition());