2010-01-24 7 views
1

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

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

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

Координата х по-прежнему 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))); 
    } 

ответ

1

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

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

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

+0

Правильно - я не называл localToGlobal правильным способом. Спасибо. Итак, кажется, что возвращенные локальные коорды всегда относятся к фактически используемой части спрайта. И чтобы получить координаты относительно (x, y), вы должны принять во внимание. Это имеет смысл, но, как обычно, с Flash, он полностью недокументирован. :-) – stach

+0

Простите, у вас есть это в обратном направлении - возвращенные коорды относятся к происхождению спрайта, а спрайт (x, y) - это место происхождения этого спрайта в системе координат его родителя. Согласно документации. ;) Я думаю, что запутанная точка заключается в том, что щелчок происходит на прямоугольнике, поэтому (e.localX, e.localY) является точкой в ​​системе координат, началом координат которой является угол UL щелчка прямоугольника. Но ваш обработчик кликов находится в области родителя прямоугольника. – fenomas

+0

Я был (вероятно ;-), предполагая, что события будут в контексте объекта, чей addEventListener был вызван раньше. Но событие находится в контексте его ребенка. Мне нужно больше узнать о модели событий. Еще раз спасибо. – stach

 Смежные вопросы

  • Нет связанных вопросов^_^