1

誰かが私が次のことを理解するのを手伝ってくれますか?

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

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

1 に答える 1

1

あなたは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 )));
}

更新: これを混乱させる原因の一部は、AS3でのイベントバブリングの動作です。この優れた記事の最初の数段落を読んで一般的な考え方を理解し、この例では、イベントは最初は長方形から発行されますが(クリックされたグラフィックがそこにあるため)、バブルするときにのみキャッチすることを理解してください。リスナーを設定するスコープを介して。長方形もそうe.targetです、そしてそれe.currentTargetはあなたのリスナーのスコープです。次に、パズルの最後のピースは、それを理解することでe.localXありe.localY、常にイベントの元のターゲットの座標系にあります。(これは、これらがイベントのプロパティであり、イベントが表示リストをバブルアップしたときに変更を続けることは意味がないためです。)

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

于 2010-01-24T23:49:10.717 に答える