cocos2d-x坐标系统

说在前面:以下是基于cocos2d-2.0-x-2.0.3作的总结

对于cocos2d的坐标系统,tangaowen已经在其博文COCOS2D坐标系统的一些说明中作了比较详细的介绍,这里我只对节点的坐标系作一些补充。个人觉得,世界坐标系就是GL坐标系。

基本概念

cocos2d的每个节点都有一个坐标系,默认情况下,它与本地坐标系是一致的,即左下角是原点,向右是x方向,向上是y方向。在这个坐标系下,衍生了一些概念,它们分别是:

ContentSize

标识此节点所占的区域大小,但是只是逻辑上的,并不是节点实际画出来时所占区域的大小。到目前版本,ContentSize被初始化后,如果不主动调用setContentSize,那么无论后续对节点做什么样的操作,都不会改变其ContentSize,比如做缩放、加入孩子节点等。比喻,一个CCNode默认的区域大小为(0,0),Layer的默认区域大小为winSize,那么将Layer设置为CCNode的孩子后,CCNode和Layer的ContentSize都不会变化。

ContentSize在任何时候都是可以改变的,但是如果经常改,容易造成混乱。

一些节点的初始化后的ContentSize:

CCNode(0, 0)
CCLayerwinSize
CCScenewinSize
CCSpriteimageSize

ContentSize的作用之一是为子节点提供定位信息。

AnchorPoint(锚点)

当为某节点添加孩子节点,需要将孩子结点的坐标系与本节点的坐标系做了对应,最简单(默认)的对应的就是子结点的某个点对应到本节点坐标系的原点。这样,子节点中的那个点在子节点坐标系中的坐标就叫做锚点。

关于锚点的说明,见cocos2d-x中锚点设置及定位方式

当对节点进行仿射变换(Affine Tranform)时,锚点不会改变。

Position(锚点放置位置)

当为某结点添加孩子节点时,子节点的锚点需要放到此节点坐标系中的某个位置,这个位置就是锚点放置位置。当对子节点进行仿射变换时,锚点放置位置不会改变;但是父节点的仿变化会影响到锚点放置位置。

BoundingBox(包围框)

当将子节点的锚点放置到父节点的锚点放置位置后,子节点的ContentSize可以定义一个以锚点为中心的矩形,这个矩形在父节点的矩形描述(CCRect)就是子节点的包围框。

坐标转换方法

CCNode中与节点坐标变换相关的方法

converToNodeSpace:将世界坐标系中的点转换到当前节点坐标系中

convertToWorldSpace:将当前节点坐标系中的点转换到世界坐标系中

convertToWindowSpace:将当前节点坐标系中的点转换到屏幕坐标系中

convertTouchToNodeSpace:将屏幕坐标系中的点转换到当前节点坐标系中

convertToNodeSpaceAR:与锚点相关,相当于convertToNodeSpace后再放到以锚点为中心的坐标系中。

convertToWorldSpaceAR:与锚点相关,相当于先将以锚点我中心的坐标系中的点放到本节点坐标系中,然后convertToWorldSpace。

convertTouchToNodeSpaceAR:与锚点相关,相当于先convertTouchToNodeSpace后再放到以锚点为中心的坐标系中。

(疑问:这种方式是否提供了一种机制,使得节点的坐标系也可以使用锚点作为坐标原点?)

CCDirector中与坐标转换相关的方法

convertToGL:屏幕坐标系中的点到OpenGL坐标系

convertToUI:OpenGL坐标系中的点到UIKit中的点,即屏幕坐标系中的点。另外,当与Cocoa Touch一起使用时,需要对UIKit中的坐标与cocos2d的坐标系进行变换,那么可以用此接口。

使用矩阵

CCNode中提供了如下方法可以获取变换矩阵

nodeToParentTransform

parentToNodeTransform

nodeToWorldTransform

worldToNodeTransform

cocos2d提供了一些API来根据已有的变换矩阵得到新的变换矩阵

CCAffineTransformConcat:变换级联

CCAffineTransformInvert:逆变换

cocos2d提供了一些API来实现转换

CCAffineTransformTranslate:对向量平移

CCAffineTransformRotate:对向量旋转

CCAffineTransformScale:对向量绽放

(少了个扭曲变化)

CCRectApplyAffineTransform:对矩形变换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值