基本的两个坐标系:屏幕坐标系和GL坐标系。
屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。
GL坐标系x轴朝右,y轴朝上。默认原点在左下角。
CCNode类的setPosition函数使用的就是GL坐标系。
触摸事件的CCTouch对象中的坐标就是屏幕坐标系.
对于精灵类,影响显示坐标因数为锚点及位置。
默认锚点为(0.5f,0.5f),即精灵中心。
(0,0)为左下,(1,1)为右上。
对于单个精灵,位置较简单,通过setPosition()设置。
对于子精灵,位置计算是以父精灵左下为坐标原点,并且无关父精灵锚点。
如:无论父精灵锚点为(0,0)抑或(1,1),子精灵setposition(0,0)时显示总是位于父精灵坐下方。、
有些需要注意的地方:
1)子精灵以父精灵左下为坐标原点。如果有对父精灵进行缩放处理,会影响子精灵位置。(其实同样会影响子精灵显示,及子精灵也会缩放)。
2)如果想让子精灵显示在父精灵的某相对位置,如:setPosition(25,25)。当程序有做过适配处理,此时位置数据应该进行缩放处理。
CCNode中两个个方法方法:
getContentSize用来获得节点原始大小。返回CGSize类型
getBoundingBox获得节点当前大小,即如果经过缩放那么就是缩放后的大小。返回CGRect类型。
有个问题最近才遇到,父精灵进行缩放处理,会对子精灵进行标记(boolean值),在实际绘制过程中会影响子精灵显示大小,但并不改变子精灵的getBoundingBox所获得的值,也就是只有直接setscale才会影响getBoundingBox数值。
CCSprite中有个方法:
getTextureRect返回精灵纹理大小,返回CGRect类型,并且是原始纹理大小,无关缩放。在一般情况下和getContentSize作用一样,但如果用TP处理过,还回值是实际纹理大小,留白部分会去除。这个在碰撞检测过程中经常用到。
cocos2d中还有两个方法用于坐标转换:
convertToWindowSpace,将节点坐标转换为屏幕坐标,注意的是转换后为UI坐标系。
convertToNodeSpace将屏幕坐标转换为节点坐标,转换后为GL坐标系。