سؤال

هل يمكن لأي شخص أن يساعدني في فهم ما يلي؟

أقوم بإنشاء عدد قليل من العفاريت المربعة ثم قم بإزالة الأول وعرض التنسيقات. النتيجه هي:

  (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 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)));
    }
هل كانت مفيدة؟

المحلول

أنت مرتبك على نقطتين منفصلتين ، لكنني أعتقد أنهما ينبع كل منهما من عرض غير مكتمل لكيفية تعامل فلاش مع أنظمة الإحداثيات. تذكر أن كل كائن عرض يحمل حول نظام التنسيق الخاص به. في سؤالك الأول ، لا يتم حساب خصائص "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 دائمًا هو نفسه ، ولن يحتاج معظم المبتدئين إلى فهم أي من هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top