你的localToGlobal出错了吗?!

在AS3 API手册的DisplayObject类中,对localToGlobal方法的解析没有问题,但在实际运用中,我们的面对情形有点变化。我们先看手册中举的例子:
以下代码可创建一个 Sprite 对象。 该 Sprite 对象的 mouseX 和 mouseY 属性位于显示对象的坐标空间中。 此代码使用 localToGlobal() 方法将这些属性转换为全局(舞台)坐标:
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

var square:Sprite = new Sprite();
square.graphics.beginFill(0xFFCC00);
square.graphics.drawRect(0, 0, 100, 100);
square.x = 100;
square.y = 200;

addChild(square);

square.addEventListener(MouseEvent.CLICK, traceCoordinates)

function traceCoordinates(event:MouseEvent):void {
    var clickPoint:Point = new Point(square.mouseX, square.mouseY);
    trace("display object coordinates:", clickPoint);
    trace("stage coordinates:", square.localToGlobal(clickPoint));
}
这里舞台只添加了一个对象--square,它求鼠标点击点在stage中的坐标。但我们经常处理的是错综复杂的子对象与孙对象,如果square再添加一个子对象sun,变成:

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;

var square:Sprite = new Sprite();
var son:Sprite = new Sprite();
square.graphics.beginFill(0xFFCC00);
square.graphics.drawRect(0, 0, 100, 100);
square.x = 100;
square.y = 200;
son.graphics.beginFill(0xFF6600);
son.graphics.drawCircle(5, 5, 50);
son.x = 10;
son.y = 20;

square.addChild(son);
addChild(square);

son.addEventListener(MouseEvent.CLICK, traceCoordinates)

function traceCoordinates(event:MouseEvent):void {
var clickPoint:Point = new Point(son.x, son.y);
trace("stage coordinates:", son.localToGlobal(clickPoint));
}

我想,
son.localToGlobal(clickPoint)
是很多人的习惯写法,头脑中直接认为,求son在stage的坐标,包括我。
如果是这种写法的话得出的全局坐标点是错的,为什么?因为,这相当于是求一个在son中的点(x:10,y:20)在全局位置的坐标,son在square中的本地坐标转为stage中的坐标应该是:
square.localToGlobal(clickPoint);
因为son的注册点(x:10,y:20)是相对于square的,即是应用的点坐标系是父对象的。在son添加到父对象后也可这样写:

parent.localToGlobal(clickPoint)

应该再次记住的是,clickPoint是square或parent的坐标系,而非son的,但也并非说不能写成:
son.localToGlobal(clickPoint)
而是,这个意思变了。
posted @ 2014-03-19 23:13  sumsung753  阅读(287)  评论(0编辑  收藏  举报