关于this.node.convertToWorldSpaceAR(cc.v2(0,0))与 this.node.convertToNodeSpaceAR(cc.v2(0,0)), 相信每个人都已经知道字面意思且拜读过大部分相同的文章,我看过几十篇了吧,然而还是不能理解与正确使用(自认为不是很傻…请不要鄙视往下看吧…)
这里呢,经过我反复的试验与思考,我将给和我一样懵…的童鞋们分享下:
- 在介绍这两个坐标转换前呢,先说下this.node.getPosition与this.node.setPosition
这俩呢,都是在节点坐标下使用的,什么意思呢?
比如说:以下图为例,一个母节点block(蓝色精灵节点)和它的子节点mid(红色精灵节点),其中m的母节点为canvas;黑色精灵节点player的母节点也为canvas。
那么,我们从cocos上看到的蓝色精灵节点(block)的Position坐标是什么呢?
就是这个节点的节点坐标,并不是世界坐标。
如果我们用this.block.getPosition()得到的就是当前节点的节点坐标。
再说细点就是,canvas的锚点坐标为cc.v2(0,0),block的世界坐标与canvas的锚点坐标差值就是block的节点坐标。 block的世界坐标cc.v2(230, 250) 减去canvas的世界坐标cc.v2(480, 320) 就等于block的节点坐标 cc.v2(-250, -70)。
那么, 如果要用setPosition的话,也是一样,要先把世界坐标换成block的母节点下的节点坐标,再赋给setPosition,说的好复杂,以下为代码实现。
var w_pos = cc.v2(230, 250)//也可以随便别的位置。
this.block.setPosition(this.block.parent.convertToNodeSpaceAR(w_pos))
总结下,getPosition和setPosition都是针对使用对象(比如说红色节点mid)的节点坐标。那么,在使用的时候呢,就有以下几种情况:
1.var n_pos = this.mid.getPosition() //节点坐标,母节点为block, mid节点坐标为(-10, 10)
2… var w_pos = this.mid.convertToWorldSpaceAR(cc.v2(0, 0)) //获取当前节点的世界坐标
比如 mid节点坐标为(-10, 10),而它的世界坐标为(240, 160)
转化为世界坐标的时候,不用考虑母节点,可以直接转化。
3… setPosition()上面举了个例子,这里再说个别的吧,因为是母节点下的节点坐标,所以要先确定是同一个母节点吗?
4… 比如母节点一m1有个子节点c1,母节点二m2有个子节点c2。如果我想把c1放到当前c2的位置应该怎么写代码呢?
步骤一,获取当前c2的世界坐标c2_w_pos;
步骤二,将c2_w_pos转化为母节点一m1的节点坐标m1_n_pos;
步骤三, 将m1_n_pos赋值给setPostion: this.c1.setPosition(m1_n_pos)
最后说下以下代码中有个 e.getLocation(); 这里的getLocation()获取的是世界坐标。
所以如果想把点击的位置赋值给节点,用setPosition要先转化为母节点下的的节点坐标。
this.node.on(cc.Node.EventType.TOUCH_START, function(e) {
var w_pos = e.getLocation()
}.bind(this), this)
如果有错,欢迎指正,不喜勿喷…谢谢!