Display List در AS3

BioDread

Banned
کسانی که از as2 به as3 میان با یه واژه عجیب به اسم display list مواجه میشن که شاید با خودشون فکر کنن که شرکت adobe باز جادو کرده :D

من با این واژه مشکل داشتم و نمی دونستم چیه و به چه دردی می خوره تا اینکه..
تا اینکه یه نفر پیدا شد و یه مقاله راجع به این نوشت ومنو و خیلی دیگه از دوستان رو نجات داد

اسم ان شخص پوركوشكی بود :neutral:

دیدم باز دوستان با این واژه مشکل دارن رفتم پیداش کردم و تو یه تاپیک جدا گذاشتم تا دوستان راحتر پیداش کنن! :rose:

این مقاله برای 4 ماه و یا قدیمی تره و هر بار میخونم دوست دارم ان دکمه تشکر رو دوباره فشار بدم
من از ایشون متشکرم!!!

تمامی ایم مقاله رو پوركوشكی نوشته!!!

بيشتر برنامه نويسان AS2 وقتي رو به AS3 مي‌آورند با اين موضوع حتما برخورد خواهند كرد كه چرا مسيرهاي parent و root به آن شكلي كه در نگارشهاي قبلي با آن كار مي‌كردند فرق كرده ، من در اين مقاله تا حدي به اين مسئله مي‌پردازم ، پس در ابتدا براي درك بهتر با يك مثال آغاز مي كنيم :
ما در تايم لاين اصلي فلش و در stage ، دو عدد مووي كليپ با نام هاي clip1_mc و clip2_mcداريم و در درون clip1_mc يك فرزند از نوع مووي كليپ با نام clip3_mc را ايجاد نموده‌ايم. مي‌خواهيم از درون clip3_mc و در فريم 1 به موقعيت x مووي كليپ clip2_mc روي تايم لاين اصلي دسترسي نماييم.

PHP:
// AS2
// مسير نسبي
this._parent._parent.clip2_mc._x;
// مسير مطلق
_root.clip2_mc._x;
 
 
 
// AS3 براي حل مثال فوق در 
// مسير نسبي
MovieClip(parent.parent).clip2_mc.x;
Object(parent.parent).clip2_mx.x;
// or
var myParent = parent.parent;
myparent.clip2_mc.x;
 
// مسير مطلق
MovieClip(root).clip2_mc.x;
Object(root).clip2_mc.x;
// or
var myRoot = root;
myRoot.clip2_mc.x;

اگر در مثال فوق ، فرمت كد AS2 را براي AS3 استفاده مي‌كرديم با خطا مواجه مي‌شديم. چون در AS3 يك مفهوم جديد و اساسي بنام DisplayList (ليست نمايش) مطرح شده است ، ليست نمايش ، ساختارهاي درختي سلسله مراتبي دارد كه تمام DisplayObject (شي نمايش) ها به آن اضافه مي‌شوند. بالاترين شي نمايش ، يعني root (ريشه) درخت يك DisplayObjectContaner (كانتينر شي نمايش) Stage است كه مي‌تواند شامل چندين شي نمايش و يا كانتينرهاي شي نمايش ديگه هم باشد. در پايين كانتينر Stage ، تايم لاين اصلي (فايل swf اصلي برنامه) وجود داره كه معمولا كانتينر MovieClip است (اين كانتينر مي‌تواند نوع ديگر گسترش يافته (Extends) از كانتينر Sprite هم باشد).

AS3-DisplayList.jpg


لازم به ذكر است كه DisplayObjectContaner ها ، زير كلاسي از كلاس DisplayObject است كه شامل (Stage – Sprite – MovieClip – Loader) مي‌باشد و فقط كانتينرهاي شي نمايش مي‌توانند داراي فرزنداني از نوع شي نمايش و يا حتي از نوع خود كانتينرهاي ديگر باشند.

AS3-DisplayObject.gif


پس مطالب فوق به اين صورت شد كه ، ما DisplayList اي داريم كه تمامي شي نمايش هاي ما را نشان مي‌دهد ، اولين كانتينر اين ليست نمايش ، كانتينر شي نمايش Stage است و داخل اين كانتينر Stage ، كانتينر ديگري كه همان تايم لاين اصلي ماست و از نوع MovieClip است وجود دارد. و مابقي ساختار اين درخت رو ما بايد با اضافه نمودن كانتينرهاي مورد نظر خود و بسته به ساختار برنامه‌هايمان ايجاد كنيم به عبارتي ديگر كانتينرها مثل شاخه‌هاي اين درخت مي‌مانند كه به اندازه دلخواه مي‌توانند توسط فقط اضافه كردن كانتينرهاي جديد شاخه دار شوند و مي‌توانند به اندازه شي نمايش‌هاي داخل خود ، برگ (فرزند) داشته باشند. (جهت اطلاعات كاملتر به Help فلش مراجعه نماييد)
حالا با اين توضيح اجمالي از ساختار ليست نمايش AS3، به سه خصوصيت: root و parent و Stage در AS2 و AS3 مي‌پردازيم.

