質問

誰か次の意味を理解するのを手伝ってくれませんか?

いくつかの四角いスプライトを作成してから、最初のスプライトを削除して座標を表示します。結果は次のとおりです。

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

x 座標は 0 のままですが、幅は変更されています。 getBounds は正しい値を表示します。xも同様に変化すると予想します。x の値が間違っているため、globalToLocal と localToGlobal は正しく動作しません。

2 番目の (まだ表示されている) 長方形の左側のどこかをクリックすると、 あなたは得る:

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)));
    }
役に立ちましたか?

解決

あなたは 2 つの異なる点で混乱していますが、それらはそれぞれ、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 )));
}

アップデート:これを混乱させる原因の 1 つは、AS3 でのイベント バブリングの仕組みです。最初の数段落を読んでください この素晴らしい記事 一般的な概念を理解してから、この例ではイベントは最初に四角形から発行されます (クリックされたグラフィックがあるため) が、リスナーを設定したスコープ内をイベントが通過するときにのみイベントを捕捉することを理解します。それで e.target は長方形であり、 e.currentTarget リスナーの範囲です。パズルの最後のピースは、次のことを理解することです e.localX そして e.localY は常にイベントの元のターゲットの座標系内にあります。(これは、これらがイベントのプロパティであり、イベントが表示リストをバブルアップするにつれて変化し続けることは意味がないためです。)

最後に、初心者が通常どのようにこの問題に対処するのか疑問に思っている場合、その答えは、通常、クリックされるグラフィック コンテンツを含む表示オブジェクトにリスナーを直接アタッチするということです。その場合、e.target と e.currentTarget は常に同じになり、ほとんどの初心者はこれを理解する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top