cocos2dx中使用opengl坐标系,左下角为坐标原点,在大部分情况下,都是使用这种坐标系的。
当我们创建了一个渲染对象到窗口后,那么这个对象本身也是也是有自己的坐标系的,这种坐标系是节点自己的坐标系,我们称之为节点坐标系,这个坐标系的方向也是左下角为原点。那么相对于节点坐标系,全局坐标系可以称之为世界坐标系。
任何节点的位置值,是参照它父亲节点的坐标系的值。
看例子吧。
// Open ES座标体系
CCSprite* sprite = CCSprite::create("Images/blocks.png");
sprite->setPosition(ccp(300, 300));
addChild(sprite);
当一个对象放在窗口上时,坐标是世界坐标系
// 相对坐标系
CCLayerColor* layer = CCLayerColor::create(ccc4(255, 0, 0, 255), size.width/2, size.height/2);
addChild(layer);
layer->setPosition(size.width/2, size.height/2);
CCSprite* sp2 = CCSprite::create("Images/blocks.png");
layer->addChild(sp2);
我们在窗口上创建一个LayerColor,并且在LayerColor里加入一个精灵,效果如下:
这个精灵并没有通过setPosition去移动位置,那么它的坐标就是0,0
从上图可以看出,后面那个精灵,在LayerColor的左下角,也就是坐标(0,0)的位置。
精灵本身占了一个区域,那么这个区域中,以哪个点作为基准点和坐标点对其呢,看效果是在精灵的中心位置,这个就是锚点的概念了。
----------------------分界线,锚点
锚点的一个作用是用来描述和父节点坐标对齐,另一个作用是在一些效果中,用来作为基准点,这个以后再说。
作为对起点,默认是(0.5, 0.5),这个0.5表示的是50%,而不是0.5个像素,所以精灵是中间与setPosition的坐标点对齐。
修改锚点的结果如下:
// 相对坐标系
CCLayerColor* layer = CCLayerColor::create(ccc4(255, 0, 0, 255), size.width/2, size.height/2);
addChild(layer);
layer->setPosition(size.width/2, size.height/2);
CCSprite* sp2 = CCSprite::create("Images/blocks.png");
layer->addChild(sp2);
sp2->setAnchorPoint(ccp(0.0f, 0.0f));
但是锚点这个东西,是很讨厌的,默认0.5,0.5只是精灵对象,层对象就不是,默认是0,0,有些对象更加讨厌的是,锚点对setPosition无效果,比如CCLayerColor
这个对cocos2dx非常鄙视,像我这种老头子,妈蛋,根本记不住那么多,只好随时用随时试了。
----------------对了
坐标系也有特例,就是CCMenu的坐标系是在中间,不是左下角,再次鄙视下cocos2dx开发团队。