Вопрос

Кто-нибудь может помочь мне разобраться в следующем?

Я создаю несколько квадратных спрайтов, а затем удаляю первый и показываю координаты.В результате получается:

  (x=0, y=0, w=208, h=40) 0 208
  (x=42, y=0, w=166, h=40) 0 166

Координата x по-прежнему равна 0, хотя ширина изменилась, getBounds показывает правильные значения.Я бы ожидал, что x тоже изменится.Из-за неправильного значения x, globalToLocal и localToGlobal работают некорректно.

Если вы нажмете где-нибудь с левой стороны второго (все еще видимого) прямоугольника вы получите:

2 28 (x=2, y=28)

который ни на что не годен.Значения в скобках должны быть в координатах этапа, но это не так.

Код:

    public function test():void {
        var s:Sprite;
        var i:int;

        var arr:Array = new Array();
        for (i = 0; i < 5; ++i)
        {
            s = new Sprite();
            s.graphics.beginFill(0x999);
            s.graphics.drawRect(0, 0, 40, 40);
            s.graphics.endFill();
            s.x = i * 42;
            arr.push(s);
            addChild(s);
        }
        trace(this.getBounds(stage), x, width);
        removeChild(arr[0]); arr[0] = null;
        trace(this.getBounds(stage), x, width);
        addEventListener(MouseEvent.CLICK, click);
    }

    private function click(e:MouseEvent):void {
        trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    }
Это было полезно?

Решение

Вы запутались в двух отдельных моментах, но я думаю, что каждый из них проистекает из неполного представления о том, как Flash работает с системами координат.Напомним, что каждый отображаемый объект имеет свою собственную систему координат.В вашем первом вопросе свойства объекта "x" и "y" не вычисляются динамически, чтобы отразить верхний левый угол объекта, они просто обозначают местоположение источника этого объекта относительно его родительской системы координат.Таким образом, значение объекта "x" изменится не только потому, что изменилось содержимое объекта - оно меняется при перемещении самого объекта.

Проблема с вашими координатами сцены заключается в том, что localToGlobal метод преобразует координаты из области, в которой он вызывается - и вы вызываете его из родительского элемента прямоугольников, но вы передаете координаты из локальной системы внутри прямоугольника.Посмотрите немного на это ниже, и это должно иметь смысл:

function click(e:MouseEvent):void {
    // bad - uses rectangle coords in scope of "this"
    //trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    // works - call localToGlobal from the scope of the rectangle
    trace( e.target.localToGlobal(new Point(e.localX, e.localY)));
    // alternately, call it from any scope with coordinates taken from that scope:
    trace( localToGlobal( new Point( mouseX, mouseY )));
    trace( e.target.localToGlobal( new Point( e.target.mouseX, e.target.mouseY )));
}

Обновить: Отчасти это сбивает с толку из-за того, как работает пузырение событий в AS3.Прочтите первые несколько абзацев эта превосходная статья чтобы получить общую идею, а затем понять, что в этом примере события изначально выдаются из прямоугольника (потому что именно там находится изображение, на которое был сделан щелчок), но вы улавливаете их только тогда, когда они перемещаются через область, в которой вы установили своего слушателя.Итак e.target является прямоугольником, и e.currentTarget это сфера деятельности вашего слушателя.Тогда последняя часть головоломки - понять, что e.localX и e.localY всегда находятся в системе координат исходной цели события.(Это потому, что они являются свойствами события, и для них не имело бы смысла продолжать меняться по мере появления события в списке отображения.)

В качестве последнего замечания, если вам интересно, как новички обычно справляются с подобными вещами, ответ заключается в том, что люди обычно подключают слушателей непосредственно к экранному объекту, который содержит графическое содержимое, на которое будет сделан щелчок.В этом случае e.target и e.currentTarget всегда будут одинаковыми, и большинству новичков не нужно будет ничего из этого понимать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top