root_ در AS2 :
خصوصيت root_ در As2 ، هميشه به تايم لاين اصلي (فايل swf اصلي) ما اشاره دارد. زيرا اين يك متغير از نوع global (عمومي و سراسري) فيلم فلش ما محسوب مي‌شود. به همين خاطر است كه اگر يك swf خارجي كه از خصوصيت root_ در آن استفاده شده را در فايل swf اصلي‌مان بارگذاري كنيم ، root_ به تايم لاين اصلي بارگذاري شونده‌ اشاره خواهد كرد نه swf بارگذاري شده. (مگر اينكه خصوصيت lockroot_ را براي swf خارجي برابر True قرار داده باشيم)

root در AS3 :
خصوصيت root در AS3 ، هميشه به تايم لاين اصلي (فايل swf اصلي) ما اشاره نمي‌كند و به عنوان يك متغير متعلق به DisplayObject خود معرفي مي‌شود. خصوصيت root هم اكنون مبني بر ساختارهاي درختي سلسله مراتبي از شي است و به همين خاطر است كه root هميشه به شي يكساني اشاره نمي‌كند. براي درك بهتر به نكات زير توجه نماييد:
1. root براي شي Stage ، اشاره به خود شي Stage دارد.
2. root براي تايم لاين اصلي و تمام DisplayObject هاي داخل آن ، اشاره به تايم لاين اصلي دارد.
3. root براي DisplayObject هايي كه در swf بارگذاري شده‌اند ، اشاره به تايم لاين اصلي فايل swf دارد.
4. root براي تصاوير بارگذاري يك شي Bitmap ، اشاره به خود شي Bitmap دارد.
5. root براي نمونه‌اي از كلاس اصلي از فايل swf اول بارگذاري شده ، اشاره به خود DisplayObject دارد.
6. root براي هر DisplayObjet كه به DisplayList اضافه نشده باشد ، Null است.
(شايد مواردي جا افتاده باشه كه خودتون با تمرين و مطالعه به آنها پي ببريد)

AS3-root.jpg


t_ در AS2 :
خصوصيت parent_ در AS2 ، هميشه به آبجكتي كه شي جاري ، شامل آن است اشاره دارد. و راهي است براي پيمايش يك ساختار درختي كه از نوع MovieClip است. همه اشياي بصري در تايم لاين اصلي با level0_ شروع مي‌شوند و يا به عبارتي ، زنجيره والد بالاي سلسله مراتب كانتينر level0_ را مي‌پيمايد. مگر اينكه با دستور loadMovieNum فايل swf خارجي را در level_ ديگري بارگذاري كنيم.

parent در AS3 :
خصوصيت parent در AS3 ، كانتينر شي نمايش كه حاوي همين شي نمايش است را نشان مي‌دهد. خصوصيت parent براي مشخص كردن يك مسير وابسطه يه شي نمايش كه بالاي شي نمايش جاري در ليست سلسله مراتبي است بكار مي‌رود.

Stage در AS3 :
ريشه ليست نمايش است يعني بالاترين شي نمايش در ساختار سلسله مراتبي درخت محسوب مي‌شود. شما مي‌توانيد با استفاده از خصوصيت Stage هر شي نمايش به كانتينر Stage دسترسي پيدا كنيد و هر برنامه فقط مي‌تواند داراي يك كانتينر Stage باشد.

نكته آخر بحث اينكه:
1. در AS2 تمامي اشيا درون كلاس MovieClip ايجاد و يا حتي ترسيم مي‌شدند و خود فلش مي‌دانست شي parent_ و يا root_ شما از چه كلاس و جنسي است ولي در AS3 كه Class-Base است MovieClip يكي از كلاسهاي كانتينر آن را تشكيل مي‌دهد. بنابراين شما در هنگام استفاده از parent و root بايد به فلش بگوييد كه از چه كانتينر شي نمايشي داريد استفاده مي‌كنيد.
2. در AS2 اشيا بصري درون فيلم فلش به ترتيب چيدمان خطي اضافه مي‌شوند (از طريق سطوح عمق) ولي در AS3 ساختارهاي درختي سلسله مراتبي و مباحث DisplayList و DisplayObject و DisplayObjectContaner مطرح است.

يا علي

با تشکر از پوركوشكی :rose:
امید وارم به درد تون بخوره!
 

جدیدترین ارسال ها

بالا