说在前面:以下是基于cocos2d-2.0-x-2.0.3作的总结
对于cocos2d的坐标系统,tangaowen已经在其博文COCOS2D坐标系统的一些说明中作了比较详细的介绍,这里我只对节点的坐标系作一些补充。个人觉得,世界坐标系就是GL坐标系。
cocos2d的每个节点都有一个坐标系,默认情况下,它与本地坐标系是一致的,即左下角是原点,向右是x方向,向上是y方向。在这个坐标系下,衍生了一些概念,它们分别是:
标识此节点所占的区域大小,但是只是逻辑上的,并不是节点实际画出来时所占区域的大小。到目前版本,ContentSize被初始化后,如果不主动调用setContentSize,那么无论后续对节点做什么样的操作,都不会改变其ContentSize,比如做缩放、加入孩子节点等。比喻,一个CCNode默认的区域大小为(0,0),Layer的默认区域大小为winSize,那么将Layer设置为CCNode的孩子后,CCNode和Layer的ContentSize都不会变化。
ContentSize在任何时候都是可以改变的,但是如果经常改,容易造成混乱。
一些节点的初始化后的ContentSize:
CCNode | (0, 0) |
CCLayer | winSize |
CCScene | winSize |
CCSprite | imageSize |
ContentSize的作用之一是为子节点提供定位信息。
当为某节点添加孩子节点,需要将孩子结点的坐标系与本节点的坐标系做了对应,最简单(默认)的对应的就是子结点的某个点对应到本节点坐标系的原点。这样,子节点中的那个点在子节点坐标系中的坐标就叫做锚点。
关于锚点的说明,见cocos2d-x中锚点设置及定位方式。
当对节点进行仿射变换(Affine Tranform)时,锚点不会改变。
当为某结点添加孩子节点时,子节点的锚点需要放到此节点坐标系中的某个位置,这个位置就是锚点放置位置。当对子节点进行仿射变换时,锚点放置位置不会改变;但是父节点的仿变化会影响到锚点放置位置。
当将子节点的锚点放置到父节点的锚点放置位置后,子节点的ContentSize可以定义一个以锚点为中心的矩形,这个矩形在父节点的矩形描述(CCRect)就是子节点的包围框。
converToNodeSpace:将世界坐标系中的点转换到当前节点坐标系中
convertToWorldSpace:将当前节点坐标系中的点转换到世界坐标系中
convertToWindowSpace:将当前节点坐标系中的点转换到屏幕坐标系中
convertTouchToNodeSpace:将屏幕坐标系中的点转换到当前节点坐标系中
convertToNodeSpaceAR:与锚点相关,相当于convertToNodeSpace后再放到以锚点为中心的坐标系中。
convertToWorldSpaceAR:与锚点相关,相当于先将以锚点我中心的坐标系中的点放到本节点坐标系中,然后convertToWorldSpace。
convertTouchToNodeSpaceAR:与锚点相关,相当于先convertTouchToNodeSpace后再放到以锚点为中心的坐标系中。
(疑问:这种方式是否提供了一种机制,使得节点的坐标系也可以使用锚点作为坐标原点?)
convertToGL:屏幕坐标系中的点到OpenGL坐标系
convertToUI:OpenGL坐标系中的点到UIKit中的点,即屏幕坐标系中的点。另外,当与Cocoa Touch一起使用时,需要对UIKit中的坐标与cocos2d的坐标系进行变换,那么可以用此接口。
nodeToParentTransform
parentToNodeTransform
nodeToWorldTransform
worldToNodeTransform
CCAffineTransformConcat:变换级联
CCAffineTransformInvert:逆变换
CCAffineTransformTranslate:对向量平移
CCAffineTransformRotate:对向量旋转
CCAffineTransformScale:对向量绽放
(少了个扭曲变化)
CCRectApplyAffineTransform:对矩形变换