Frage

Kann mir jemand helfen machen Sinn der folgenden?

ich ein paar squared Sprites erstellen und dann die erste entfernen und die Koordinaten angezeigt werden soll. Das Ergebnis ist:

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

Die x-Koordinate ist immer noch 0, obwohl Breite geändert hat, getBounds zeigt korrigieren Werte. Ich würde erwarten, x als auch zu ändern. Wegen des falschen Wertes von x, globalToLocal und localToGlobal Arbeit falsch.

Wenn Sie irgendwo auf der linken Seite der zweiten klicken (noch sichtbar) Rechteck Sie bekommen:

2 28 (x=2, y=28)

, die nichts taugt. Die Werte in Klammern in der Stufe coords sein sollten, und sie sind es nicht.

Der Code:

    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)));
    }
War es hilfreich?

Lösung

Sie sind auf zwei getrennten Punkten verwirrt, aber ich denke, dass sie jeden Stamm aus einer unvollständigen Ansicht, wie Flash befasst sich mit Systemen zu koordinieren. Daran erinnert, dass jedes Anzeigeobjekt trägt sein eigenes coord System um. In Ihrer ersten Frage ein Objekts „x“ und „y“ Eigenschaften werden nicht dynamisch berechnet das Objekt obere linke Ecke zu reflektieren, bezeichnen sie einfach den Ort dieses Herkunft des Objekts in Bezug auf seine Eltern Koordinatensystem. So ein Objekt der Wert „x“ nicht nur ändern, weil die Inhalte des Objektes verändert -. Es ändert sich, wenn Sie das Objekt selbst bewegen

Das Problem mit Ihrem Bühnenkoordinaten ist, dass die localToGlobal Methode konvertiert Koordinaten aus dem Bereich, in dem es heißt - und Sie nennen es von der Mutter der Rechtecke, aber Sie vorbei in Koordinaten aus dem lokalen System innerhalb der Rechteck. Stare, dass für ein bisschen folgende und es sollte Sinn machen:

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: Teil dessen, was das verwirrend ist, wie Ereignis Sprudeln in AS3 arbeitet. Lesen Sie die ersten paar Absätze von dieser ausgezeichneten Artikel die allgemeine Idee zu bekommen verstehen, und dann, dass in diesem Beispiel der Ereignisse werden zunächst aus einem Rechteck ausgegeben (weil dort die Grafik, die angeklickt wurde), aber Sie fangen sie, wie sie Blase durch den Bereich, wo Sie Ihre Zuhörer gesetzt. So e.target ist das Rechteck, und e.currentTarget ist der Umfang Ihrer Zuhörer. Dann wird das letzte Stück des Puzzles ist es zu verstehen, dass e.localX und e.localY ist immer im Koordinatensystem der ursprünglichen Ziels der Veranstaltung. (Dies ist, weil sie Eigenschaften der Veranstaltung sind, und es wäre nicht sinnvoll, für sie als das Ereignis der Anzeigeliste sprudelt halten zu ändern.)

Als abschließende Bemerkung, wenn Sie sich fragen, wie Anfänger in der Regel mit diesem Zeug fertig zu werden, ist die Antwort, dass die Menschen in der Regel Hörer anschließen direkt an das Anzeigeobjekt, das die grafischen Inhalte hat, die angeklickt werden. In diesem Fall e.target und e.currentTarget wird immer das gleiche sein, und die meisten Anfänger werden nicht irgendetwas davon verstehen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top