convertToWorldSpace的bug需要解决

问题发生的场景:
对象A要moveTo对象B的位置,对象A与对象B不在同一结点下,都是其他结点的子结点,因此,要计算moveTo的距离。

onclick: function(){
objA.stopAllActions();
objA.setPosition(0, 0);  // 相对自己父对象的0,0位置
// 自己的世界坐标
var startWorldPos  = objAconvertToWorldSpace(objA.getAnchorPoint())
// 目标的世界坐标
var targetWorldPos = objBconvertToWorldSpace(objB.getAnchorPoint())
var x = targetWorldPos.x - startWorldPos.x
var y = targetWorldPos.y - startWorldPos.y
objA.runAction(cc.moveBy(0.5, x, y));
}

第一次点击运行正常,但第2次点击就不飞往目标位置了,第3次点击正常。第4次点击不动。
打印出来的日志可以看出,startWorldPos在第2,4,6…2n 次没有被置为一开始的位置。
麻烦解决

这个代码最大的BUG就在 xxx.getAnchorPoint();

懒得教育了。
http://www.cocos.com/docs/creator/api/classes/Node.html#method_getAnchorPoint
http://www.cocos.com/docs/creator/api/classes/Node.html#method_getPosition

为什么有时对有时不对?这回复没有得到任何线索

猜测:setPosition 会立即改变 x, y 属性,但是不会立即改变节点的 transform matrix,而 convertToWorldSpace 是根据 transform matrix 计算出来的。

可能的解决方案:

使用 objA.parent.convertToWorldSpace(cc.p(0, 0)) 来计算父对象坐标系的原点位置,再使用下面的 action 来使节点运动:

// 自己的世界坐标
var startWorldPos  = objA.parent.convertToWorldSpace();
// 目标的世界坐标
var targetWorldPos = objB.parent.convertToWorldSpace();
var x = targetWorldPos.x - startWorldPos.x
var y = targetWorldPos.y - startWorldPos.y
objA.runAction(cc.sequence( cc.place(0, 0), cc.moveBy(dx, dy) ));

正解,这个问题什么时候修复呢?用panda的方法可以解决这个问题,不过这样子不直观,希望修复

引擎中的设计如此,应该不会改动,如果在设置 RTS 等属性的时候就去重新计算 transform matrix,会导致引擎损耗飙升,目前这样的设计,对 transform dirty 的节点每帧最多只会计算一次 transform matrix。

收到,结贴,以后会注意此类问题了!