Cocos2d-x坐标系初解:
首先我们先了解一下Cocos2d-x世界中的几种坐标类型:
屏幕坐标系:原点在左上角,X轴向右,Y轴向下。
GL坐标系:原点在左下角,X轴向右,Y轴向上。
世界坐标系:指相对于整个屏幕的坐标系,480*320为例,(0,0)就是屏幕的左下角,(320,480)就是屏幕的右上角。
本地坐标系:相对于父对象的坐标。
一般情况下只需要把握一点就好:孩子的锚点坐标是相对于父亲的原点而言的,因为大多数情况下我们使用的是这种情况。 下面讨论一些特殊情况: 1、层的锚点:从cocos2d-x的设计来讲,层是一个抽象概念,所以他本来就是忽略锚点的(即,锚点为CCPointZero) CCMenu继承于CCLayer,所以它具有忽略锚点的属性。而CCMenuItem的锚点是正常的(0.5,0.5)。 向CCLayer中添加CCLayerColor: 如果CCLayerColor是通过create(ccc4)创建的,那么它会自动获取winSize的bounds,而且会置自己的锚点为ccp(0.5,0.5),而父Layer的原点也成了ccp(0.5,0.5)。 如果CCLayerColor是通过create(ccc4,width,height)创建的,就会置自己的锚点为ccp(0,0),而父Layer的原点也是(0,0)。 想要利用组件大小来设置相对坐标,即使用getContentSize()方法时需要注意:getContentSize函数获得的是节点原始的大小。只是逻辑尺寸,不是像素。所以很多时候,这个函数的返回值就是(0,0),即便是你已经在这个组件中添加了有大小的子组件。下面总结几种有关“点”和“size”的方法: getContentSize:函数来获得节点原始的大小。只是逻辑尺寸,不是像素。 boundingBox:函数来获得经过缩放和旋转之后的外框盒大小。 getContentSizeInPixels:获得的是像素点大小。 getVisibleSize:默示获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。 DesignResolutionSize:设计方案的大小,用于解决android的碎片化分辨率适配问题。 getVisibleOrigin:默示可视区域的出发点坐标,这在处理相对位置的时候很是有效,确保节点在不同辨别率下的地位一致。 2、点击事件的捕获坐标:(过程:触摸的坐标都是屏幕坐标,需要先转换成本地坐标,再转换成GL坐标) cocos2d-x基本的两个坐标系:屏幕坐标系和GL坐标系。调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。 举个简单的例子: bool ret = CCRect::CCRectContainsPoint(this->boundingBox(),this->getParent()->convertTouchToNodeSpace( pTouch ));//转换到父节点的本地坐标下 这个例子的功能是来判定当前的触摸操作是否发生在自己的node对象上。其中pTouch是CCTouch对象的指针,包含了当前触摸事件发生点的坐标。CCRectContainsPoint这个函数用来判断一个点是否在一个矩形范围内。我们就想用这个函数来判断当前触摸操作的这个点是否在当前node的范围内。this->boundingBox() 方法获得了当前节点对象在父节点对象下的缩放之后的本地坐标大小,并且是用GL坐标系表示的。pTouch对象中的坐标是屏幕坐标系,所以必须转换到GL坐标系,再转换到父节点的本地坐标下。好在convertTouchToNodeSpace这个函数一次完成了这两个转换。所有数据都转换到同一个坐标系下了以后,就可以通过CCRectContainsPoint函数完成最终的判定操作。