Pregunta

Puede alguien ayudarme a dar sentido a la siguiente?

crear unos sprites al cuadrado y luego quitar el primero y mostrar las coordenadas. El resultado es:

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

La coordenada x es todavía 0, aunque la anchura ha cambiado, getBounds shows corregir valores. Yo esperaría x para cambiar también. Debido al valor equivocado de x, el trabajo y globalToLocal localToGlobal incorrectamente.

Si hace clic en alguna parte en el lado izquierdo de la segunda (todavía visible) rectángulo que se obtiene:

2 28 (x=2, y=28)

, que no sirve para nada. Los valores entre paréntesis deben estar en coordenadas de escenario y no lo son.

El código:

    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)));
    }
¿Fue útil?

Solución

usted está confundido en dos puntos separados, pero creo que cada uno de ellos se derivan de una visión incompleta de cómo ofertas flash con sistemas de coordenadas. Recordemos que cada objeto de visualización lleva alrededor de su propio sistema coord. En su primera pregunta, y las propiedades de un objeto "x", "Y" no se calculan dinámicamente para reflejar la esquina superior izquierda del objeto, simplemente indican la ubicación de origen de dicho objeto, con respecto a su padre del sistema de coordenadas. Así que el valor de un objeto "x" no va a cambiar sólo porque el contenido del objeto cambian -. Cambia cuando se mueve el objeto en sí mismo

El problema con las coordenadas de escenario es que los conversos método localToGlobal coordenadas del ámbito en el que se llama - y que están llamando a los padres de los rectángulos, pero va a ceder en coordenadas desde el sistema local dentro de la rectángulo. Stare que después de un rato y debe tener sentido:

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 )));
}

Actualización: Parte de lo que hace que este confuso es cómo funciona el burbujeo de eventos en AS3. Leer los primeros párrafos de este excelente artículo para obtener la idea general , y luego entender que en este ejemplo los eventos son emitidos inicialmente a partir de un rectángulo (porque ahí es donde la gráfica que consiguió hace clic es), pero sólo se atrapan ellos a medida que la burbuja a través del ámbito donde se define su oyente. Así e.target es el rectángulo, y e.currentTarget es el alcance de su oyente. A continuación, la pieza final del rompecabezas es entender que e.localX y e.localY están siempre en el sistema de coordenadas del objetivo original del evento. (Esto se debe a que son propiedades del evento, y que no tendría sentido que se van cambiando como el evento burbujeaba la lista de visualización.)

Como nota final, si usted se está preguntando cómo hacer frente a los principiantes por lo general estas cosas, la respuesta es que la gente suele adjuntar oyentes directamente al objeto de visualización que tiene los contenidos gráficos que se haga clic. En ese caso, e.target y e.currentTarget siempre será el mismo, y no necesitará la mayoría de los principiantes a entender nada de esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top