Domanda

Qualcuno può aiutarmi a dare un senso al seguente?

creo qualche sprite squadrate e quindi rimuovere il primo e visualizzare i coordinate. Il risultato è:

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

La coordinata x è ancora 0, anche se la larghezza è cambiato, getBounds mostra valori corretti. Mi aspetterei x per cambiare pure. A causa del valore errato di x, globalToLocal e localToGlobal funzionano in modo non corretto.

Se si fa clic da qualche parte sul lato sinistro del secondo (ancora visibile) rettangolo si ottiene:

2 28 (x=2, y=28)

che è buono a nulla. I valori tra parentesi dovrebbero essere in coordinate palco e non lo sono.

Il codice:

    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)));
    }
È stato utile?

Soluzione

Sei confuso su due punti distinti, ma penso che ogni stelo da una visione incompleta di come Flash si occupa di sistemi di coordinate. Ricordiamo che ogni oggetto di visualizzazione porta attorno al proprio sistema Coord. Nella tua prima domanda, di un oggetto proprietà "y" "x" e non vengono calcolati in modo dinamico per riflettere angolo superiore sinistro dell'oggetto, semplicemente denotano il luogo di origine di quell'oggetto, rispetto al sistema di coordinate del suo elemento principale. Quindi, il valore "x" di un oggetto non cambia solo perché il contenuto dell'oggetto cambiato -. Cambia quando si sposta l'oggetto stesso

Il problema con il vostro stadio coordina è che il metodo localToGlobal converte le coordinate dal campo di applicazione in cui viene chiamata - e si sta chiamando dal genitore dei rettangoli, ma si sta passando in coordinate dal sistema locale all'interno della rettangolo. Stare che segue per un po 'e si deve dare un senso:

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

Aggiornamento: Parte di ciò che rende questa confusione è il modo di bubbling degli eventi opere in AS3. Leggere i primi paragrafi di questo ottimo articolo per ottenere l'idea generale , e poi capire che in questo esempio gli eventi sono inizialmente emessi da un rettangolo (perché è lì che la grafica che ha ottenuto cliccato è), ma li prendono solo in quanto la bolla attraverso l'ambito in cui si imposta il vostro ascoltatore. Così e.target è il rettangolo, e e.currentTarget è la portata del vostro ascoltatore. Poi l'ultimo pezzo del puzzle è di capire che e.localX e e.localY sono sempre nel sistema di coordinate del bersaglio originale della manifestazione. (Questo è perché sono proprietà dell'evento, e non avrebbe senso per loro di mantenere la modifica come l'evento gorgogliare l'elenco di visualizzazione.)

Come nota finale, se vi state chiedendo come i principianti di solito far fronte a questa roba, la risposta è che la gente di solito attaccano gli ascoltatori direttamente all'oggetto di visualizzazione che ha i contenuti grafici che verranno cliccato. In tal caso, e.target e e.currentTarget sarà sempre lo stesso, e la maggior parte dei principianti non avranno bisogno di capire tutto questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top