Actionscript странные координаты после вызова removeChild - PullRequest
1 голос
/ 24 января 2010

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

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

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

Координата x по-прежнему равна 0, хотя ширина изменилась, getBounds показывает правильные значения. Я ожидаю, что х тоже изменится. Из-за неправильного значения 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)));
    }

1 Ответ

1 голос
/ 25 января 2010

Вы запутались в двух разных моментах, но я думаю, что каждый из них проистекает из неполного представления о том, как 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 всегда будут одинаковыми, и большинству начинающих не нужно ничего понимать.

...