تم استدعاء ActionScript Strange Coords بعد RemoveChild
-
22-09-2019 - |
سؤال
هل يمكن لأي شخص أن يساعدني في فهم ما يلي؟
أقوم بإنشاء عدد قليل من العفاريت المربعة ثم قم بإزالة الأول وعرض التنسيقات. النتيجه هي:
(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 دائمًا هو نفسه ، ولن يحتاج معظم المبتدئين إلى فهم أي من هذا.