الأربعاء، 12 نوفمبر 2014

تعلم AS3 - جزء3 [ display list] - الدرس 3 - [قائمة الأطفال الدخلية لكائن جرافيكي]


السلام عليكم و رحمة الله
مرحبا بكم في هذا الجزء الجديد من دورة تعلم الاكشن سكربت3 

في الدرس السابق  رأينا طريقة انشاء كائن جرافيكي عن طريق الكلمة new 
و قلنا أنه سيكون مخزّن في الذاكرة المركزية و لن يظهر على الشاشة إلاّ بعد استعداء الدالة addChild
فنقول ان الكائن الجديد ابن الكائن الذي يحتويه



_______________________________________________________


قائمة الأطفال الدخلية  لكائن جرافيكي:

لكل كائن من نوع DisplayObjectContainer   
قائمة أطفال موجودة داخل جدول. حيث أن كل أندكس (خانة) نجد طفلا (كائن جرافيكي).
هذا الجدول (وكما رأينا في درس الجداول ) يبدأ من الصفر (الخانة الاولى = الاندكس 0 )
اخر كائن في الجدول (الذي يملك اكبر أندكس)  يظهر على الشاشة فوق الكائنات الأخرى (سنراه لاحقا)


مثال
لدينا كائن من نوع MovieClip يحتوي على كائن من نوع Shape
و كائنين من نوع Sprite 
(الكلاسات MovieClip , Spriteترث من الكلاس DisplayObjectContainer اذن هي كائنات من هذا  النوع
بينما الكلاس Shape ترث من الكلاس DisplayObject)


var myMc : MovieClip = new MovieClip();
addChild(myMc);

var myShape : Shape = new Shape();
myMc.addChild(myShape);

for(var i:int = 0; i<2 ; i++)
{     
      var mySp:Sprite = new Sprite();
       myMc.addChild(mySp);
}

trace( myMc.numChildren); // 3

في هذا الكود أنشأنا كائنا من نوع MovieClip و وضعناه داخل ال MainTimeline
اذا هذا الكائن الان موجود داخل الجدول الداخلي الخاص بقائمة أطفال MainTimeline
داخل الحلقة التكرارية ننشئ كائنات من نوع Sprite  و نضيفها داخل الكائن myMc
اذا تلك الكائنات الان موجودة داخل الجدول الخاص بقائمة اطفال الكائن myMc

في درس الجداول كنا نستعمل الخاصية length لمعرفة طول الجدول
لكن لمعرفة طول الجدول (عدد أطفال) الخاص بقائمة الاطفال نستعمل الخاصية numChildren

اذن يمكن تمثيل الشجرة هكذا

Stage
|
MainTimeline
|
 DisplayObjectContainer (MovieClip)
|
[  DisplayObject , DisplayObjectContainer , DisplayObjectContainer ]
index 0                                 index  1                         index  2


الدالة addChild تشبه الدالة push التي رأيناها في درس الجداول
فهي تضيف كائن جرافيكي الى جدول الأطفال
حيث تقوم بإضافته في اخر القائمة و هذا يعني انه في الشاشة سيظهر فوق كل الكائنات الجرافيكية .
و لكن هناك طريقة أخرى لإضافة الكائن في index من اختيارنا نحن المبرمجون 
و هذا عن طريق الدالة addChildAt


______________________________________________


الدالة addChildAt:

كود الدالة
public function addChildAt(Child : DisplayObject, index : int) :DisplayObject


الدالة addChildAt تقبل مدخلا ثانيا و هو index و الذي سنضع فيه الكائن من نوع DisplayObject
داخل قائمة الأطفال الخاصة بكائن اخر من نوع DisplayObjectContainer

اليكم هذا المثال

var mc : MovieClip = new MovieClip();
addChild(mc);

var mySprite : Sprite = new Sprite();
addChildAt(mySprite, 0);

في السطر الثاني من الكود يتم اضافة الكائن mc الى قائمة الاطفال الجرافيكية الخاصة ب MainTimeline
الكائن mc يملك الاندس 0 حاليا
ثم أنشأنا كائنا من نوع Sprite 
و أضفناه عن طريق الدالة addChildAt الى قائمة اطفال ال MainTimeline
الكائن sprite لن يأخذ الأندكس 1 لأننا لم نضفه عن طريق الدالة addChild
و انما سيأخذ الاندكس 0 بينما الكائن الاول (mc) سينتقل الى الاندكس 1 (لن يُحذف و إنما ينتقل الى أنكس اخر)


قبل استعمال الدالة addChildAt يجب التأكد من أن الاندكس الذي نريد وضع الكائن فيه موجود
فلو عدنا الى الكود السابق
addChildAt(mySprite, 0 )

يمكن وضع الكائن الحالي في الاندكس 0 (كأول طفل)
لو غيرنا القيمة 0 الى 1 تبقى صحيحة
لأن ال MainTimeline يملك طفلا (و هو mc من نوع MovieClip) في الاندكس 0
و هذا ما يعني أن الطفل الجديد يمكن أن يحمل الاندكس 1

لكن لو جرّبنا هذا الكود


var mc : MovieClip new MovieClip();
addChild(mc);

var mySprite : Sprite = new Sprite();
addChildAt(mySprite, 5);

سنتحصل على رسالة خطأ من نوع RangeError
و هذا راجع الى أن الاندكس الذي نريد أن نضع فيه الطفل الجديد خارج المجال.

لتصحيح هذا الخطأ يجب أن تكون قيمة الأندكس للطفل الجديد أصغل من أو تساوي numChildren الخاص ب DisplayObjectContainer
و أكبر من أو يساوي 0


___________________________________

في الدرس القادم سنرى مختلف الطرق التي تمكننا من الدخول الى طفل ما موجود في القائمة لكي نُجري عليه 
مختلف العمليات (كتغيير موقعه في الشاشة, أو زاويته ..الخ)


ليست هناك تعليقات:

إرسال تعليق


جميع الحقوق محفوظة لمدونة 2014-2015 as3arabic |