相对位置

当你添加一个精灵到一个 Container,它的 xy 位置是相对于这个组的左上角,这是精灵的 local position。 从下图中,你认为"支地鼠"的位置是多少?

console.log(aliMole.getPositionX());
//=> 0

0?是的!因为"支地鼠"的 x 值是相对于组 moles 的左上角,0 就是精灵的 local position。

如果我们想要获取精灵相对于画布的全局位置(global position)呢?就是相对于画布的左上角的位置。 你可以使用 toGlobal 方法:

parentSprite.toGlobal(childSprite.position);

这就意味这你可以找到 moles 组里的 aliMole 的全局位置:

console.log(moles.toGlobal(aliMole.getPosition()));
//=> {x: 40, y: 165}

如果我不知道精灵的父容器是什么,怎么办?每一个继承于 DisplayObject 的显示类都有 parent 属性,这会返回它的父对象,上面的代码中 aliMole 的 parent 就是 moles,所以,你获取 aliMole 全局位置的姿势就可以是这样的:

aliMole.parent.toGlobal(aliMole.getPosition());

不过,你可以使用 getGlobalPosition 快速得到全局位置,这也是推荐的姿势:

// 支地鼠的全局位置
console.log(aliMole.getGlobalPosition());
//=> {x: 40, y: 165}

// 堵车鼠的全局位置
console.log(dcMole.getGlobalPosition());
//=> {x: 80, y: 205}

// 排队鼠的全局位置
console.log(pdMole.getGlobalPosition());
//=> {x: 120, y: 245}

Tips

  • 获取全局位置后,对于检测碰撞会有很大的帮助。

你还可以使用 toLocal 方法来得到两个精灵之间的相对位置:

console.log(aliMole.toLocal(aliMole.position, dcMole));
//=> {x: 40, y: 40}

从上面的代码片段运行的结果可以看出:"支地鼠"和"堵车鼠"之间的偏移量是 {40, 40}。