آموزش ActionScript 3.0 از صفر تا بینهایت

وضعیت
موضوع بسته شده است.

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 - درس بیستم

بسم الله الرحمن الرحیم
بحث کلاس و برنامه نویسی شی گرا (Object oriented Programing and OOP)
توجه : فایل PDF کلی بحث شی گرایی در آدرس های زیر قرار گرفته شد .
در پست اولhttp://www.forum.majidonline.com/showthread.php?t=113351&page=6
سلام عرض می کنم خدمت دوستان عزیز

در ابتدا از همه دوستانی که این تایپیکو به اینجا رسوندن بخصوص آقا جواد تشکر می کنم و با کسب اجازه از ایشون و شما سروران محترم ، بحث کلاس رو شروع می کنم . محض اطلاع قرار شده این مبحثو بنده آموزش بدم .
برای شروع بحث در مورد کلاسها لازم دیدم که مقدمه ای بر مفهومObject Oriented Programin یا همون OOP داشته باشم تا اگه دوستانی در این مورد اطلاعاتی نداشته باشن ، از این مطالب استفاده کنن .چرا که این شروع لازمه تفهیم مبحث کلاسه. امیدوارم بتونم رضایت شما رو جلب کنم.
دیدگاه object oriented از چند دهه اخیر ، تحولی عظیم در دنیای برنامه نویسی ایجاد کرد (اوایل دهه 1970 میلادی توسط آلن کی((alan kay )) و اصول اون بر مبنای طراحی کلاس بود و جالبه تا این حد بدونین که ایده اولیه اون از سلولها و رفتار ها و مشخصات و روابط بین اونها آغاز شد.همونطوری که در دنیای کامپیوتر و سیستم عامل ، همه چیز از حالت نوشتاری جدا می شد و به سمت انتخابی شدن و گزینه ای شدن پیش می رفت ، برنامه نویسان هم به این اصل رسیدند که بهتره برنامه هاشونو از حالت کد نویسی تو در تو و از صفر شروع کردن در بیارن و به یه حالتی شبیه انتخابی شدن گزینه ها ببرن . پس به فکر افتادن که دیگه هر دستور و هر چیزی رو در کلاسهای مخصوصی قرار بدن.
کلاس در حقیقت به ساختار، نقشه و یا طرحی از چیزی گفته می شه که باید باشه یا می تونه باشه ، می تونه پارامتر هایی رو از انواع گوناگون به خودش اختصاص بده و با استفاده از این مشخصات و خصوصیات، رفتار ها و اعمالی خاص رو انجام می ده و این مشخصات (properties) و رفتار ها (methode) در ساختار کلاس ، کپسوله یا بسته بندی می شن. برای درک بهتر کلاس ، متغیر ها می تونند نقش مشخصه ها و توابع می تونند نقش رفتارها رو بازی کنن.
پس از طراحی کلاس ، نمونه های مختلفی (گاه میلیونها و حتی بیشتر) از این کلاس بوجود می یان و به هر کدوم از این نمونه ها در هنگام تولدشون ، مشخصاتی خاص و گاه یکتا تعلق می گیره و هر نمونه ، با استفاده از مشخصاتش ، رفتار خاص خودشو بروز می ده.لازم به ذکره که این متد (همون تابع ) در کلاس به صورت کلی تعریف شده. با دیدی بهتر می تونیم بگیم این نمونه ها یا اشیا (object) ، مشخصات و متد های کلاس مادر رو به ارث می برند.
مثالی ملموس از کلاس : کلاسی مثل کلاس انسان رو در نظر بگیرید . یک انسان نرمال انسانی هست با یک سر و دو دست و دو پا و یک تنه و شکم و ...
نمونه های مختلف انسانی در داشتن مشخصاتی مثل ژن ، جنس گوشت ، جنس خون ، اثر انگشت ، قد ، وزن و غیره ...از همدیگر کاملا مجزا و یکتا هستند و شاید هیچ دو انسانی در این چرخه از یک قیافه کاملا یکسان یا از یک اثر انگشت کاملا یکسان برخوردار نباشه و در داشتن گروهی از مشخصات قراردادی مثل اسم ،فامیلی،نام پدر و ... می تونن مثل و مانندهای زیادی رو داشته باشن ولی اصولا هر کدوم از این مشخصات مختلف برای تفکیک هر نمونه از بقیه نمونه هاست و گوناگونی این مشخصات ، گوناگونی در رفتارها رو سبب می شه. به این شکل توجه کنین:
Class%20Doc.jpg

البته بحث انسان پیچیده تر از این حرفهاست و مثلا در شرایط یکسان به اون اختیار اعمال گوناگونی اعم از خوب و قبیح داده شده و شاید مثالی درست برای این بحث نباشه ولی یکی از ملموس ترین مثالهایی هست که می شه گفت . با این گفتار یکی از چیزهایی که ثابت می شه اینه که انسان واقعا موجود پیچیده اییه.
پس از متولد شدن این نمونه ها ، یکی از این نمونه ها مثلا به اسم آرنولد از مشخصه قدرت زیاد برخوردار می شه و این یه خصیصه است که مثلا برای تعریف اون ، متغیر عددی به نام قدرت به عموم نمونه های انسانی تخصیص داده شده و به مشخصه عددی قدرت آرنولد مقدار 100 اختصاص داده شده و به خاطر این ، از رفتاری مثل غرور زیاد برخوردار می شه .در این مثال فرض بر اینه که غرور یه تابع هست و پارامتر ورودی اون ، مشخصه قدرت هست و هر چی قدرت بیشتر باشه ، غرور هم با یه فرمولی بیشتر می شه.
کلاس مثل نقشه ساختمونی می مونه که بعد از تکمیل اون ، گاهی هزاران ساختمان شبیه به هم از روی اون می سازن با این تفاوت که بحث کلاس از این چیزا هم داینامیکتره و می تونیم هزاران نمونه مختلف رو با مشخصات و صفات مختلف بوجود بیاریم که همگی در یه رده و یه ساختار خاص فعالیت می کنن و برا هر کدوم محدودیتهایی تعیین می شه .(گروهی مشخصات و گروهی رفتارهایی که از مشخصات سرچشمه می گیرن) .
اینک فرض کنین ویرایش کلاسی مثل کلاس انسان رو به شما بدهند و بگند که اختیار اینو داریند که تغییراتی در کلاس کلی اون اعمال کنین و شما در تعریف اون ، مثلا دو سر و سه دست و پنج پا به اون بدیند. بعد از ویرایش ، مشاهده خواهید کرد که بنده حقیر و شما و همه نمونه های مختلف از این کلاس در هر زمانی(حال و آینده) ، دارای دو سر و سه دست و پنج پا خواهیم بود بدون اینکه نیازی به زحمت زیادی و کار اضافی با تک تک نمونه ها باشه و فقط کافیه تایید ویرایش رو بزنین و این یعنی تار و پود بحث کلاس.
در مسائل کلاس و در اکثر اوقات با نمونه هایی سر و کار داریم که محصول مشترک گاه هزاران کلاس مختلفند که این کلاسها برخی از برخی ارث بری دارند و از متدها یا خصوصیتهای هم استفاده می کنند و در نهایت ، کلاسی ، کار نهایی را با هماهنگی عملکرد تمامی این کلاسها به پایان می رسونه.
برای مثال عینی ، انسان رو در نظر بگیرین که می تونیم اونو در کلاس موجودات خشکی قرار بدیم و در این کلاس اونو جزء کلاس مهره داران به حساب بیاریم و از این نمونه مثالها.
انشاءا... در اینده ای نزدیک ، این بحث رو تا ساختن کلاس و کار کردن با اون ادامه خواهیم داد...
در ضمن به این لینک مراجعه کنین چون برا شروع کلاس ، بحث خوبیه:
http://www.forum.majidonline.com/showthread.php?t=76624
در ضمن سعی می کنم pdf این بحثو آماده کنم و در اسرع وقت اونو پیوست کنم.
بای...
 
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 - درس بیست و یکم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]
[FONT=&quot]شروع کار با کلاسها [/FONT]
دو نکته رو در شروع این بحث می گم :
1-من متاسفانه فقط به فلش cs4 دسترسی دارم و مثالهایی که می گذارم با فلش cs4 طراحی شده اند و آموزشام و عکسهام به این نسخه هست.
2- این جلسه شمای کلی و اولیه از بحث اولیه کلاسها می گم و در جلسات بعدی این مباحثو بازتر می کنم و با مثال بهتون می گم تا بهتر با این مطالب آشنا بشین.

خوب شروع می کنم :
برای کار کردن با کلاسها ما نیاز به این داریم تا یک کلاس رو در یک فایل از نوع کلاسی اکشن اسکریپت یا نوع .as بنویسیم. برای ساختن این فایل ها مثل شکل زیر عمل می کنیم:
1.jpg

وقتی هیچ فایلی در فلشمون باز نیست مثل مثال بالایی این نوع فایل رو درست می کنیم و وقتی فایلی بازه ، از منوی فایل گزینه new رو زده و پنجره ای مثل پنجره پایینی باز می شه . بعد از کلیک کردن گزینه action script file ، وارد یه فایل کلاسی می شیم که فقط می شه در اون کد اکشن نوشت (فضای گرافیکی نیست). بعد از وارد شدن باید این فایلو در جای مناسبی با اسم مناسب save کنیم . دقت کنید پسوند این فایلها .as هست.
نکته خیلی مهم : 3 تا اسم در ساختن یک کلاس باید دقیقا مثل هم باشن ، حتا از نظر حروف بزرگ و کوچیک:
1-اسمی که می خواهیم روی کلاس بگذاریم.
2-اسمی که می خواهیم روی فایل کلاسیمون بگذاریم یعنی اسمی که فایل .as رو با اون اسم save می کنیم.
3-اسم تابع سازنده یا constructor که در کلاس قرار می گیره و بعد ها به اون اشاره می کنیم.
مثلا اگه قرار باشه اسم کلاسمون باشه myNEWclass ، پس اسم فایلمون می شه myNEWclass.as و اسم تابع سازندمون می شه myNEWclass()
نکته درباره خروجی گرفتن از کلاس: در هنگام خروجی گرفتن از فایلی که کلاسهای خارجی اکسترنال طراحی شده یه فایل سورس فلش (.fla) حتما نیازه تا کلاس در اون اعمال شه و خروجی گرفته شه و در آینده این مطالبو باز می کنیم.
نکته بعدی هم اینه که به فایل های کلاس (.as) فقط در هنگام خروجی گرفتن برا سورس .fla نیاز هستن و بعد از خروجی نهایی فایل swf ، می تونیم swf رو بدون فایل های کلاسی به هر جایی کپی کنیم بدون اینکه نقصی در اجرای اون بوجود بیاد،(پس از این به بعد اینو به خاطر بسپارین :فایل swf بعد از خروجی گرفتن دیگه نیازی به فایل کلاس نداره).خیلی ها فایل های کلاس رو با ایکسمل و فایل های خارجی دیگه قاطی می کنن و فکر می کنن مثل اونا ، بعد از خروجی ، swf به حضور اونا در کنار خودش نیاز داره. نکته بعدی اینه که ما می تونیم با برنامه notepad فایل های کلاسی .as رو باز و ویرایش کنیم . همچنین لازم به ذکره که بعد از ویرایش یک فایل کلاسی باید اونو با زدن دکمه های ترکیبی ctrl+S ذخیره کنیم تا اثر خودش رو در خروجی بگذاره وگرنه هر چقدر هم که ویرایش صورت بگیره ، بدون Save کردن ، تأثیری رو در خروجی نخواهد داشت .
در طرایق استفاده کردن از یه کلاس حالت های مختلفی می تونه پیش بیاد که بهتره اونا رو بگم و اون حالتها اینا هستن:
حالت شماره 1:
ما از یه فایل کلاسی استفاده می کنیم و این فایل کلاسی ، فایل راه انداز و اصلی یک سورس فلش هست. به زبان ساده تر ما تمام سناریوی فلشمون رو از اول تا آخر در یه فایل کلاسی می نویسیم .در این حالت ما از یه فایل سورس .fla به عنوان لازمه اجرای کلاس و به عنوان انباره ای از مووی کلیپ ها و انیمیشن ها و افکت ها استفاده می کنیم .وقتی ما پروژه ای رو می خواهیم با روش یه کلاس اصلی راه انداز انجام بدیم ، باید اون کلاس رو به سورس فلش معرفی کنیم و بگیم تمام سناریوی اصلیت در این فایل کلاس نوشته شده. برای نشون دادن اون کلاس به سورس، باید مثل شکل زیر به فایل سورس بریم و در پنل properties در کادر class ، اسم کلاسمون رو بنویسیم واون فایل کلاسی رو کنار سورسمون قرار بدیم (در همون پوشه و دقیقا کنار سورس)

2.jpg



اگر هم کنار سورسمون نگذاریم با روشی که بهتون خواهم گفت باید اون کلاس رو به سورس آدرس دهی کنیم. گاهی اوقات در استفاده کردن از کلاس اصلی ، ما نیاز به استفاده از کلاسهای دیگه هم داریم و اونا رو هم خواهیم گفت. شایان ذکر هست در روش کلاس اصلی راه انداز ، استارت اجرای فلش از فایل کلاس و از تابع سازنده یا constructor واقع در اون زده می شه که در جلسه بعدی در مورد اون توضیح می دم.
حالت شماره 2:
کلاس تعریف شده مون یک جزء کوچک از کل برنامه اصلیمون هست و برنامه اصلی ، کاری به کار این کلاس نداره و این در محدوده خودش کار خودشو انجام می ده و اون یکی هم در محدوده خودش.در حقیقت ما گاهی نیاز به این داریم که مثلا فقط به یه مووی کلیپ برنامه بنویسیم و بگیم که مثلا اگه موس روش رفت باید چیکار کنه ، در این حالت ، برنامه های اصلی سورس ما یا در خود سورس فلش هست و یا مثل حالت قبل در یه فایل خارجی کلاسی هست و اون به کار خودش و این به کار خودش مشغوله . در این شرایط و در فایل سورس روی مووی کلیپ انتخابیمون می ریم و اونو export for action script می کنیم و برای این کار در هنگام تبدیل یک شکل به مووی کلیپ ، به یک پنجره بر می خوریم که از ما اسم مووی کلیپ رو برا شناساییش در پنل کتابخونه یا library می پرسه. روی اون دکمه ای هست که برچسبش هست basic ، وقتی کلیک می شه ، عنوانش تبدیل به advanced می شه. وقتی کادر زیر این پنل باز می شه و تیک گزینه export for actionscript زده می شه ، اسم کلاس جزئیمونو در قسمت class وارد می کنیم و در کادر base class ، اسم کلاس اصلی مووی کلیپ ها رو (flash.display.MovieClip) می نویسیم.


3.jpg


نوشتن کلاس اصلی مووی کلیپ در قسمت base class ، به این دلیل هست که برای استفاده از هر مووی در کلاسها و در اکشن ، باید اونو فرزند و زیر کلاس مووی کلیپ ها کنیم. حقیقت اینه که این مووی کلیپ ما ، به کلاسی تبدیل می شه که از کلاس اصلی مووی کلیپ ها گروهی از خصوصیات و متد ها رو به ارث می بره تا در سیستم مووی کلیپ ها کار کنه و بتونه با متد های کلاس display به نمایش در بیاد.از طرفی چون خودش یه نوع مووی کلیپ هست باید ارث بری اصلیشو از کلاس اصلی مووی کلیپ ها داشته باشه.معمولا در تعریف کلاسها باید اونهارو زیر کلاسی از کلاسهای اصلی فلش کنیم تا وابسته به اونها ، خصوصیات و متد های لازم رو به ارث ببرن و بتونن در محدوده ای خاص کار کنن.(در آینده بحث ارث بری رو کامل تر توضیح می دیم.) راه دیگه ای هم برای export for action هست و اون اینه که در کتابخونه (library ) روی مووی کلیپ مورد نظرمون کلیک راست می کنیم .در فلش cs3 گزینه linkage رو می زنیم. این گزینه در فلش cs4 حذف شده و برا این کار باید از منوی کلیک راست روی کتابخونه گزینه propertie رو انتخاب کنیم تا به کادر تبدیلی مووی کلیپ بریم و همون دکمه basic/advanced رو می زنیم و همون پنل export for actionscript باز می شه و ...
4.jpg



بعد از این کار همون پنجره export for action script باز می شه و در کادر متنی Class یه اسم مثل myMovieClass رو وارد می کنیم و کلاس اصلی اونو flash.display.MovieClipقرار می دیم ( Base Class) تا زیر کلاسی از مووی کلیپ ها باشه و ارث بریشو از اونا داشته باشه .در کنار فایل سورس یک فایل کلاسی .as درست می کنیم و اسم اونو همونی می دیم که در کادر export for action/class دادیم و دستوراتمونو داخل اون می نویسیم و مشاهده می کنیم که از تداخل کلاسی مثلا به اسم myMovieClass و مووی کلیپی با اسم کلاسی myMovieClass که از قضا هر دو زیر کلاس (کلاس فرزند) مووی کلیپ ها شدند (extends MovieClip-base class)چه اتفاقی می افته. ما در جلسات بعدی در این مورد مثالی می زنیم. به این روش ، در اصطلاح همپوشانی یک مووی کلیپ و یک کلاس گفته می شه .
حالت شماره 3:
ما کلاسی رو تعریف می کنیم و اونو در کلاسی دیگه یا در یک فایل سورس وارد می کنیم (import) و از اون یک یا چند نمونه(object) می سازیم و با اونها کار می کنیم . در این حالت معمولا مجموعه کلاسهامون نقش انباره ای از متد ها و مشخصات رو بازی می کنن که با مجموعه اونها ما یک کار بزرگی رو تموم می کنیم .فرض کنین ما برای ساختن یک گالری 3 بعدی با کلاسی مثل کلاسهای papervision کار می کنیم که کلاس یا کلاسهایی رو برا دوربین 3 بعدی و یا صحنه 3 بعدی و یا نور پردازی و غیره ... تعریف کردن و کافیه در یه فلش 3 بعدی از این کلاسها استفاده کنیم و اونا رو در پروژه وارد (import) کنیم و مثلا نمونه یا دو نمونه از کلاس دوربین 3 بعدی رو بسازیم و یک نمونه از صحنه 3 بعدی رو طراحی کنیم و دو نمونه دوربین رو از زوایای مختلف در نمونه ساخته شده از صحنه 3 بعدی قرار بدیم و ... در آینده ایم مفهوم رو هم بازتر می کنیم .
حالت شماره 4: ما می تونیم یه کلاس اصلی تعریف کنیم مثل کلاس A و بعد یک یا چند تا کلاس دیگه مثل B تعریف کنیم که با دستور extends کلاس ها دیگه (B) زیر کلاس A بشن. در این حالت زیر کلاسهای (B) ، گروهی از خصوصیات و متد های کلاس اصلی یا کلاس مادر (A) رو به ارث می برن .حتی گروهی از خصوصیات و متد هایی رو که دیگر کلاسها از دسترسی به اونها محرومند . در آینده در این مورد بحث می کنیم.
حالت شماره 5: حالت دیگه ای هم از تعریف و استفاده از کلاس هست و ما کلاسهای داینامیک طراحی می کنیم و تفاوت این کلاسهای داینامیک با کلاسهای معمولی و استاتیک در این هست که می تونیم بعد از طراحی کلاسهای داینامیک ، اونا رو در پروژه ها import و نمونه سازی کنیم و به نمونه های متولد شده ، گروهی از مشخصات و متد های جدید رو اختصاص بدیم ، اونم خصوصیات و متد هایی که در کلاس اصلی نبوده اند . یعنی دست ما در طراحی نمونه های ساخته شده از کلاس داینامیک بازتر هست و نمونه ها می تونن تا حدودی از ساختار استاتیک کلاس اصلیشون فاصله گرفته و چیز های جدیدی رو هم داشته باشن.در این مورد هم بحث خواهیم کرد.

حالت شماره 6:استفاده از کلاسهایی با مشخصه ها و متد های استاتیک ، به این مفهوم که ما مشخصه یا متد کلاسی رو از نوع استاتیک تعریف می کنیم و این مشخصه یا متد استاتیک ، در ساختار کلی کلاس ، مخصوص اصل کلاس طراحی می شه.

نمونه های ساخته شده از این کلاس ، اون مشخصه ها یا متد های استاتیک رو به ارث نمی برن و در واقع کلاس ما ، انباره ای از مشخصات و متدهای استاتیک می شه که در ساختن متغیر ها و توابع سراسری یک سورس فلش ، بکار می ره . در آینده بطور مفصل در این باره بحث می کنیم.


انشاء ا...در آینده به طور مفصل به این بحثها می پردازیم...
***زکات علم آموختن آن به دیگران است***


__________________
 
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3- درس بیست و دوم

[FONT=&quot]بسم الله الرحمن الرحیم
ساختار کلاس در اکشن اسکریپت 3
[/FONT]
[FONT=&quot]سلام بر شما دوستان گرامی
[/FONT]
[FONT=&quot]شروع بحث[/FONT][FONT=&quot]: [/FONT]
[FONT=&quot]اکشن اسکریپت 3 یکی از زبونهای شی گرا هست که در تعاملش با فایل های کلاسی ، کارهای خارق العاده ای رو انجام داده[/FONT][FONT=&quot] . [/FONT][FONT=&quot]ما در این مبحث ساختار داخلی یک کلاس رو ترسیم می کنیم . در کارهای حرفه ای تر ، سیستم ها و حالت ها و دستورات دیگه ای هم هستن ولی ما سعی می کنیم ساختار مقدماتی و اولیه ی کلاس رو بهتون بگیم.اگر درآینده توفیق باشه تا دستورات و ساختار کاملتر کلاس رو بنویسیم ، این کار رو حتما انجام می دیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]به شکل زیر توجه کنین ، نواحی شماره گذاری شده در زیر شکل و در ادامه بحث ، شماره به شماره توضیح داده شدند. [/FONT]

1.JPG



[FONT=&quot]ناحیه شماره 1 : [/FONT][FONT=&quot]هر کلاس باید در یک بسته یا [/FONT][FONT=&quot]package [/FONT][FONT=&quot] قرار بگیره و بدون نوشتن بسته ، نمی تونیم کلاس رو تعریف کنیم. در مباحث بعدی فرم اصلی بسته بندی در فولدرهای تو در تو (کتابخانه ای) رو توضیح می دیم ولی تا این حد بدونین که کلاس اصلی رو در یک بسته تعریف می کنیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ناحیه شماره 2: [/FONT][FONT=&quot]در این قسمت ما تمام کلاسهایی رو که اونا رو برای تعریف و کار با کلاس خودمون نیاز داریم ، به بسته خودمون وارد می کنیم . ما گاهی نیاز داریم که نمونه ای از اون کلاسها رو در کلاس خودمون بسازیم و یا از متد های اونا در کلاس خودمون استفاده کنیم و یا کلاس اصلی خودمونو زیر کلاس اونها قرار بدیم . دقت داشته باشین که وقتی مثلا می خواهیم با صحنه یا مووی کلیپ ها تعامل داشته باشیم و یا برای مثال با رویدادهایی مثل رویدادهای موس (کلیک – لمس موس و غیره[/FONT][FONT=&quot] ...( [/FONT][FONT=&quot]در کلاسمون کار داریم ، حتما باید اونا رو از این طریق وارد بسته کلاسمون کنیم وگرنه به [/FONT][FONT=&quot]error [/FONT][FONT=&quot]می خوریم. طریقشم اینه که اول [/FONT][FONT=&quot]import [/FONT][FONT=&quot]رو می نویسیم و بعد کلاسها رو بسته به بسته (فولدر به فولدر[/FONT][FONT=&quot] ) [/FONT][FONT=&quot]از [/FONT][FONT=&quot]root [/FONT][FONT=&quot]کلاس خودمون تا رسیدن به کلاس مورد نظر می نویسیم[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]
[/FONT]
PHP:
import folderInside1.insidedFolder.NeededClass;
[FONT=&quot]و فرضمون هم اینه که کنار سورس یا کلاس اصلیمون ، فولدری به اسم [/FONT][FONT=&quot]folderInside1[/FONT][FONT=&quot] و داخل اون ، فولدر دیگه ای به اسم [/FONT][FONT=&quot]insidedFolder[/FONT][FONT=&quot]و داخل اون ، فایل کلاسی به اسم [/FONT][FONT=&quot]NeededClass.as[/FONT][FONT=&quot]هست.در آینده به طور مفصل به این بحث (بسته بندی) می پردازیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در وارد کردن کلاسهای پیش فرض فلش هم کافیه بعد از نوشتن [/FONT][FONT=&quot]import[/FONT][FONT=&quot] کلمه [/FONT][FONT=&quot]flash[/FONT][FONT=&quot] رو نوشته و الباقی بسته ها رو با دات[/FONT][FONT=&quot] (.)[/FONT][FONT=&quot]دنبال کنیم تا به کلاس مورد نظر برسیم. مثل[/FONT][FONT=&quot] :[/FONT]

PHP:
  import flash .display.MovieClip;
import flash.events.MouseEvent;
[FONT=&quot]ناحیه شماره 3:[/FONT][FONT=&quot]در این قسمت ما کلاس خودمون رو تعریف می کنیم . در بحث کلاسهای اکشن اسکریپت 3 ، ما با 4[/FONT][FONT=&quot]سطح دسترسی به کلاسها ، خصوصیات و متد ها روبرو هستیم که عبارتند از: [/FONT][FONT=&quot] public , private , internal , protected[/FONT][FONT=&quot]، در ادامه این بحث در مورد اینها توضیح می دیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ما با نوشتن عبارت [/FONT][FONT=&quot]public[/FONT][FONT=&quot] ، این کلاس رو از نوع دسترسی عمومی قرار دادیم تا هر جایی از برنامه ها یا کلاسها که نیاز شد ، بتونیم از این کلاس استفاده کنیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]نوشتن کلمه کلیدی [/FONT][FONT=&quot]class[/FONT][FONT=&quot] برای تعریف کلاس حتما لازم هست . در انتخاب نام کلاس باید دقت داشت که اسم کلاس، اسم تابع سازنده یا [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] و اسم فایل کلاسیمون[/FONT][FONT=&quot] ([/FONT][FONT=&quot]as.[/FONT][FONT=&quot]) [/FONT][FONT=&quot]باید حتا از نظر حروف بزرگ و کوچیک یکی باشن.در تعریف کلاس ، بعد از نام کلاس با نوشتن کلمه [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] ، می تونیم اونو زیر کلاس یک کلاس دیگه قرار بدیم و و این واسه اونه که کلاس خودمون رو زیر کلاسی (کلاس فرزندی) از کلاس های اصلی قرار بدیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot]با این کار ، گروه زیادی از مشخصات و متد های کلاس اصلی در این کلاس قرار می گیره و به عبارت بهتر ، کلاس تعریف شده ما گروه بسیاری از مشخصات و صفات کلاس اصلی (پایه ) رو به ارث می بره تا در اون محدوده کار کنه . در قسمت سطح دسترسی ها به طور کامل به این موضوع می پردازیم. در آخر هم اسم کلاس اصلی که قرار هست کلاس پدر باشه ، نوشته می شه مثل : [/FONT]
[FONT=&quot]MovieClip ,Sprite,events,…[/FONT]
[FONT=&quot]نکته مهم: فایل کلاسی که کلاس اصلی راه انداز یه سورس هست ، باید از کلاس اصلی مووی کلیپ ها[/FONT][FONT=&quot] ([/FONT][FONT=&quot]MovieClip[/FONT][FONT=&quot]) [/FONT][FONT=&quot]به ارث بره. یعنی به طور مثال در تعریف اون باید نوشته بشه[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]Public class myMainClass [/FONT][FONT=&quot]extends MovieClip[/FONT]
[FONT=&quot]البته در برخی سورسها هم دیدم که کلاس اصلی راه انداز فلش رو که به سورس متصل می کنن از کلاس [/FONT][FONT=&quot]Sprite[/FONT][FONT=&quot]ها به ارث بردن .کلاس [/FONT][FONT=&quot]Sprite[/FONT][FONT=&quot]کلاسی اصلی تری هست که کلاس مووی کلیپ ها از اون به ارث می ره[/FONT][FONT=&quot].[/FONT][FONT=&quot]در این مورد هم باید بگم که می شه کلاس اصلی رو زیر کلاس سورس قرار داد .[/FONT]
[FONT=&quot]ناحیه شماره 4: [/FONT][FONT=&quot]در این قسمت که داخل تگ کلاس هست ، ما مشخصه ها رو تعریف می کنیم. همونطوری که گفته بودم اینا متغیرهایی از جنس های خاص هستند که کلاسمون به اونها نیاز داره و هر نمونه ای که ساخته می شه ، از نعمت داشتن اونا برخوردار می شه. نوشتن عبارت [/FONT][FONT=&quot]private[/FONT][FONT=&quot] هم به این منظوره که دست سورسها و کلاسهای دیگه رو برای خوندن یا دستکاری این مشخصه ها کوتاه کنه[/FONT][FONT=&quot])[/FONT][FONT=&quot]توضیح مفصل در ادامه...)[/FONT]
[FONT=&quot]ناحیه شماره 5: [/FONT][FONT=&quot]در تعریف کلاسها ، همیشه یک تابع (متد) رو همنام با کلاس (با رعایت حروف بزرگ و کوچک ) تعریف می کنیم و به اون می گن تابع سازنده یا [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot]. [/FONT][FONT=&quot] این تابع دو وظیفه خیلی مهم رو ایفا می کنه[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]1-[/FONT][FONT=&quot]مقدار دهی اولیه و پیش فرض به مشخصه ها[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]2-[/FONT][FONT=&quot]استارت و شروع خط اجرای کلاس[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد از نگارش کلاس ، هر وقت نمونه ای از این کلاس در جایی متولد شد ، می تونه مشخصه های پیش فرض خودشو داشته باشه. مثلا فرض کنین که هر نمونه ، مشخصه ای برای اسم از نوع [/FONT][FONT=&quot]String[/FONT][FONT=&quot] داره. ما می تونیم در تابع سازنده ، مقدار پیش فرضی مثل [/FONT][FONT=&quot]“Unknown”[/FONT][FONT=&quot]رو به اون اختصاص بدیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در استفاده از کلاس های اصلی راه انداز یک سورس هم (که از پنل [/FONT][FONT=&quot]properties[/FONT][FONT=&quot] کادر [/FONT][FONT=&quot]class[/FONT][FONT=&quot]آدرس دهی شدن) این تابع نقش استارت اجرای برنامه رو می زنه و می تونه توابع (متد) دیگه رو برای کارهای بعد از شروع ، فراخوانی کنه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]نکته مهم[/FONT][FONT=&quot] :[/FONT][FONT=&quot]در زبانهای برنامه نویسی مثل [/FONT][FONT=&quot]C#[/FONT][FONT=&quot]و [/FONT][FONT=&quot]C++[/FONT][FONT=&quot]ما می تونستیم دو یا چند تابع سازنده رو در یک کلاس تعریف کنیم.همگی همنام کلاس بودند و تنها وجه اختلاف اونها در ساختار داخلی و تعداد و نوع آرگومانهای ورودیشون بود . با تحقیقاتی که کردم به اینجا رسیدم که در اکشن 3 نمی تونیم این کارو انجام بدیم و خطا می ده.پس در اکشن اسکریپت 3 ما می تونیم فقط یک تابع سازنده واسه کلاسمون تعریف می کنیم[/FONT][FONT=&quot].[/FONT][FONT=&quot]شاید راههایی در کامپایلر های مختلف باشه یا مثلا در برخی کامپایلر های [/FONT][FONT=&quot]Air[/FONT][FONT=&quot] یا [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot] بشه کاری رو کرد ولی عملا در شرایط معمول شدنی نیست .[/FONT]
[FONT=&quot]ناحیه شماره 6: [/FONT][FONT=&quot]مقدار دهی پیش فرض و اولیه به مشخصه ها . دیگه هر جایی که نمونه ای از کلاس بوجود بیاد ، مشخصه هاش به صورت پیش فرض مقدار دهی می شند[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ناحیه شماره 7: [/FONT][FONT=&quot]فراخوانی متدی از دیگر متد های کلاس ما . در کلاسهایی که تابع سازنده[/FONT][FONT=&quot]([/FONT][FONT=&quot]constructor[/FONT][FONT=&quot]) [/FONT][FONT=&quot]نقش ابتدای خط اجرای برنامه رو بازی می کنه ، با فراخوانی متد های دیگر اون کلاس ، می تونیم از اونا استفاده کنیم. دیگه هر جایی که نمونه ای از نمونه های کلاس متولد شه ، بعد از مقدار دهی اولیه ، بصورت اتوماتیک تابعی مثل [/FONT][FONT=&quot]revealMyProperties[/FONT][FONT=&quot] در موردشون اجرا می شه.در این ناحیه ، مشخصه های نام و نام خانوادگی و سن رو به این تابع پاس می دیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ناحیه شماره8: [/FONT][FONT=&quot]تعریف متد[/FONT][FONT=&quot]revealMyProperties[/FONT][FONT=&quot] .[/FONT][FONT=&quot]، ما یک متد خصوصی در کلاس تعریف کردیم که دو مشخصه از نوع رشته ای و یک مشخصه از نوع عددی دریافت می کنه و با دستور [/FONT][FONT=&quot]trace[/FONT][FONT=&quot]، اونا رو نشون می ده .خروجی نمایشی این تابع با مشخصه های پیش فرض هست[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]UNKNOWN UNKNOWN 0[/FONT]
[FONT=&quot]دقت کنید که اسم این متد رو دل به خواهی تعیین کردم ،شما می تونین بیستا متد مختلف تعریف کنین و اونا رو فراخونی کنین[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ناحیه شماره 9 :[/FONT][FONT=&quot]با این دستور مشخصه های پاس داده شده به تابع در خروجی مقادیر فلش به نمایش در می یان[/FONT][FONT=&quot].[/FONT][FONT=&quot]دقت کنید که متد [/FONT][FONT=&quot]trace[/FONT][FONT=&quot] فقط در خود برنامه فلش فعالیت می کنه و بعد از گرفتن خروجی [/FONT][FONT=&quot]swf [/FONT][FONT=&quot]و بستن برنامه فلش و اجرای فایل خروجی [/FONT][FONT=&quot]swf[/FONT][FONT=&quot] با فلش پلیر یا مرورگر ، دیگه فعال نمیشه و پنجره ای برای نمایش مقادیر خروجی با[/FONT][FONT=&quot]trace[/FONT][FONT=&quot] در پنجره [/FONT][FONT=&quot]OutPut[/FONT][FONT=&quot]باز نمی شه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد از نوشتن کلاس باید آکولادهای کلاس و بسته[/FONT][FONT=&quot]([/FONT][FONT=&quot]package[/FONT][FONT=&quot]) [/FONT][FONT=&quot] رو ببندیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در هنگامی که می خواهیم از کلاسمون در جایی مثل یه سورس [/FONT][FONT=&quot]fla[/FONT][FONT=&quot]یا در یه کلاس دیگه ، نمونه ای رو متولد کنیم باید با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot]اون کلاس رو به فضای برنامه وارد کنیم و بعد دستور زیر رو می نویسیم[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT]
2.jpg


[FONT=&quot]با دستور[/FONT][FONT=&quot]new[/FONT][FONT=&quot]نمونه جدیدی از کلاس متولد می شه و در متغیری از جنس خودش قرار می گیره[/FONT][FONT=&quot] .[/FONT][FONT=&quot]اگر تابع سازنده یا کانسترکتور رو به گونه ای طراحی کنیم که آرگومان ورودی دریافت کنه ، باید بعد از متولد کردن هر نمونه به روش بالا ، درون پرانتز، آرگمانهایی رو هم بنویسیم[/FONT][FONT=&quot].[/FONT][FONT=&quot]فرض کنین کلاسی رو مثل این بنویسیم :[/FONT]


3.jpg


[FONT=&quot]حالا اگه در یک فایل سورس دستورات زیر رو بنویسیم ، می بینیم که تابع سازنده به خودی خود ، خروجی ها رو نمایش می ده.[/FONT]
[FONT=&quot]
4.jpg

[/FONT]

[FONT=&quot]

[/FONT]
[FONT=&quot]و خروجیمون هست[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]HADI METAL 17[/FONT]
[FONT=&quot]Mehdi Sadegi 25[/FONT]


[FONT=&quot]سطوح دسترسی به مشخصه ها و متد های یک کلاس[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]سطح دسترسی عمومی یا [/FONT][FONT=&quot]public [/FONT][FONT=&quot] :[/FONT][FONT=&quot]این دستور برای تعیین سطح دسترسی عمومی به یک مشخصه یا یک متد به کار می ره و مشخصه ها و متد هایی که با این عبارت تعریف می شن ، در دسترس هر کلاس و هر سورسی قرار می گیره ، البته به شرط اینکه 1- کلاس تعریف شده رو در اونها وارد کنیم و 2 – از اون کلاس نمونه سازی کنیم و کلاس دوم رو زیر کلاس اون قرار بدیم و ...[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]سطح دسترسی[/FONT][FONT=&quot] خصوصی یا [/FONT][FONT=&quot]private [/FONT][FONT=&quot] : [/FONT][FONT=&quot]ا[/FONT][FONT=&quot]ین سطح دسترسی ، خصوصی ترین و محافظت شده ترین سطح دسترسی کلاسی در اکشن اسکریپت 3 و بیشتر زبونهای برنامه نویسی دیگه هست . در اکشن اسکریپت 3 ، تمامی خصوصیات و متد هایی که با این سطح ، انتصاب می شن فقط در خود کلاس قابل دسترسی و تغییرند . به عبارت دیگه هیچ کلاس و هیچ فضای برنامه نویسی که کلاس ما رو در خودش وارد می کنه و نمونه سازی می کنه ، نمی تونه به این اشیا دسترسی خواندنی / نوشتنی داشته باشه . فقط تابع سازنده یا [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot]و متد های دیگر داخل کلاس ما می تونن دسترسی خواندنی / نوشتنی به این اشیای خصوصی کلاسمون داشته باشن و تنها راه دسترسی از بیرون ، اینه که [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] رو جوری طراحی کنیم که پارامتر ورودی بگیره و به این مشخصه ها ، مقدار دهی کنه . یا اینکه متد دیگری به اسم [/FONT][FONT=&quot]get [/FONT][FONT=&quot]یا [/FONT][FONT=&quot] set[/FONT][FONT=&quot]یا به سیستم معمول تعریف کنیم تا اشیای این سطح رو بخونه و نمایش بده و مقادیری رو به عنوان ورودی بگیره و با اون مقادیر ، مشخصه ها یا متد های سطح خصوصی[/FONT][FONT=&quot] ([/FONT][FONT=&quot]private[/FONT][FONT=&quot]) [/FONT][FONT=&quot]رو دستکاری کنه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]سطح دسترسی[/FONT][FONT=&quot] داخلی یا [/FONT][FONT=&quot]internal [/FONT][FONT=&quot] : [/FONT][FONT=&quot]این سطح دسترسی ، سطح دسترسی پیش فرض اکشن اسکریپت 3 هست . وقتی در تعریف مشخصه ها یا متد های کلاس ، فقط عبارت [/FONT][FONT=&quot]var[/FONT][FONT=&quot] و بعد اسم مشخصه / متد و بعد نوع مشخصه [/FONT][FONT=&quot] ([/FONT][FONT=&quot]….String , Number[/FONT][FONT=&quot])[/FONT][FONT=&quot]رو می نویسیم ، خود به خود این سطح به اون اعمال می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot]همچنین اگه قبل از تعریف مشخصه یا متد ، عبارت [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] رو بنویسیم ، این سطح دسترسی به اون اعمال می شه .[/FONT]
[FONT=&quot]مشخصه یا متدی که با این روش انتصاب می شه فقط در بسته روت کلاسمون قابل دسترسی هست . یعنی سورسها و کلاسهایی که در فولدر کلاس و دقیقا در کنار کلاس ما قرار دارن ، به این اشیا ، دسترسی دارن. دیگر کلاسهایی که در فولدرهای دیگه (بسته های دیگه ) قرار دارند نمی تونن به این اشیا دست پیدا کنن حتا اگر به شیوه درست ، کلاس خودمون رو در اونها [/FONT][FONT=&quot]import[/FONT][FONT=&quot] کنیم. (در جلسات بعدی به صورت کامل در مورد بسته بندی فولدر به فولدر بحث می کنیم[/FONT][FONT=&quot].[/FONT][FONT=&quot] ) [/FONT]
[FONT=&quot]سطح دسترسی [/FONT][FONT=&quot]محافظت شده یا [/FONT][FONT=&quot]protected [/FONT][FONT=&quot] : [/FONT][FONT=&quot]فقط کلاسهایی که با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] به عنوان زیر کلاسِ (فرزند) کلاس کنونی شدند، می تونن به اونها دست پیدا کنن ولا غیر . ما می تونیم کلاس اصلی رو به عنوان کلاس اصلی پدر (یا مادر)[/FONT][FONT=&quot]بوجود بیاریم و در اون گروهی از مشخصه ها یا متد ها رو عمومی[/FONT][FONT=&quot] ([/FONT][FONT=&quot]public[/FONT][FONT=&quot]) [/FONT][FONT=&quot]قرار بدیم تا هر کسی که کلاس رو [/FONT][FONT=&quot]import [/FONT][FONT=&quot] کرد به اونا دست پیدا کنه . گروهی از اونها رو هم از نوع خصوصی ترین و محرمانه ترین[/FONT][FONT=&quot] ([/FONT][FONT=&quot]private[/FONT][FONT=&quot] ) [/FONT][FONT=&quot]از نظر دسترسی قرار بدیم تا هیچ چیزی غیر از خود کلاس نتونه به اونا دسترسی داشته باشه .گروه دیگه ای رو هم از نوع محرمانه و یکم با شدت کمتر[/FONT][FONT=&quot] ) [/FONT][FONT=&quot]یا همون [/FONT][FONT=&quot]internal [/FONT][FONT=&quot] ) قرار بدیم تا فقط کلاسها و سورسهایی به اون دست پیدا کنن که در کنار فایل کلاسی ما باشن و کلاس ما رو [/FONT][FONT=&quot]import[/FONT][FONT=&quot] کنن. دسته ای دیگه از مشخصات و متد ها رو هم از نوع [/FONT][FONT=&quot]protected [/FONT][FONT=&quot] تعریف می کنیم که فقط یک سری کلاسها و اونهم کلاسهای فرزند (زیر کلاسها ) از اونها برخوردار باشن . زیر کلاس به کلاسی گفته می شه که در هنگام تعریف با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot]، وابسته به کلاس ما می شه و خصوصیات و متد های [/FONT][FONT=&quot]public , protected[/FONT][FONT=&quot]رو دریافت می کنه[/FONT][FONT=&quot].[/FONT][FONT=&quot]این کلاسها (فرزند) نمی تونن به سطح [/FONT][FONT=&quot]private[/FONT][FONT=&quot] کلاس مادر خودشون که خیلی خصوصی هم هست دست پیدا کنن . اگر هم کلاس مادرشون در کنار اونا باشه می تونن به مشخصه ها و متد های [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] کلاس مادرشون دست پیدا کنن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]به خواست پروردگار بزرگ ، [/FONT][FONT=&quot]در آینده مثالهایی رو در این مورد خواهیم زد[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]با این اوصاف به نکات زیر توجه کنید[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]1-[/FONT][FONT=&quot]مشخصات و متد ها می تونن [/FONT][FONT=&quot]public , private , internal , protected[/FONT][FONT=&quot]باشند[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]2-[/FONT][FONT=&quot]در تعریف کلاس فقط می تونیم خود کلاس رو [/FONT][FONT=&quot]public[/FONT][FONT=&quot] یا [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] تعریف کنیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]3-[/FONT][FONT=&quot]تابع سازنده[/FONT][FONT=&quot] ([/FONT][FONT=&quot]constructor[/FONT][FONT=&quot]) [/FONT][FONT=&quot]همیشه [/FONT][FONT=&quot]public[/FONT][FONT=&quot] و گاهی [/FONT][FONT=&quot]internal [/FONT][FONT=&quot] تعریف می شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]تفاوت سطوح دسترسی کلاسی در اکشن اسکریپت 2 و 3[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]در اکشن اسکریپت 2 ما فقط دو نوع سطح دسترسی داشتیم[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot] 1- [/FONT][FONT=&quot]public[/FONT][FONT=&quot]که به معنای [/FONT][FONT=&quot]public[/FONT][FONT=&quot] اکشن اسکریپت 3 بود[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]2 -[/FONT][FONT=&quot]private[/FONT][FONT=&quot] که به معنای [/FONT][FONT=&quot]protected[/FONT][FONT=&quot]اکشن 3 بود . بهتر بگم سطح دسترسی [/FONT][FONT=&quot]private[/FONT][FONT=&quot] در اکشن 2 اونقدر ها هم حفاظت شده عمل نمی کرد و به زیر کلاس های یک کلاس امکان دسترسی می داد . پس باید بگم اکشن 3 خیلی زبان خوفی هست و این خصیصه ها رو از زبان [/FONT][FONT=&quot]C[/FONT][FONT=&quot] به ارث برده[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]مثالهایی رو براتون آماده کردم .اونا رو در فلش [/FONT][FONT=&quot]cs4 [/FONT][FONT=&quot] باز کنین و باهاشون کار کنین[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در این مثالها ، ما ارتباط یک سورس و یک کلاس راه انداز اصلی رو بهتون نمایش می دیم. همینطور نمونه سازی از یک کلاس در یک سورس بشرطی که کلاس مذکور نقش یک کلاس اصلی راه انداز رو ایفا نمی کنه و با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot] وارد سورس می شه .همچنین نمونه سازی از یک کلاس در یک کلاس دیگه ای که راه انداز اصلی یه سورس فلش هست رو خواهید دید. و همچنین تست اینکه ما به یک کلاس دو تابع سازنده تعریف می کنیم و خطایی رو مشاهده می کنیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد از باز کردن اونها[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample22-01.rar[/FONT][FONT=&quot] : یک سورس فلش با دو دکمه و 3 جعبه متن می بینید.در ابتدا تابع [/FONT][FONT=&quot]constructor [/FONT][FONT=&quot] مقادیر پیش فرض به خصوصیات نام کلی و نام خانوادگی کلی و سن می ده. دو مشخصه نام جدید و نام خانوادگی جدید مقدار دهی نمی شن و مشاهده می کنین که مقدارشون [/FONT][FONT=&quot]null[/FONT][FONT=&quot] تریس می شه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد در جعبه های متنی، یه اسم و یه فامیل و یه سن دلخواه قرار بدین . بعد از اون اگه دکمه [/FONT][FONT=&quot]age[/FONT][FONT=&quot]رو بزنین، سن رو نشون می ده و اگه دکمه [/FONT][FONT=&quot]name and Family[/FONT][FONT=&quot] رو بزنین ، اسم جدید ورودی در مشخصه های اسم کلی و جدید قرار می گیره و فامیل جدید ورودی در مشخصه های فامیل کلی و جدید قرار می گیره و تریس می شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]این مثال از نوع کلاس اصلی کار راه انداز طراحی شده .همونطوری که می بینین در سورس اصلی دستور خاصی نوشته نشده و در پنل [/FONT][FONT=&quot]properties[/FONT][FONT=&quot] و در کادر متنی [/FONT][FONT=&quot]class[/FONT][FONT=&quot] اسم فایل کلاسی رو نوشتیم .(البته کادر [/FONT][FONT=&quot]class[/FONT][FONT=&quot]رو وقتی می بینین که هیچ شی در صحنه انتخاب نشده باشه[/FONT][FONT=&quot]. [/FONT][FONT=&quot] ) [/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample22-02.rar[/FONT][FONT=&quot] : این تمرین برای تست حالتیه که ما دو تا تابع سازنده تعریف کنیم و ملاحظه خواهید کرد که خطا ظاهر می شه و اثبات می شه که در اکشن 3 بر خلاف خیلی از زبانها ، نمی شه دو یا چند کانسترکتور در یک کلاس تعریف کرد[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ما یک سورس داریم و دو فایل کلاسی . در سورسمون دو دکمه و 6 جعبه متن داریم.3 تا جعبه متنای بالا برای وارد کردن نام و نام خانوادگی و سن هست و 3 تای پایینی برای نمایش اونها هست . دکمه سمت راست[/FONT][FONT=&quot] ([/FONT][FONT=&quot]default[/FONT][FONT=&quot]) [/FONT][FONT=&quot]برا حالتیه که با کلیک روی اون یه شی از کلاس شخص متولد شه و با کانسترکتور پیش فرض سازش، مقادیر پیش فرض به مشخصه های نام و ... داده شه تا در سه جعبه متن پایینی تریس شه . دکمه [/FONT][FONT=&quot]Enterance[/FONT][FONT=&quot] هم برا حالتیه که با کلیک روی اون ، یه نمونه دیگه از کلاس شخص ساخته شه و تابع سازنده دومش که اسم و فامیل و ... رو به عنوان پارامترهای ورودی میگیره ، مقادیر سه جعبه بالایی رو به مشخصه های نمونه جدید بده تا اون مشخصه هارو در 3 جعبه پایینی نشون بده . ملاحظه می کنین که خطای زیر داده می شه [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]Multiple constructor definitions found. Constructor may not be defined in <Script/> code[/FONT]
[FONT=&quot]در این مثال ، کلاس [/FONT][FONT=&quot]Constructor Test[/FONT][FONT=&quot] از نوع فایل کلاسی اصلی راه انداز هست و کلاس [/FONT][FONT=&quot]person Class [/FONT][FONT=&quot]از نوع کلاسهای جانبی هست که داخل کلاس اصلی [/FONT][FONT=&quot]import[/FONT][FONT=&quot] می شه و از اون نمونه سازی می شه و استفاده می شه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]دقت کنید که در این مثال ، در دو جعبه متنی که یکیش سن رو می گیره و یکیش سن رو نشون می ده ، ما نیازی به تبدیل رشته و عدد برای مقدار دهی به مشخصه عددی سن از رشته متن نداریم چون به دو جعبه متنی مورد نظر ، فرمت اعداد داده شده (در قسمت [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot])[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]sample22-03[/FONT][FONT=&quot] : مثالی هست که باز ادعای مثال 2 رو ثابت می کنه و فقط کافیه شما عباراتی رو که در کامنت قرار گرفتن رو از حالت کامنت در بیارین تا تداخل دو کانسترکتور و خطای قبل رو ببینین[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]این مثال هم از یک سورس و یک کلاس اصلی راه انداز و یک کلاس شخص تشکیل شده که ابتدا با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot] در کلاس اصلی بارگذاری شده و در کلاس اصلی از اون نمونه سازی شده و استفاده شده . خواهید دید که مقادیر پیش فرض به مشخصات نمونه ساخته شده از کلاس شخص ، در کلاس اصلی داده می شه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample22-04.rarl[/FONT][FONT=&quot] : مثالی که از یک سورس و یک کلاس تشکیل شده و خواهید دید که چطور کلاس مورد نظر با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot] ، در سورس قابل دسترسی خواهد بود و چطور از داخل سورس ، دو نمونه از اون رو می سازید و به مشخصات خصوصی اون که از نوع خصوصی[/FONT][FONT=&quot] ([/FONT][FONT=&quot]private[/FONT][FONT=&quot]) [/FONT][FONT=&quot]هستند مقدار دهی اولیه می کنین[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]بعد از باز کردن سورس [/FONT][FONT=&quot]fla[/FONT][FONT=&quot]تمرین 4 به اولین فریم برین و دستورات اکشن رو ببینین[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]توجه [/FONT][FONT=&quot]: [/FONT][FONT=&quot]تفاوت مثال شماره 4 با مثالهای دیگه در اینه که کلاس ما دیگه نقش کلاس اصلی کار راه انداز رو بازی نمی کنه . اگر در سورس اصلی به پنل [/FONT][FONT=&quot]properties[/FONT][FONT=&quot]برین متوجه می شین که در کادر متنی [/FONT][FONT=&quot]class[/FONT][FONT=&quot] هیچ کلاسی برای اون تعریف نشده[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]من در مثالها و در روبروی هر کد ،کامنتی رو برای توضیح عملکرد اون کد به زبون ثلیث فارسی نوشتم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]پایان درس سوم[/FONT]


 

پیوست ها

  • Pictures.rar
    265 کیلوبایت · بازدیدها: 820
  • Sample22-04.rar
    5.8 کیلوبایت · بازدیدها: 355
  • Sample22-01.rar
    8.5 کیلوبایت · بازدیدها: 393
  • Sample22-02.rar
    9.3 کیلوبایت · بازدیدها: 350
  • Sample22-03.rar
    5.9 کیلوبایت · بازدیدها: 353
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3-درس بیست و سوم

[FONT=&quot]بسم الله الرحمن الرحیم

[/FONT]
[FONT=&quot]همپوشانی کلاس با مووی کلیپ[/FONT]
[FONT=&quot]درود بر شما دوستان عزیز:rose:[/FONT]
[FONT=&quot]امروز سعی دارم تا مروری کوتاه بر دروس گذشته داشته باشم تا اگه نکات ابهامی در درس هام باشه ، اونها رو رفع کنم و بعد به الباقی مباحث بپردازم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]یادگیری درست این مباحث منوط به دانلود مثالهایی هست که انتهای پست های آموزشی ، آماده دانلود هست و باید سعی کنید تا برای اجرای اونها ،فلش [/FONT][FONT=&quot] [/FONT][FONT=&quot]cs4 [/FONT][FONT=&quot]رو تهیه کنید[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]بعد از باز کردن اونها در فلش خواهید دید که بصورت کامل و با زبان شیرین فارسی ، روبروی هر خط کد ، توضیحات مربوط به اون خط رو دادم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]ما ساختار اصلی یک کلاس رو مطرح کردیم .ساختار یک کلاس می تونه به شکل زیر باشه[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
pic01.jpg

[/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]ما با بیان مثال ، چند روش استفاده از کلاس رو گفتیم ، از جمله کار با کلاس های اصلی راه انداز یک سورس ، کار با کلاسی که در یک سورس یا کلاس اصلی وارد یا [/FONT][FONT=&quot]import [/FONT][FONT=&quot] شده و از اون نمونه سازی و استفاده شد ، همچنین گفتیم که هر کلاس اصلی راه انداز معمولا نقش سناریوی اصلی یک فلش رو بازی می کنه و باید زیر کلاسی[/FONT][FONT=&quot] (extends) [/FONT][FONT=&quot]از کلاس مووی کلیپ ها و یا [/FONT][FONT=&quot]sprite [/FONT][FONT=&quot]ها بشه ، [/FONT][FONT=&quot]Sprite [/FONT][FONT=&quot]ها کلاس اصلی تری هست که مووی کلیپ ها زیر کلاس اونها هستن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]گفتیم که کانسترکتور بعنوان شروع خط اجرایی کلاس می تونه یک یا چند متد رو فراخوانی کنه ولی این ، به مفهوم اون نیست که همه متد ها قرار هست از کانسترکتور فراخونی بشن . ما بعضی از متد ها رو تعریف می کنیم و هر جا نیاز داشتیم ، اونارو در مورد نمونه ساخته شده ، فراخونی می کنیم و در این مورد ، متد مورد نظر ما یه متد انباره ای می شه که فقط کافیه فراخونی بشه و به اون ، پارامتر های مورد نیازش پاس داده بشه تا کار خودشو انجام بده .همچنین گفتیم که نحوه تعریف متد سازنده یا [/FONT][FONT=&quot]constructor [/FONT][FONT=&quot] از نظر تعداد ورودی هایی که می گیره ، نحوه تولد هر نمونه از یک کلاس رو تعیین می کنه یعنی اگر متد ما مثلا 3 ورودی رشته ای رو دریافت کنه ، باید در هنگام تولد یک نمونه ، بصورت زیر عمل شه[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
pic02.jpg

[/FONT]
[FONT=&quot]و یا مثلا اگه کانسترکتور در تعریفش هیچ مقداری رو نگیره ، [/FONT][FONT=&quot] [/FONT][FONT=&quot]string1 , string2 , string3 [/FONT][FONT=&quot]دیگه نوشته نمی شن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]شروع بحث امروز[/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]دسترسی به مشخصه ها و متد های یک نمونه از کلاس خاص ، با عملگر دات یا نقطه[/FONT][FONT=&quot] (.) [/FONT][FONT=&quot]امکانپذیر می شه به شرطی که کلاس خاص در محیط کاریمون وارد یا [/FONT][FONT=&quot]import [/FONT][FONT=&quot]شه و نمونه ای از اون ساخته شه و متد یا مشخصه ای که می خواهیم به اون دسترسی خواندنی یا نوشتنی داشته باشیم به ما اجازه دسترسی رو بده . تعریف سطوح دسترسی مثل [/FONT][FONT=&quot] [/FONT][FONT=&quot]public [/FONT][FONT=&quot]و [/FONT][FONT=&quot] [/FONT][FONT=&quot]private [/FONT][FONT=&quot]در اینجا مؤثر به نظر می یاد[/FONT][FONT=&quot].[/FONT]


[FONT=&quot]
pic03.jpg

[/FONT]
[FONT=&quot]همپوشانی یک مووی کلیپ و یک فایل کلاسی[/FONT][FONT=&quot] : [/FONT]
[FONT=&quot]قبلا به شما گفتیم که وقتی یه مووی کلیپ رو در کتابخونه فلش ، برای کار در اکشن اسکریپت ، [/FONT][FONT=&quot] [/FONT][FONT=&quot]export [/FONT][FONT=&quot]می کنیم (درس بیست و یک ) و در کادر نام کلاس به اون اسمی رو می دیم و در کادر متنی زیر کلاس یا [/FONT][FONT=&quot] [/FONT][FONT=&quot]subclass [/FONT][FONT=&quot] ، اونو زیر کلاس مووی کلیپ ها می کنیم ، در حقیقت اونو به یه کلاس کامل تبدیل کردیم که انگار با دستور [/FONT][FONT=&quot]extends MovieClip [/FONT][FONT=&quot]، گروه زیادی از مشخصات و متد های مووی کلیپ ها رو به اون اختصاص دادیم تا در این محدوده کار کنه[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]فایل تمرین [/FONT][FONT=&quot]Sample 23-01 [/FONT][FONT=&quot] رو دانلود و با فلش [/FONT][FONT=&quot]cs4 [/FONT][FONT=&quot]باز کنین.[/FONT][FONT=&quot] مشاهده می کنید که دو فایل کلاسی و یک سورس در کنار هم ، خروجی خاصی رو بیرون می دن.وقتی شما فایل سورس رو باز می کنین و روی [/FONT][FONT=&quot]stage [/FONT][FONT=&quot] خالی کلیک می کنین و پنل [/FONT][FONT=&quot]properties [/FONT][FONT=&quot] رو باز می کنین ، در کادر متنی [/FONT][FONT=&quot]class [/FONT][FONT=&quot]عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]myClass [/FONT][FONT=&quot]نوشته شده . یعنی کلاس اصلی راه انداز این سورس اسمش هست [/FONT][FONT=&quot]myClass[/FONT][FONT=&quot] ، در کتابخونه این فایل مشاهده می کنیم که مووی کلیپی به اسم [/FONT][FONT=&quot]Movie01[/FONT][FONT=&quot] ، که یک گوی شیشه ای آبی رنگ هست[/FONT][FONT=&quot] [/FONT][FONT=&quot]، با اسم کلاسی [/FONT][FONT=&quot] [/FONT][FONT=&quot]Ball (export for action-class) [/FONT][FONT=&quot]قرار گرفته . این گوی ، زیر کلاس مووی کلیپ ها شده .سپس در کنار فایل سورس یه فایل کلاسی همنام [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot]قرار گرفته . یعنی همپوشانی یه مووی کلیپ [/FONT][FONT=&quot]export [/FONT][FONT=&quot] شده به اسم [/FONT][FONT=&quot]Ball[/FONT][FONT=&quot] و یه فایل کلاسی به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot]و هر دو زیر کلاس مووی کلیپ ها[/FONT][FONT=&quot] . [/FONT][FONT=&quot]وقتی فایل کلاس [/FONT][FONT=&quot]Ball.as [/FONT][FONT=&quot] رو باز کنین مشاهده می کنین که کلاسی با همین اسم بوجود اومده و با دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]extends [/FONT][FONT=&quot]زیر کلاس مووی ها شده و در اون ، تابع سازنده ای به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot]بوجود اومده و به [/FONT][FONT=&quot] this [/FONT][FONT=&quot]دو تا رویداد و یک دستور داده شده[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot] this [/FONT][FONT=&quot]به کلاسی (مووی کلیپ) اشاره می کنه که فایل کلاسی [/FONT][FONT=&quot]Ball.as [/FONT][FONT=&quot] با اون همپوشانی داره ، بهتر بگم عبارت [/FONT][FONT=&quot]this [/FONT][FONT=&quot] به نمونه های ساخته شده از کلاس مووی کلیپ [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot] که نام اصلی سمبلیش هست [/FONT][FONT=&quot] [/FONT][FONT=&quot]Movie01 [/FONT][FONT=&quot]در صحنه اشاره داره . در این فایل ، گفته شده که در حالت پیش فرض ، آلفای نمونه ها [/FONT][FONT=&quot] [/FONT][FONT=&quot]0.7 [/FONT][FONT=&quot]باشه و در حالت لمس موس ، متد لمس و در حالت رهایی از لمس موس ، متد رهایی لمس به هر نمونه داده شه. بعد متد های دیگه رو به حالت عمومی (می تونه خصوصی هم باشه چون از متد سازنده فراخونی شدن) تعریف کردیم و آلفای نمونه ها و اندازه سایزشونو در این متد ها عوض کردیم . بعد در کلاس اصلی راه انداز ، 3 تا مشخصه رشته ای برای حفظ سه آدرس [/FONT][FONT=&quot] [/FONT][FONT=&quot]URL [/FONT][FONT=&quot]بوجود آوردیم (از نوع خصوصی) و به سه توپ 1 و 2 و 4 در حالت رویداد کلیک موس ، سه متد مختلف رو دادیم . متد ها برای رفتن به آدرس [/FONT][FONT=&quot]URL [/FONT][FONT=&quot]های مختلف بودند . 4 توپ در صحنه بوجود آمدند .توپ 1 و توپ 2 که در صحنه درگ شده بودند.توپ 3 که در تایم لاین اصلی سورس با دستورات اکشن نمونه سازی و نمایشی شد و توپ 4 که در کلاس اصلی نمونه سازی و نمایشی شد. سپس در حالت کلیک توپ 1 ، گفتیم که به آدرس گوگل بره و به توپ دوم گفتیم که در حالت کلیک موس به آدرس یا هو بره و همچنین به توپ 4 گفتیم که بعد از کلیک ، به آدرس سایت مجید آنلاین بره[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]متوجه می شید که به توپ 1 و 2 که درگ شده بودند ، هم می تونیم از تایم لاین اصلی دسترسی پیدا کنیم و هم از داخل کلاس اصلی راه انداز. به توپ 3 که در تایم لاین اصلی صحنه و با دستورات اکشن نمونه سازی شده بود، از داخل فایل کلاسی اصلی نمی تونیم دسترسی پیدا کنیم تا مثلا به اون گوش کننده رویداد موس بدیم و اگه این کار رو انجام بدیم ، خطای زمان اجرا رو خواهیم دید. ولی به توپ 4 که در داخل کلاس اصلی [/FONT][FONT=&quot]myClass [/FONT][FONT=&quot] نمونه سازی شده بود ، می تونیم از داخل تایم لاین اصلی سورس دسترسی پیدا کنیم و مثلا به اون رویداد بدیم یا مثلا مکان یا آلفاشو کم و زیاد کنیم .چرا؟ می تونین جواب بدین[/FONT][FONT=&quot] !!![/FONT]
[FONT=&quot]خط [/FONT][FONT=&quot] [/FONT][FONT=&quot]12 [/FONT][FONT=&quot]اکشن تایم لاین اصلی و خط 28 کلاس اصلی به حالت کامنت در اومدن که با خارج کردن اونها از حالت کامنت بتونید نتایجی رو مشاهده کنین تا به صحت حرفهام برسین.اگه خط 28 فایل کلاسی اصلی رو از حالت کامنت در بیارین با این پیغام خطا مواجه می شین[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
HTML:
TypeError: Error #1009: Cannot access a property or method of a null object reference.at myClass()
[FONT=&quot]این یک مثالی بود از همپوشانی یک مووی کلیپ اکسپورت شده و یک فایل کلاسی همنام اون ، در حالی که یک کلاس اصلی راه انداز برای این پروژه تعریف شد ، کلاس دیگری هم تعریف شد و با یک مووی اکسپورت شده همپوشان شد ، کلاس اصلی عملکرد پایه ای کار رو در دست داشت و بدون اینکه حتی نیازی به [/FONT][FONT=&quot] [/FONT][FONT=&quot]import [/FONT][FONT=&quot]کردن کلاس [/FONT][FONT=&quot]Ball[/FONT][FONT=&quot]همپوشان داشته باشه ، اون به کار خودش می یردازه و این به کار خودش ، این مورد یه حالتی هست که کلاس همپوشان [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot] دیگه وابسته به کلاس اصلی [/FONT][FONT=&quot]myClass [/FONT][FONT=&quot] نمی شه و هر دو کلاس در کنار هم و در حوزه خودشون فعالیت می کنند[/FONT][FONT=&quot]. [/FONT]
[FONT=&quot]با کمی تأمل در مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample 23-01 [/FONT][FONT=&quot]مسئله ای رو در می یابیم : وقتی مووی کلیپ گوی شیشه ای رو [/FONT][FONT=&quot]export for action script [/FONT][FONT=&quot] کردیم ، اونو به کلاسی به نام [/FONT][FONT=&quot]Ball [/FONT][FONT=&quot]و زیر کلاس مووی کلیپ ها[/FONT][FONT=&quot] [/FONT][FONT=&quot]تبدیل کردیم و همپوشانی اونو با فایل کلاسی به همین نام و زیر کلاس مووی کلیپ ها دیدیم. همپوشانی این دو خیلی شبیه همپوشانی فایل کلاس اصلی راه انداز سورس و شی صحنه یا [/FONT][FONT=&quot]stage [/FONT][FONT=&quot]هست . اگه دقت کنین در می یابین که وقتی شی صحنه خالی رو کلیک می کردین ، در پنل [/FONT][FONT=&quot]properties [/FONT][FONT=&quot] کادر متنی [/FONT][FONT=&quot]class [/FONT][FONT=&quot]نمایان می شد[/FONT][FONT=&quot] . [/FONT]
[FONT=&quot]شی صحنه یکی از اشیای زیر کلاس اشیای نمایش یا [/FONT][FONT=&quot]displayObject [/FONT][FONT=&quot] هست و [/FONT][FONT=&quot]displayObjectClass [/FONT][FONT=&quot] ، کلاس های دیگه ای مثل مووی کلیپ ها و [/FONT][FONT=&quot]sprite [/FONT][FONT=&quot]ها و تصاویر نقشه بیتی و غیره رو در زیر خودش داره .شی صحنه باید در تعاملش با مووی کلیپ ها و ... ارث بری هایی رو از مووی کلیپ ها داشته باشه [/FONT][FONT=&quot]. [/FONT][FONT=&quot]البته [/FONT][FONT=&quot] [/FONT][FONT=&quot]stage [/FONT][FONT=&quot]کمی با کلاس [/FONT][FONT=&quot]MovieClip [/FONT][FONT=&quot] تفاوت داره ، از جمله اینکه مووی کلیپ ها ، مختصات [/FONT][FONT=&quot] [/FONT][FONT=&quot]x [/FONT][FONT=&quot]و [/FONT][FONT=&quot] [/FONT][FONT=&quot]y [/FONT][FONT=&quot]دارند اما [/FONT][FONT=&quot]stage [/FONT][FONT=&quot] دارای [/FONT][FONT=&quot]x [/FONT][FONT=&quot] و [/FONT][FONT=&quot] [/FONT][FONT=&quot]y [/FONT][FONT=&quot]نیست ، ولی در کل صحنه[/FONT][FONT=&quot](Stage) [/FONT][FONT=&quot] مثل مووی کلیپ ها ، یک جریان اصلی تایم لاین داره . اشیای نمایش دارای سلسله مراتبی هست و شی صحنه در بالاترین مرتبه اونها قرار داره .وقتی ما در کادر [/FONT][FONT=&quot]class [/FONT][FONT=&quot] اسمی رو اختصاص می دیم ، صحنه رو به یه کلاس تبدیل می کنیم و با قرار دادن فایل کلاسی به همون اسم و زیر کلاس اشیای نمایش (معمولا مووی کلیپ ) در خارج فلش و کنار اون ، این دو با هم همپوشانی می کنن و نتیجه این می شه که جریان اصلی کارمون در فایل کلاسی تعریف می شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]این می شه که اولویت اول با خط مشی فایل کلاس اصلی می شه و دردرجه دوم ، تایم لاین اصلی [/FONT][FONT=&quot]Stage [/FONT][FONT=&quot] اولویت بندی می شه . پس شما مشاهده می کنید که نمونه ساخته شده از توپ در تایم لاین اصلی ، قابل رؤیت و دسترسی از داخل فایل کلاس اصلی نیست ، ولی برعکس ، نمونه ساخته شده از کلاس توپ در کلاس اصلی ، قابل رؤیت در اکشن تایم لاین اصلی شی [/FONT][FONT=&quot]stage [/FONT][FONT=&quot] هست . این قضیه در مورد همپوشانی مستقیم یک مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]export [/FONT][FONT=&quot]شده و فایل کلاسی به همون اسم نیز سازگار هست ، یعنی دستورات فایل کلاسی ، قبل از تایم لاین مووی کلیپ مورد نظر ، به اجرا در می یاد و دسترسی به نمونه های ساخته شده از کلاسی دیگر در تایم لاین مووی مربوطه ، از درون فایل کلاسی همپوشان شده عملا منجر به خطای زمان کامپایل می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال[/FONT][FONT=&quot] Sample 23-01 [/FONT][FONT=&quot]رو دانلود کنین[/FONT][FONT=&quot]...[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پایان درس بیست و سوم[/FONT][FONT=&quot][/FONT][FONT=&quot]


[/FONT]

[FONT=&quot] [/FONT]
 

پیوست ها

  • Sample 23-01.rar
    34.4 کیلوبایت · بازدیدها: 453
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 – درس بیست و چهارم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]

[FONT=&quot]سلام بر همگی[/FONT]

[FONT=&quot]امروز می خوام این مطالب رو کاملاً آموزش بدم[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot]دسترسی و استفاده از فایل های کلاسی که کنار سورس یک فلش نیستند[/FONT]

[FONT=&quot]2-[/FONT][FONT=&quot]بحث کامل بسته بندی فولدر به فولدر و استفاده از کلاس های کتابخانه ای[/FONT]

[FONT=&quot]3-[/FONT][FONT=&quot]تعریف مشخصات و متد های یک کلاس با دستور [/FONT][FONT=&quot]static[/FONT]

[FONT=&quot]4-[/FONT][FONT=&quot]بوجود آوردن (متغیر و تابع ) مشخصات و متد های عمومی [/FONT][FONT=&quot](global) [/FONT][FONT=&quot] و استفاده از آنها در سراسر یک سورس فلش[/FONT]

[FONT=&quot]بحث رو شروع می کنم[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]در دسترسی و استفاده از فایل های کلاسی [/FONT][FONT=&quot].as [/FONT][FONT=&quot]دو حالت عمومی برای ما پیش می یاد[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot]فایل کلاسی دقیقا کنار فایل سورس ما باشه ، به این معنی که فایل کلاسی در شاخه روت فولدر فایل سورس ما قرار بگیره[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]2-[/FONT][FONT=&quot]فایل کلاسی در فولدر و شاخه دیگه ای باشه ، حالا چه فولدری بیرون از فولدر سورس و یا فولدری درون فولدر سورس[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]در حالت شماره یک ، سورس فلش هیچ مشکلی رو در اجرای کلاس اصلی راه انداز سورس و یا کلاس همنام و همپوشان مووی کلیپ نداره[/FONT][FONT=&quot]. [/FONT]

[FONT=&quot]در مورد استفاده از کلاس برای نمونه سازی هم کافی بود که یه دستور [/FONT][FONT=&quot]import [/FONT][FONT=&quot] و بعد اسم همون کلاس رو بنویسیم تا اونو وارد محیط کاری کنیم و بعد از اون نمونه سازی کنیم [/FONT][FONT=&quot].[/FONT][FONT=&quot] ولی در حالت شماره 2 دیگه اجرای درست فلش ، با خطا مواجه می شه .از مثالهای قبل ، یک فایل کلاس راه انداز اصلی سورس ، یک فایل کلاسی همپوشان با یک مووی کلیپ همنامش ، و یک فایل کلاسی که بعد از ورود اون در یک محیط کاری ، نمونه سازی می کردیم رو در پوشه دیگه ای قرار بدین تا دیگه کنار سورس نباشه تا ببینین چه اتفاقی در اجرای برنامه می افته .حتما[/FONT][FONT=&quot]می بینین که خطایی مبنی بر عدم دسترسی به کلاس مورد نظر رو می ده[/FONT][FONT=&quot]. [/FONT]

[FONT=&quot]دو راه برای این مشکل وجود داره[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot]استفاده از [/FONT][FONT=&quot]publish setting[/FONT]

[FONT=&quot]2-[/FONT][FONT=&quot]استفاده از بحث بسته بندی فولدر به فولدر[/FONT]

[FONT=&quot]نکته مهم شماره 1:[/FONT][FONT=&quot] اگه قرار باشه ما از روش گزینه شماره یک برای آدرس دهی به کلاس خاصی استفاده کنیم دیگه نباید از قواعد دستور شماره 2 هم برای همون کلاس استفاده کنیم و برعکس.این دو حالت استفاده ، عکس هم هستند[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]نکته مهم شماره 2:[/FONT][FONT=&quot] در یک سورس می تونیم گروهی از کلاس ها رو به روش شماره یک و گروه دیگه رو به روش شماره 2 آدرس دهی کنیم[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]الف-[/FONT][FONT=&quot] استفاده از روش [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot] برای آدرس دهی به کلاس [/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]برای دسترسی به گزینه [/FONT][FONT=&quot]Publish setting [/FONT][FONT=&quot]باید در سورس اصلی ، از منوی فایل ، گزینه [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot]رو انتخاب کنیم . در سربرگ اول [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot]، سربرگ [/FONT][FONT=&quot]formats [/FONT][FONT=&quot]وجود داره . باید تیک گزینه [/FONT][FONT=&quot]flash [/FONT][FONT=&quot] رو بزنیم . بعد از خوردن تیک ، سربرگ [/FONT][FONT=&quot]flash [/FONT][FONT=&quot] هم در این پنل نمایان می شه . با رفتن به سربرگ [/FONT][FONT=&quot]flash [/FONT][FONT=&quot] و زدن دکمه [/FONT][FONT=&quot]setting [/FONT][FONT=&quot] کنار منوی کشویی انتخاب نسخه اسکریپت سورس ، به پنل [/FONT][FONT=&quot]advanced action script settings [/FONT][FONT=&quot] می ریم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]
pic01.JPG
[/FONT]



[FONT=&quot]
pic02.JPG

[/FONT]

[FONT=&quot]
[/FONT]




[FONT=&quot]در پنل باز شده و در سربرگ [/FONT][FONT=&quot]source path [/FONT][FONT=&quot] با زدن دکمه [/FONT][FONT=&quot]+ [/FONT][FONT=&quot] که دور اون خط قرمز کشیده شده ، فیلد ورودی جدیدی به لیست کلاسی پایینی که دورش خط قرمز کشیده شده ، وارد می شه[/FONT][FONT=&quot] . [/FONT]
[FONT=&quot]می تونیم آدرس کلاس مورد نظر رو در اون بنویسیم و یا با زدن دکمه [/FONT][FONT=&quot]browse [/FONT][FONT=&quot] که به شکل فولدره و دورش خط کشیدم ، پنجره [/FONT][FONT=&quot]browse [/FONT][FONT=&quot] رو باز کنیم و فولدری رو که یک یا چند فایل کلاسی مد نظر در اون قرار دارن رو مشخص کنیم . فرض کنین در فولدری به نام [/FONT][FONT=&quot]Folder01 [/FONT][FONT=&quot] دو فایل کلاس 1 و کلاس 2 وجود داشته باشن و غیر از اونها ، یک فولدر دیگه ای هم درون [/FONT][FONT=&quot]Folder01 [/FONT][FONT=&quot]وجود داشته باشه به اسم [/FONT][FONT=&quot]Folder02 [/FONT][FONT=&quot] و در فولدر2 ، فایل کلاس3 وجود داشته باشه ، با [/FONT][FONT=&quot]browse [/FONT][FONT=&quot] کردن [/FONT][FONT=&quot]Folder01 [/FONT][FONT=&quot]، فقط به دو کلاس 1 و 2 دسترسی پیدا می کنیم .در این حالت و برای دسترسی به کلاس3 ، باید یک بار دیگه دکمه + رو بزنیم و در فیلد ورودی دیگه ای ، اینبار [/FONT][FONT=&quot]Folder02 [/FONT][FONT=&quot] رو [/FONT][FONT=&quot]browse [/FONT][FONT=&quot]کنیم. این نکته رو گفتم تا فکر نکنین که با مشخص کردن آدرس یک فولدر ، تمام فایل های کلاسی شاخه روت اون و تمام فایل های کلاسی درون فولدر های دیگه واقع در اون ، در دسترس سورس قرار می گیرن[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]در مشخص کردن فایل کلاسی به این روش[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot]همیشه باید توجه بشه که آدرس ورودی به لیست کلاسها ، از نوع مطلق هست ، یعنی باید از ریشه هارد مثل پارتیشن ها[/FONT][FONT=&quot] (C.D.E.F) [/FONT][FONT=&quot]شروع بشه و تا فولدری که فایل کلاسی در اون هست ادامه پیدا کنه. شاید فکر کنین چه دردسری داره که وقتی فولدر سورس و کلاسهامون عوض شد ، یه بار دیگه باید کل آدرس ها رو ویرایش کنیم ولی این به جهت اونکه از فایل های کلاسی فقط در هنگام گرفتن خروجی استفاده می شه ، زیاد مهم نیست ، فقط باید تحمل کنید و وقتی می خواهین خروجی بگیرین ، آدرس ها رو درست کنین .همین[/FONT][FONT=&quot]...[/FONT]

[FONT=&quot]2-[/FONT][FONT=&quot]وقتی جای فایل های کلاسی رو نسبت به قبل عوض می کنیم ، باید آدرس های مربوط به این لیست رو هم آپدیت کنیم چرا که آدرس ها از نوع مطلقند[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]3-[/FONT][FONT=&quot]کلاسهایی که به این روش آدرس دهی می شن ، در هنگام وارد کردن به محیط کاری برای نمونه سازی ، نیاز به دستور [/FONT][FONT=&quot]import [/FONT][FONT=&quot]و بعد نام کلاس ندارند[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]4-[/FONT][FONT=&quot]مبحث بسته بندی که در ادامه بحث به اون می پردازیم ، در این مورد از کلاسها نباید عمل شه ، به عبارت بهتر ، باید هر بسته یا [/FONT][FONT=&quot]package [/FONT][FONT=&quot] این کلاسها رو بدون پلاک (آدرس) بنویسیم وگرنه دچار خطا می شیم .(در مورد پلاک بسته بندی در ادامه بحث می کنیم . ) [/FONT]

[FONT=&quot]5-[/FONT][FONT=&quot]این روش عمومی هست ، یعنی در همه انواع استفاده از کلاس ، ما می تونیم از این روش استفاده کنیم[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]مثال [/FONT][FONT=&quot]Sample 24-01 [/FONT][FONT=&quot]رو دانلود کنید ،[/FONT][FONT=&quot] این مثال نمونه ای از این روش آدرس دهی هست . فقط دقت کنید که بعد از باز کردن سورس در فلش ، به [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot]برین و آدرس ها رو در جایی که مثال رو قرار دادید ، آپدیت و اصلاح کنید[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]ب- استفاده از بحث بسته بندی فولدر به فولدر برای آدرس دهی[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]حالت دیگه ای از آدرس دهی به فولدرها و فایل های کلاسی وجود داره که یادگیری اونهم خیلی مهم و حیاتی هست. در این روش و در یک فولدر پروژه ای ، ما سورس فلشمون رو مستقر می کنیم و در کنار اون ، فولدر یا فولدرهایی رو با اسامی مناسب بوجود می یاریم .این فولدر ها نقش کتابخونه کلاسی رو بازی می کنند و کلاسهای مختلف برای کارهای مختلفمونو در فولدرهای مناسب دسته بندی و طبقه بندی می کنیم و با این کار ، با استفاده از سیستم بسته بندی و به حالت شاخه ای و ریشه ای و به راحتی می تونیم به تک تک اونها دست پیدا کرده و استفاده کنیم .[/FONT]

[FONT=&quot]به شکل زیر توجه کنید[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]
pic03.jpg

[/FONT]


[FONT=&quot]یه فایل سورس [/FONT][FONT=&quot]Source.fla [/FONT][FONT=&quot]و یه کلاس اصلی راه انداز [/FONT][FONT=&quot]MainClass.as [/FONT][FONT=&quot]و یه فولدر به اسم [/FONT][FONT=&quot]packages [/FONT][FONT=&quot]که درون اون ، یه فولدر دیگه ای به اسم [/FONT][FONT=&quot]package01 [/FONT][FONT=&quot] و در داخل اون ، فایل کلاسی [/FONT][FONT=&quot]class01.as [/FONT][FONT=&quot]هست[/FONT][FONT=&quot] . [/FONT]
[FONT=&quot]در این حالت باید در تعریف [/FONT][FONT=&quot]package [/FONT][FONT=&quot] داخل فایل کلاس [/FONT][FONT=&quot]class01.as [/FONT][FONT=&quot] بنویسیم[/FONT][FONT=&quot] :[/FONT]



pic04.JPG





[FONT=&quot]یعنی در این روش باید روبروی عبارت [/FONT][FONT=&quot]package [/FONT][FONT=&quot]، اسامی فولدرها را از روت فولدر سورس یا کلاس اصلی تا رسیدن به فولدری که کلاس مورد نظر در آن قرار داره بنویسیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]بعد از طراحی کلاس و مستقر کردن اون در فولدر مربوطه ، کافیه در سورس اصلی یا کلاس اصلی ، دستور [/FONT][FONT=&quot]import [/FONT][FONT=&quot] رو بنویسیم . در مثال فوق برای وارد کردن [/FONT][FONT=&quot]class01 [/FONT][FONT=&quot]، داخل کلاس اصلی [/FONT][FONT=&quot]MainClass [/FONT][FONT=&quot]می نویسیم[/FONT][FONT=&quot] :[/FONT]
PHP:
import packages.package01.class01;


[FONT=&quot]بعد از [/FONT][FONT=&quot]import [/FONT][FONT=&quot] کردن کلاس1، از اون نمونه سازی می کنیم و یا کارهایی مثل [/FONT][FONT=&quot]extend [/FONT][FONT=&quot] کردن و چیزیای دیگه که بعد ها به اون اشاره می کنیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]یکی از فواید بزرگ بسته بندی کلاسها اینه که ما می تونیم در فولدر های مختلف کتابخانه کلاسی ، چند کلاس همنام داشته باشیم ، بعد می تونیم اونا رو با پیمایش بسته ای به روشی که گفته شد در سورس اصلی [/FONT][FONT=&quot]import [/FONT][FONT=&quot] کنیم .در این وضعیت و وقتی که مثلا دو کلاس مختلف همنام به اسم [/FONT][FONT=&quot]class01 [/FONT][FONT=&quot]در دو بسته مجزا (دو فولدر مجزا) داریم ، در هنگام نمونه سازی از اینها و به خاطر اینکه خطای تداخل و تصادف نام کلاس صورت نگیره ، اونا رو با اسم بسته خودشون صدا می زنیم[/FONT][FONT=&quot] :[/FONT]


Pic05.JPG


[FONT=&quot]
[/FONT]


[FONT=&quot]مثال [/FONT][FONT=&quot]Sample 24-02 [/FONT][FONT=&quot]رو دانلود کنید ، این مثال نمونه ای از این روش آدرس دهی هست[/FONT][FONT=&quot] .[/FONT]

[FONT=&quot]پس نتیجه گیری می کنیم که[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot]یکی از مزایای استفاده از بسته بندی فولدر به فولدر نسبت به حالت [/FONT][FONT=&quot]Publish setting [/FONT][FONT=&quot] اینه که ما در بسته بندی فولدر به فولدر و بسته بندی پلاکی (روش دوم ) ، می تونیم از چند کلاس همنام در یک محیط دستوری استفاده کنیم و از هر کدوم نمونه سازی کنیم ، ولی در حالت [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot]وقتی ما چند کلاس همنام در چند فولدر مختلف رو آدرس دادیم ، هنگام استفاده و نمونه سازی از اونها در یه محیط برنامه ای با تصادف و تداخل نام کلاس مواجه می شیم[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]2-[/FONT][FONT=&quot]وقتی با روش [/FONT][FONT=&quot]publish setting [/FONT][FONT=&quot] به چند کلاس حاوی پلاک بسته ، آدرس می دیم ، به خطا بر می خوریم و همینطور وقتی با دستور [/FONT][FONT=&quot]import [/FONT][FONT=&quot]به چند کلاس که در فولدر های دیگه ای هستند و پلاک بسته ندارند ، آدرس می دیم باز دچار خطا می شیم[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]3-[/FONT][FONT=&quot]منظور از کلاسهایی که در یک بسته قرار دارند ، کلاسهایی هستند که در یک فولدر خاص و کنار هم واقع شده اند و پلاک بسته اونها دقیقا مشابه هم هست [/FONT][FONT=&quot].[/FONT]

[FONT=&quot]*** [/FONT][FONT=&quot]نکته بسیار مهم :[/FONT][FONT=&quot] آدرس دهی به کلاس اصلی راه انداز سورس و کلاس همپوشان یک موی کلیپ همنام با اون (که جلسه قبل در موردش حرف زدیم)[/FONT][FONT=&quot]، فقط و فقط از روش [/FONT][FONT=&quot]publish Setting [/FONT][FONT=&quot] امکانپذیر هست . چرا که اینها در پروژه ها [/FONT][FONT=&quot]import [/FONT][FONT=&quot]نمی شن بلکه در تعامل مستقیم با فایل سورس قرار دارن[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]تعریف مشخصات و متد های یک کلاس با دستور [/FONT][FONT=&quot]static[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]اگر در [/FONT][FONT=&quot]HELP [/FONT][FONT=&quot] خود فلش عبارت [/FONT][FONT=&quot]static [/FONT][FONT=&quot]رو سرچ کنین ، با این عبارت روبرو می شین[/FONT][FONT=&quot]:[/FONT]

HTML:
Specifies that a variable,   constant, or method belongs to the class, rather than to instances of the   class

[FONT=&quot]اگر ما در یک کلاس ، مشخصه ها (متغیر) و یا متد هایی (توابع) رو تعریف کنیم و قبل از عبارت [/FONT][FONT=&quot]var [/FONT][FONT=&quot] ، عبارت [/FONT][FONT=&quot]static [/FONT][FONT=&quot]رو بنویسیم ، این مشخصه و یا متد رو به عنوان مشخصه یا متد تخصصی خود کلاس تعریف کردیم. یعنی اینکه اونو مختص اصل کلاسش کردیم ، اگر از این کلاس نمونه سازی صورت بگیره ، خواهیم دید که دیگه نمی تونیم به مشخصه یا متد [/FONT][FONT=&quot]static [/FONT][FONT=&quot] نمونه ساخته شده از اون کلاس دسترسی داشته باشیم و اگر بخواهیم این کارو انجام بدیم ، دچار خطای کامپایل می شیم . نمونه های متولد شده از یک کلاس نمی تونن مشخصات و متد های [/FONT][FONT=&quot]static [/FONT][FONT=&quot] رو به ارث ببرن[/FONT][FONT=&quot].[/FONT]

[FONT=&quot]در استفاده از این مقوله ، ما فقط می تونیم کلاسمون رو در محیط کاری [/FONT][FONT=&quot]import [/FONT][FONT=&quot] کنیم و بعد بصورت مستقیم به اون کلاس وارد بشیم (اسم اصلی کلاس) و این مشخصه ها و متد ها رو بخونیم یا تغییر بدیم[/FONT][FONT=&quot] .[/FONT]

[FONT=&quot]***[/FONT][FONT=&quot]دقت کنید که فقط و فقط با استفاده از نام اصلی کلاس می تونین به اونا دسترسی خواندنی نوشتنی پیدا کنید[/FONT][FONT=&quot] . ***[/FONT][FONT=&quot]
[/FONT]

[FONT=&quot]مثال [/FONT][FONT=&quot]Sample 24-03 [/FONT][FONT=&quot]مثال خوبی هست که می تونین اونو دانلود کنین و ببینین که چه اتفاقی می افته[/FONT][FONT=&quot] .[/FONT]



[FONT=&quot]
Pic06.JPG

[/FONT]

[FONT=&quot]کد های زیر رو داخل سورس می نویسیم:[/FONT]



[FONT=&quot]
Pic07.JPG

[/FONT]

[FONT=&quot]
[/FONT]


[FONT=&quot]بوجود آوردن مشخصات و متد های عمومی [/FONT][FONT=&quot](global) [/FONT][FONT=&quot] و استفاده از آنها در سراسر یک سورس فلش[/FONT][FONT=&quot]:[/FONT]

[FONT=&quot]ما می تونیم از مشخصه ها و متد های نوع [/FONT][FONT=&quot]static [/FONT][FONT=&quot] یه کلاس در جهت تولید متغیر ها و یا توابع [/FONT][FONT=&quot]global [/FONT][FONT=&quot] استفاده کنیم . اگه یادتون باشه در اکشن اسکریپت 2 ، متغیر ها یا توابع [/FONT][FONT=&quot]_global [/FONT][FONT=&quot]تعریف می کردیم تا غیر از جایی که در اونجا تعریف شدن ، در کل فریم ها و مووی کلیپ ها و تایم لاین ها، قابل دسترسی و تغییر باشن[/FONT][FONT=&quot] . [/FONT]

PHP:
_global.myVariable="Shirin";

[FONT=&quot]این دستور در اکشن اسکریپت 3 حذف شده و باید به روش مشخصه ها و یا متد های استاتیک مختص اصل کلاس ، اونها رو بوجود بیاریم. فقط دقت کنید که برای استفاده مشخصه ها و متد ها در هر سورس ، بهتره اونها رو از نوع[/FONT][FONT=&quot] public [/FONT][FONT=&quot]تعریف کنید[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]
[/FONT]
PHP:
public static var myName:String="Vahid";
PHP:
public static function TraceProperties():void
[FONT=&quot]این مورد رو با دانلود مثال[/FONT][FONT=&quot] Sample24-04 [/FONT][FONT=&quot]و مشاهده دستورات اون ، به بهترین وجه متوجه می شین[/FONT][FONT=&quot].[/FONT][FONT=&quot]در مبحث متغیر های نوع[/FONT][FONT=&quot] object [/FONT][FONT=&quot]به طور کامل تر به این مباحث می پردازیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample 24-04 [/FONT][FONT=&quot]مثال خوبی هست که می تونین اونو دانلود کنین و ببینین که چه اتفاقی می افته[/FONT][FONT=&quot] .[/FONT][FONT=&quot]خروجی این مثال هست[/FONT][FONT=&quot] :[/FONT]

[FONT=&quot]Hadi[/FONT]
[FONT=&quot]27[/FONT]
[FONT=&quot]27[/FONT]
[FONT=&quot]Wellcome Kamran ![/FONT]
[FONT=&quot]27[/FONT]
[FONT=&quot]Mehdi[/FONT]
[FONT=&quot]Wellcome Sahar ![/FONT]
[FONT=&quot]علتش هم اینه که در فریم 1 تایم لاین اصلی ، مقدار دهی های اولیه به اصل متغیر های سراسری انجام شده و تریس های لازم به نمایش در اومدن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد در فریم 1 تایم لاین اصلی ، تایم لاین داخل دایره اجرا شده و تریس اصلی اون انجام شده و در نهایت در فریم 2 تایم لاین اصلی ، دایره ای اضافه شده و در تایم لاین اصلی اون دایره هم ، تریس های لازم انجام گرفتن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample24-02 [/FONT][FONT=&quot]مثالی از بسته بندی فولدر به فولدر رو نشون می ده[/FONT][FONT=&quot] . [/FONT]
[FONT=&quot]می بینیم در بسته بندی فولدر به فولدر پلاکی و با وارد کردن یک بسته در پروژه ، بسته های (فولدر) دیگری که داخل اون فولدر هستند ، وارد نمی شن[/FONT][FONT=&quot] . [/FONT][FONT=&quot]همچنین با نوشتن دستور ستاره[/FONT][FONT=&quot] (*) [/FONT][FONT=&quot]در هنگام ورود کلاس به پروژه ، فقط کلاس هایی که در اون بسته یا همون فولدر قرار دارن وارد می شن ، کلاسهای دیگری که در فولدر های داخلی اون فولدر قرار دارن ، وارد پروژه نمی شن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در این مثال بخاطر تصادف و تداخل چند کلاس همنام ، در بوجود آوردن نمونه ای از برخی از این کلاسها ، مجبور شدیم تا غیر از نام کلاس ، نام بسته اونها رو هم حین تولد نمونه بنوسیم.الباقی توضیحات درون مثال به زبان ثلیث فارسی نوشته شده[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]امیدوارم مطالب گفته شده براتون مفید بوده باشه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]پایان بخش پنجم[/FONT]
 

پیوست ها

  • Sample 24-04.rar
    6.1 کیلوبایت · بازدیدها: 323
  • Sample 24-03.rar
    6.4 کیلوبایت · بازدیدها: 311
  • Sample 24-02.rar
    11.5 کیلوبایت · بازدیدها: 337
  • Sample 24-01.rar
    12.1 کیلوبایت · بازدیدها: 320
  • Lesson 24-Pictures.rar
    274.7 کیلوبایت · بازدیدها: 639
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکريپت 3- درس بيست و پنجم

[FONT=&quot]بسم الله الرحمن الرحيم[/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot] بحث ارث بري کلاسها از کلاسهاي ديگر يا[/FONT] inheritance [FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot]سلام خسته نباشيد[/FONT]
[FONT=&quot]جلسات پيش بحث کلاسها رو پيش کشيديم و انواع حالتهاي استفاده از کلاسها رو گفتيم. و امروز به بحث ارث بري کلاسها مي پردازيم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]به تصویر زير نگاه کنيد[/FONT][FONT=&quot]: [/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot]
Pic01.jpg

[/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot]در این شکل شما پدر بزرگی رو با شماره یک می بینین و همچنین فرزند پدر بزرگ رو با شماره دو و نوه پدر بزرگ که فرزند فرزند پدر بزرگ هم می شه با شماره سه [/FONT][FONT=&quot].[/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]در این مبحث ما با هم قرار می گذاریم که در مثالها و مفهوم کلاسها ، به پدر بزرگ ، مادر یک یا مادر اصلی یا مادر نهایی یا مادر بزرگ بگیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]ما در این مبحث به فرزند پدر بزرگ با شماره 2 ، فرزند مادر اصلی یا فرزند مادر 1 یا زیر کلاس مادر یک و یا مادر فرزند مطلق می گیم[/FONT][FONT=&quot]. [/FONT]
[FONT=&quot]3-[FONT=&quot] [/FONT][/FONT][FONT=&quot]ما در این مبحث به نوزادی که نوه مادر یک و فرزند فرزند مادر یک هست ، کودک مطلق ، لقب می دیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]همیشه در نمونه های مختلف موجوداتی مثل انسان ، مشاهده کرده ایم که نسل های آینده ، گروهی از خصوصیات و صفات پدران و پدر بزرگ ها و اجداد خود را به ارث برده اند. اگه بخواهیم به دید کلاسی و به دور از دید نمونه های متولد شده به قضیه نگاه کنیم، هر موجودی در دسته بندی های مختلفی قرار می گیره به شکلی که نمونه های متولد شده از موجودی مثل انسان رو با نمونه هایی از کلاسهای دیگر مثل کلاس شتر ، در دسته مشترک و کلی تری مثل موجودات پستاندار قرار می دن و باز هم اونها رو در دسته کلی تر و کامل تری مثل کلاس مهره داران و ... و در نهایت همه موجودات زنده رو با مشخصات و متد های نهایی و کلی ، در کلاس موجودات زنده قرار می دن[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]در بحث کلاسها هم این قضایا مطرح هست ، همونطوری که هر نمونه ساخته شده از یه کلاس ، مشخصات و متد های کلاس اصلی رو به ارث می بره ، خود کلاسهای اصلی هم می تونه دسته ای از مشخصات و متد های خاص کلاس های دیگه رو (اجداد و پدربزرگها) به ارث ببره . انگار که اطلاعات به ارث رفته رو به صورت عادی در ساختار اصلی خودشون تعریف کردیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]اکشن اسکریپت 3 ، ساختار منظمی رو برای این مقوله به وجود آورده ، این ساختار منظم ، استفاده از سطوح دسترسی جدیدی به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]protected [/FONT][FONT=&quot]و [/FONT][FONT=&quot]private [/FONT][FONT=&quot] و [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] هست که از نظر مفهومی با اکشن اسکریپت 2 تفاوت های زیادی رو داره[/FONT][FONT=&quot]. [/FONT][FONT=&quot]تفاوت اونها هم در اینه که مشخصه ها و متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]private [/FONT][FONT=&quot]قابل دسترسی از داخل هیچ کلاس و زیر کلاس دیگه غیر از خود کلاسش نیستند ولی مشخصه ها و متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]protected [/FONT][FONT=&quot]توسط زیر کلاسها یا کلاسهای فرزند ، قابل دسترسی هست[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample25-01 [/FONT][FONT=&quot]رو دانلود کنید و به دستورات زیر توجه کنید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]با این مثال به طور کامل ، سطوح دسترسی و طریقه تولید زیر کلاس رو می گیم[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot] [/FONT]

[FONT=&quot]
Pic02.JPG
[/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot]مستحضر هستید که کلاسی رو در بسته ( فولدر کتابخانه ای ) به نام [/FONT][FONT=&quot]P1[/FONT][FONT=&quot] [/FONT][FONT=&quot] با عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]Mother[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار دادیم و در اون چهار مشخصه با سطوح دسترسی مختلف [/FONT][FONT=&quot]public private , protected , internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] قرار دادیم و نام و مقدار رشته اونها رو هم مناسب به نسبت سطوح دسترسیشون نوشتیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در نهایت یه تابع عمومی برای نمایش مشخصه های این کلاس ، در خود کلاس مادر بوجود آوردیم تا بتونه بدون محدودیت ، به مشخصات و متد های مختلف (از نظر سطح دسترسی ) این کلاس ، دست پیدا کنه و اونها رو تریس کنه . همونطوری که می بینید ، وقتی قبل از تعریف مشخصه ای خاص ، سطح دسترسی خاصی تعریف نمی کنیم ، اکشن اسکریپت 3 اونو بطور پیش فرض ، از نوع [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] یا داخلی تعریف می کنه . مشخصه هایی از این نوع ، فقط در بسته (فولدر)[/FONT][FONT=&quot] [/FONT][FONT=&quot]خودشون و توسط کلاسهای مختلف داخل این بسته ، قابل دسترسی هستند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic03.JPG
[/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot]کلاس دیگه ای رو در همون بسته مادر بوجود آوردیم و با دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] [/FONT][FONT=&quot]اونو زیر کلاسی از کلاس مادر قرار دادیم ، توجه داشته باشید که اگر ما کلاس مادر رو در این بسته [/FONT][FONT=&quot]import[/FONT][FONT=&quot] [/FONT][FONT=&quot] نکنیم به خطا بر می خوریم . همچنین اگر چند کلاس مادر همنام در بسته های مختلف داشته باشیم ، باید کلاس مادر مد نظر رو فقط در بسته کلاس فرزند [/FONT][FONT=&quot]import[/FONT][FONT=&quot] [/FONT][FONT=&quot] کنیم و در این حین می تونیم کلاس مادر مد نظرمونو با اسم کلی بسته بندیش ، خطاب کنیم ، یعنی اینکه بعد از [/FONT][FONT=&quot]import[/FONT][FONT=&quot] [/FONT][FONT=&quot] مادر ، در هنگام [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] [/FONT][FONT=&quot] کردن ، می تونیم اسم بسته مادر رو تا رسیدن به اسم کلاس مادر بنویسیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همـونـطوری که مـی بینـید ، مـا دیـگه مشـخصه خـاصی رو بـه این کـلاس فرزنـد تعریف نکردیم ، بلکه تمام مشخصه ها و متد های مادرش رو در هر سطح دسترسی[/FONT][FONT=&quot] [/FONT][FONT=&quot]([/FONT][FONT=&quot]public , private , protected , internal[/FONT][FONT=&quot])[/FONT][FONT=&quot] [/FONT][FONT=&quot]همه و همه رو به ارث برده[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]نکته بسیار مهم و حیاتی : وقتی ما سطوح دسترسی مثل [/FONT][FONT=&quot] [/FONT][FONT=&quot]protected , private , internal[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو به مشخصات و متد های مادر اصلی ، اختصاص می دیم ، کلاس های فرزندی ، تمام این مشخصه ها و متد ها رو در هر سطح به ارث می برن .فقط از نظر دسترسی خواندنی / ویرایشی به مشخصات و متد های به ارث رفته از داخل کلاس فرزند ، ما توان دسترسی به سطح [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] (و همچنین [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] به شرط یکسان نبودن بسته مادر و فرزند ) رو نداریم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]ملاحظه می کنید که از داخل فرزند 1 ، متد عمومی [/FONT][FONT=&quot] [/FONT][FONT=&quot]INFO[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو تعریف کردیم تا مشخصه های به ارث رفته از مادرشو نمایش بده ، ولی چون این متد ، خاص فرزند 1 هست ، نمی تونه به مشخصه سطح [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] مادرش دست پیدا کنه و اونو نمایش بده همچنین به خاطر یکسان بودن بسته اونها (به پلاک بسته ها توجه کنید ) ، متد [/FONT][FONT=&quot]INFO[/FONT][FONT=&quot] [/FONT][FONT=&quot] می تونه به مشخصه [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] به ارث رفته از مادرش دست پیدا کنه و نمایش بده[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]

Pic04.JPG

[FONT=&quot]
[/FONT]
[FONT=&quot]کلاس فرزندی دیگه ای رو بوجود آوردیم با نام فرزند 2 و اینبار اونو در بسته دیگه ای (غیر از بسته یا فولدر مادر) قرار دادیم . با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] [/FONT][FONT=&quot]، این کلاسی هم تمام مشخصات و متد های مادرش رو به ارث برد . متدی عمومی رو هم داخل این کلاس با عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]INFO[/FONT][FONT=&quot] [/FONT][FONT=&quot]تعریف کردیم و این متد برای تریس مشخصات به ارث رفته این کلاس از کلاس مادر هست . ملاحظه می کنید که در مورد دسترسی به مشخصات به ارث رفته ، این متد و این کلاس ، نمی تونه دسترسی خواندنی / نوشتنی به مشخصه ها و متد های به ارث رفته سطح [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] و سطح [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] مادرشون داشته باشه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]چرا ؟ چون سطح [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] که خصوصی هست ، همچنین به علت یکسان نبودن بسته های کلاس مادر و کلاس فرزند 2 ، سطح [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] مادر ، قابل رویت در فرزند 2 نیست[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]

Pic05.JPG


[FONT=&quot]در نهایت یک سورس فلش رو کنار فولدر [/FONT][FONT=&quot]P1[/FONT][FONT=&quot] [/FONT][FONT=&quot] و بیرون از اون قرار می دیم و در فریم تایم لاین اون ، دستورات بالا رو نوشتیم . یعنی هر سه کلاس مادر و فرزند 1 و 2 رو [/FONT][FONT=&quot] [/FONT][FONT=&quot]import[/FONT][FONT=&quot] [/FONT][FONT=&quot]کردیم و از هر کدوم ، نمونه سازی کردیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در مورد نمونه های ساخته شده ، همه نمونه ها ، مشخصه های [/FONT][FONT=&quot]public , private , internal , protected[/FONT][FONT=&quot] [/FONT][FONT=&quot] کلاس مادر رو به ارث بردند ، ولی از نظر دسترسی [/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]چون متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]Information[/FONT][FONT=&quot] [/FONT][FONT=&quot]در داخل کلاس مادر اصلی تعریف شده بود و به تمام مشخصات اون دسترسی داشت ، تمام مشخصات و متد های به ارث رفته از مادر رو نمایش می ده ، حتی مشخصات [/FONT][FONT=&quot]private , internal , protected[/FONT][FONT=&quot] [/FONT][FONT=&quot] با این دستور ، ثابت می شه که همه نمونه ها ، همه مشخصات و متد های مادرشونو به ارث بردند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]چون در یک سورس فلش هستیم ، بصورت معمول و از داخل سورس ، فقط می تونیم به مشخصات و متد های سطح عمومی نمونه های ساخته شده از هر کلاس ، دسترسی خواندنی / نوشتنی داشته باشیم .(چرا که سورس ما ، در بسته هیچ کدوم از اونها نیست )، پس نمی تونیم به سطح [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot] نمونه ها هم دسترسی داشته باشیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]3-[FONT=&quot] [/FONT][/FONT][FONT=&quot]متد [/FONT][FONT=&quot]INFO[/FONT][FONT=&quot] [/FONT][FONT=&quot] که فقط در داخل کلاسهای فرزند تعریف شده بود ، تنها به مشخصات [/FONT][FONT=&quot] [/FONT][FONT=&quot]public , protected[/FONT][FONT=&quot] [/FONT][FONT=&quot]به ارث رفته از کلاس مادر ، دسترسی داره . همچنین به مشخصه های [/FONT][FONT=&quot] [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] [/FONT][FONT=&quot]به شرط یکی بودن بسته مادر و فرزند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]قانون مهم در مورد بحث ارث بری کلاسی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]در مورد کلاس فرزند ، می تونیم بگیم که همه مشخصات و متد های کلاس مادرشو به ارث می بره ولی در حالت برعکس ، کلاس فرزند می تونه مشخصات و متد هایی رو داشته باشه که کلاس مادر ، از اونها برخوردار نیست[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]
[/FONT][FONT=&quot]نکته الحاقی 1 : [/FONT][FONT=&quot]فرض کنید کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot]رو بوجود آوردیم و در اون مشخصه نوع[/FONT][FONT=&quot] public [/FONT][FONT=&quot]به اسم[/FONT][FONT=&quot]_Name [/FONT][FONT=&quot] بوجود آوردیم . حالا کلاس دیگری به اسم[/FONT][FONT=&quot] B [/FONT][FONT=&quot]بوجود می یاریم و اونو با دستور [/FONT][FONT=&quot]extends [/FONT][FONT=&quot]، زیر کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot]قرار می دیم .توجه کنید که در کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]هیچ مشخصه ای رو تعریف نکردیم. حالا اگر از کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]نمونه سازی کنیم و اسم نمونه رو [/FONT][FONT=&quot]BObject [/FONT][FONT=&quot] بگذاریم ، نمونه ساخته شده از کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]، مشخصه ای از نوع[/FONT][FONT=&quot] public [/FONT][FONT=&quot]به اسم[/FONT][FONT=&quot] [/FONT][FONT=&quot]_Name [/FONT][FONT=&quot]خواهد داشت ، انگار که این مشخصه رو در حالت معمول و در ساختار کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]تعریف کرده بودیم[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]

[FONT=&quot]
[/FONT]
PHP:
 var BObject:B=new B();
BObject._Name="Hadi";
[FONT=&quot]در واقع به مشخصه[/FONT][FONT=&quot] [/FONT][FONT=&quot]_Name [/FONT][FONT=&quot]که نمونه ساخته شده از[/FONT][FONT=&quot] B [/FONT][FONT=&quot]از مادرش یعنی[/FONT][FONT=&quot] A [/FONT][FONT=&quot]به ارث برده بود ، مقدار دهی کردیم[/FONT][FONT=&quot].[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]ارث بری یک کلاس از چند کلاس اصلی مادر[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]در برخی ساختار های برنامه نویسی ، ما می تونیم یک کلاس رو زیر کلاس چند کلاس مختلف کنیم . مثلا در زبان [/FONT][FONT=&quot] [/FONT][FONT=&quot]C#[/FONT][FONT=&quot] [/FONT][FONT=&quot]ما با دستور [/FONT][FONT=&quot]interface[/FONT][FONT=&quot] [/FONT][FONT=&quot] بصورت غیر مستقیم این کار انجام می گیره[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در اکشن اسکریپت 3 هم بطور معمول ما نمی تونیم یک کلاس رو زیر کلاس دو یا چند کلاس مادر اصلی کنیم ، ولی برای اینکه کلاس فرزند بتونه از چند کلاس اصلی ، ارث بری داشته باشه ، باید این کار رو بصورت طولی انجام بدیم . یعنی کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو به عنوان مادر اصلی بوجود می یاریم ، سپس کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]B [/FONT][FONT=&quot]رو به عنوان زیر کلاس [/FONT][FONT=&quot]A [/FONT][FONT=&quot]و در نهایت ، کلاس سوم[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot]C [/FONT][FONT=&quot]رو به عنوان زیر کلاس [/FONT][FONT=&quot]B [/FONT][FONT=&quot] و در حقیقت نوه[/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]با این کار ، ما کلاس سوم یا همون نوه رو ، هم از مشخصات و متد های کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]و هم کلاس [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot] بهره مند کردیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]البته روشی رو برای اینکه کلاسی رو زیر کلاس چند کلاس مادر کنیم ، از سایت های خارجی پیدا کردم ، این روش ، استفاده از دستور [/FONT][FONT=&quot]interface[/FONT][FONT=&quot] [/FONT][FONT=&quot] در زبان اکشن اسکریپت 3 هست ، دقیقا شبیه به اون چیزی که در [/FONT][FONT=&quot] [/FONT][FONT=&quot]C#[/FONT][FONT=&quot] [/FONT][FONT=&quot]استفاده می کردیم تا یک کلاس رو ، زیر کلاس چند کلاس مادر قرار بدیم. من متن انگلیسی اونو آماده کردم و در یک فایل [/FONT][FONT=&quot]pdf[/FONT][FONT=&quot] [/FONT][FONT=&quot] با نام [/FONT][FONT=&quot] [/FONT][FONT=&quot]Lesson25-As3 inherite Multiple.rar[/FONT][FONT=&quot][/FONT][FONT=&quot]قرار دادم که می تونید دانلود کنید[/FONT][FONT=&quot] .[/FONT][FONT=&quot] در این روش از دستورات [/FONT][FONT=&quot]implement[/FONT][FONT=&quot] و [/FONT][FONT=&quot]interface[/FONT][FONT=&quot] استفاده شده که انشاءال... به خواست خداوند یکتا ، در دوره بعدی آموزش شی گرایی ، به طور مفصل به اون موارد خواهیم پرداخت .[/FONT]

Pic06.jpg



[FONT=&quot]مثال [/FONT][FONT=&quot]Sample25-02[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنید . این مثال درمورد ارث بری 3 کلاس بصورت طولی (زنجیره ای) هست[/FONT][FONT=&quot] . [/FONT][FONT=&quot][/FONT]
[FONT=&quot]در مثال [/FONT][FONT=&quot]Sample25-02[/FONT][FONT=&quot] [/FONT][FONT=&quot] ما با 3 کلاس سر و کار داریم : کلاس مادر یک یا [/FONT][FONT=&quot]A [/FONT][FONT=&quot] که نقش مادر بزرگ رو بازی می کنه . این کلاس 3 مشخصه با سطوح دسترسی مختلف [/FONT][FONT=&quot]public , private , protected[/FONT][FONT=&quot] [/FONT][FONT=&quot] داره . همچنین 3 متد مختلف با سطوح دسترسی نام برده شده . اسم و مقادیر مشخصات و متد ها را مناسب خودشون قرار دادیم. کلاس دوم کلاس فرزند مادر یک یا زیر کلاس مادر یک یا [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot] هست که فرزند و زیر کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot]شده . این کلاس هم مثل کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot]، سه مشخصه و سه متد با سطوح دسترسی مختلف نام برده شده داره[/FONT][FONT=&quot] [/FONT][FONT=&quot]( البته مختص خودش)[/FONT][FONT=&quot] [/FONT][FONT=&quot]. [/FONT][FONT=&quot]در نهایت ، کلاس دیگری رو با نام فرزند مطلق یا [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot] داریم که نقش نوه[/FONT][FONT=&quot] A [/FONT][FONT=&quot]و نقش فرزند[/FONT][FONT=&quot] B [/FONT][FONT=&quot]رو بازی می کنه[/FONT][FONT=&quot] . [/FONT][FONT=&quot]این کلاس ، زیر کلاس زیر کلاس مادر یک شده . پس [/FONT][FONT=&quot]B [/FONT][FONT=&quot] تمامی مشخصات و متد های [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو به ارث برده و کلاس [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot]، هم مشخصات و متد های [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot]رو به ارث برده و هم مشخصات و متد های [/FONT][FONT=&quot] [/FONT][FONT=&quot]B[/FONT][FONT=&quot]رو . پس می تونیم بگیم که [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot] ، کامل ترین کلاس هاست ، چرا که غیر از مشخصات و متد های اجدادش ، چیز های جدیدی رو هم برای خودش داره و بعد از اون ، مادرش یعنی [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot]، کامل ترینه . درسته که مشخصات و متد های مختص [/FONT][FONT=&quot] [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو نداره ، ولی حد اقل مشخصات و متد های [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو هم کنار مشخصات و متد های خودش به ارث برده[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در داخل کلاس [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot] ، ما دو تا متد رو ، یکی برای نمایش دارایی هایی که از [/FONT][FONT=&quot] [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot]به ارث برده و دیگری رو برای نمایش دارایی هایی که از مادر بزرگش یعنی [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]به ارث برده ، بصورت عمومی تعریف کردیم و مشخص هست که [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot]، تونسته تمام مشخصات و متد های اجدادش اعم از[/FONT][FONT=&quot] public , private , protected , internal [/FONT][FONT=&quot]رو به ارث ببره و داشته باشه ، ولی نتونسته مشخصه های[/FONT][FONT=&quot] private [/FONT][FONT=&quot]اون دست پیدا کنه ، همچنین به مشخصات[/FONT][FONT=&quot] internal [/FONT][FONT=&quot]به شرط اینکه هر دو در یک بسته نباشند [/FONT][FONT=&quot]. [/FONT][FONT=&quot]یک بار دیگه هم خاطر نشان می کنم که برای نمایش خصوصیات [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] به ارث رفته از اجداد [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot]، کافیه متد عمومی رو در داخل اجدادش یعنی در داخل [/FONT][FONT=&quot]A , B[/FONT][FONT=&quot] [/FONT][FONT=&quot] تعریف کنید تا مشخصات [/FONT][FONT=&quot]private[/FONT][FONT=&quot] [/FONT][FONT=&quot] خودشونو نمایش بدن ، بعد می بینید که [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot]، اون متد عمومی نمایش مشخصات رو به ارث خواهد برد و در نهایت با نمونه سازی از [/FONT][FONT=&quot]C[/FONT][FONT=&quot] [/FONT][FONT=&quot] و فراخوانی متد عمومی تعریف شده اجدادی در مورد نمونه ساخته شده ، مشخصه خصوصی به ارث رفته رو مشاهده خواهید کرد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]استفاده از دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]override[/FONT][FONT=&quot] [/FONT][FONT=&quot]و جایگزین کردن متد جدیدی بجای یک متد به ارث رفته همنام خودش[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]ما در شرایطی خاص ، نیاز به این داریم که متد ی که فرزند از اجدادش به ارث برده رو عوض کنیم و یکی دیگه رو همنام اون متد بوجود بیاریم و در ساختار فرزند قرار بدیم . به بیان بهتر ، گاهی نیاز به این پیدا می کنیم که متدی رو که فرزند از پدرش به ارث برده ، با متد دیگه ای عوض کنیم و اونو تغییر بدیم . در این شرایط از دستور [/FONT][FONT=&quot] override[/FONT][FONT=&quot] [/FONT][FONT=&quot] استفاده می کنیم . فرض کنین کلاس فرزند 1 از اجدادش ، متدی با عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]met01[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو به ارث برده . حالا می خواهیم متد یاد شده رو عوض کنیم و مختص کلاس فرزندمون درست کنیم . پس در کلاس فرزند ، دوباره اونو به صورت زیر تعریف می کنیم البته با استفاده از دستور [/FONT][FONT=&quot]override[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
Pic07.JPG


[FONT=&quot]با این کار ، متد جدید با نام [/FONT][FONT=&quot]met01[/FONT][FONT=&quot] [/FONT][FONT=&quot]، با متد به ارث رسیده همنامش جایگزین می شه. در این حالت ، متد قبلی ارث رفته ، از بین نمی ره . فرض کنید از کلاس فرزند ، نمونه ای به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object01[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو درست کردیم . در این شرایط اگه بخواهیم به متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]override [/FONT][FONT=&quot]شده اون دسترسی داشته باشیم ، کافیه بنویسیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
Pic08.JPG

[FONT=&quot]
[/FONT]
[FONT=&quot]ملاحظه خواهید کرد که دیگه متد جدید[/FONT][FONT=&quot] [/FONT][FONT=&quot]override[/FONT][FONT=&quot] [/FONT][FONT=&quot]شده و جایگزین شده ، به نمایش در می یاد و نمونه همنام قدیمیش ( که از اجداد به ارث رفته بود ) دیگه به نمایش در نمی یاد[/FONT][FONT=&quot] [/FONT][FONT=&quot]. [/FONT][FONT=&quot]دستور[/FONT][FONT=&quot] override [/FONT][FONT=&quot]بر خلاف اونچه فکر می کردم ، فقط بر روی متد ها عملی هست و در مورد مشخصه ها ، عملی نیست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در این حالت ، متد های قبلی به ارث رفته ، به حالت [/FONT][FONT=&quot]super[/FONT][FONT=&quot] [/FONT][FONT=&quot] می رن . طریقه استفاده از دستور [/FONT][FONT=&quot]super[/FONT][FONT=&quot] [/FONT][FONT=&quot] برای دسترسی به متد های قدیمی و به ارث رفته ، طبق دستور زیر هست . فرض کنید می خواهیم به متد [/FONT][FONT=&quot]met01[/FONT][FONT=&quot] [/FONT][FONT=&quot] قدیمی که از اجداد به ارث رفته بود دسترسی داشته باشیم ، در صورتیکه متدی همنام خودش با دستور[/FONT][FONT=&quot] override [/FONT][FONT=&quot]در ساختار کلاس فرزند ، جایگزین اون شده و متد موروثی قدیمی که در ساختار اجدادی تعریف شده بود ، به حالت[/FONT][FONT=&quot] super [/FONT][FONT=&quot]رفته [/FONT][FONT=&quot]. [/FONT][FONT=&quot] پس در داخل کلاس فرزند می نویسیم[/FONT][FONT=&quot] :[/FONT]

Pic09.JPG


[FONT=&quot]با این دستور ، به متد قدیمی دسترسی پیدا می کنیم ، گاهی هم به گونه دیگه ای از دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]super[/FONT][FONT=&quot] [/FONT][FONT=&quot]استفاده می کنیم . فرض کنید کلاس مادر ، یک تابع سازنده یا [/FONT][FONT=&quot] constructor[/FONT][FONT=&quot] [/FONT][FONT=&quot] داره و کلاس فرزند هم یک تابع [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] [/FONT][FONT=&quot] خاص خودش داره و هر دو تابع سازنده ، پارامترهای خاصی رو به عنوان ورودی می گیرند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]برای اینکه ما بتونیم به متد قدیمی به ارث رفته و بوسیله تابع سازنده کلاس مادر ، از داخل کلاس فرزند ، دسترسی پیدا کنیم به طریقه زیر از دستور [/FONT][FONT=&quot]super[/FONT][FONT=&quot] [/FONT][FONT=&quot]استفاده می کنیم .فرض کنید اسم تابع سازنده کلاس مادر هست [/FONT][FONT=&quot]MotherClass[/FONT][FONT=&quot] [/FONT][FONT=&quot]، این تابع سازنده ، یک پارامتر رشته ای برای جایگزینی به مشخصه اسم مادر ، و یک پارامتر عددی برای جایگزینی در مشخصه عددی سن کلاس مادر می گیره یعنی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]

Pic10.jpg

[FONT=&quot]
[/FONT]
[FONT=&quot]سپس در تابع سازنده کلاس فرزند ، کافیه دستور زیر رو بنویسیم . این دستور با استفاده از کانسترکتور کلاس مادر ، به مشخصه های اصلی به ارث رفته و قدیمی مادر ، مقدار دهی می کنه . پس مشخصات قدیمی به ارث رفته ، مقدار دهی می شن و اگه در کانسترکتور مادر ، تابع یا دستور دیگه ای باشه ، با فراخوانی حالت دوم دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]، اون متد ها و دستورات جدید ، اجرا می شن[/FONT][FONT=&quot].[/FONT][FONT=&quot] [/FONT]

Pic11.jpg


[FONT=&quot]نکته ای که هست اینه که دستور بالا(حالت دوم استفاده از[/FONT][FONT=&quot] [/FONT][FONT=&quot]( super [/FONT][FONT=&quot]رو باید در کانسترکتور فرزند بنویسم وگرنه به خطا بر می خوریم[/FONT][FONT=&quot].[/FONT][FONT=&quot] همچنین دستور دوم استفاده از [/FONT][FONT=&quot]super[/FONT][FONT=&quot] ، برای اینه که وقتی نمونه ای از کلاس فرزند رو بوجود می یاریم ، بتونیم به کانسترکتور مادرش که پارامتر های ورودی رو دریافت می کرد ، مقدار دهی کنیم .[/FONT]
[FONT=&quot]در استفاده از دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]باید به نکته ای توجه کرد ، گاهی اجداد کلاس ، کانسترکتور های خاص خود رو دارن و از طریق کانسترکتور ، به مشخصه های خاص خودشون مقدار دهی می کنند[/FONT][FONT=&quot].[/FONT][FONT=&quot]در این حالت وقتی ما نمونه ای از کلاس فرزند رو درست می کنیم و به مشخصات و متد های تعریف شده در اون (با کانسترکتور فرزند ) مقدار دهی می کنیم ، راهی رو برای مقدار دهی به مشخصات و متد های به ارث رسیده از کلاس مادر داریم و اون استفاده از روش[/FONT][FONT=&quot] super [/FONT][FONT=&quot]کانسترکتوری هست[/FONT][FONT=&quot].
[/FONT][FONT=&quot]فرض کنید کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot]رو بوجود آوردیم و در اون ، کانسترکتوری رو تعریف کردیم که دو تا پارامتر ورودی می گیره . بعد کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]رو بوجود آوردیم و اونو زیر کلاس[/FONT][FONT=&quot] A [/FONT][FONT=&quot] کردیم و کانسترکتوری رو هم واسه[/FONT][FONT=&quot] B [/FONT][FONT=&quot]تعریف کردیم . خوب باید به این فکر باشیم که اگه نمونه ای از کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]بوجود بیاد ، چطور می تونه بوسیله کانسترکتور مادریش یعنی کانسترکتور[/FONT][FONT=&quot] A [/FONT][FONT=&quot]به مشخصات به ارث رفته از مادرش یعنی[/FONT][FONT=&quot] A [/FONT][FONT=&quot]مقدار دهی کنه . چون معمولا ، هر کانسترکتور رو در کلاسهای فرزندی به گونه ای تعریف می کنیم که مثلا با گرفتن پارامتر ورودی ، به مشخصه های (متغیر) خودش مقدار دهی کنه ، پس دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]رو در کانسترکتور فرزند می نویسیم و پرانتز ها رو باز و بسته می کنیم و به سبک پارامتر های ورودی مادرش یعنی[/FONT][FONT=&quot] A [/FONT][FONT=&quot]، مقدار دهی می کنیم . گویا کانسترکتور[/FONT][FONT=&quot] A [/FONT][FONT=&quot]رو صدا زدیم و به مشخصه های به ارث رسیده از[/FONT][FONT=&quot] A [/FONT][FONT=&quot]، به سبک کانسترکتور[/FONT][FONT=&quot] A [/FONT][FONT=&quot]، مقدار دهی کردیم. اگر کلاس سومی رو به اسم[/FONT][FONT=&quot] C [/FONT][FONT=&quot]و زیر کلاس[/FONT][FONT=&quot] B [/FONT][FONT=&quot]و نوه[/FONT][FONT=&quot] A [/FONT][FONT=&quot]بوجود بیاریم و به[/FONT][FONT=&quot] C [/FONT][FONT=&quot]کانسترکتوری رو با پارامتر های ورودی تعریف کنیم ، باید به فکر این باشیم که در کانسترکتور[/FONT][FONT=&quot] C [/FONT][FONT=&quot]به مشخصه های[/FONT][FONT=&quot] B [/FONT][FONT=&quot]، به سبک ، نوع و ترتیب و تعداد ورودی های کانسترکتور[/FONT][FONT=&quot] B [/FONT][FONT=&quot]، و با استفاده از دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]، مقدار دهی کنیم . پس مشاهده می شه که هر جا در سلسله مراتب کلاسهای مادری و فرزندی ، در یکی از کلاسها ، کانسترکتور تعریف می شه ، در کلاس فرزندش ، کانسترکتوری تعریف می شه که در اون با استفاده از دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]به سبک پارامتر های ورودی کانسترکتور مادر ، به مشخصه های کانسترکتور مادر مقدار دهی می شه . و این روش ، سلسله وار از کلاسهای فرزندی تا اونجایی پیش می ره که دیگه کانسترکتوری در کلاسهای بالاتر تعریف نشده باشه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]

[FONT=&quot]
[/FONT][FONT=&quot]توجه کنید که هر دستور[/FONT][FONT=&quot] super [/FONT][FONT=&quot]در ساختار یک کلاس ، فقط به کلاس مادر اون کلاس دسترسی پیدا می کنه[/FONT][FONT=&quot].
[/FONT][FONT=&quot]پس نتیجه می گیریم که اگر در کلاسی ، با دستور[/FONT][FONT=&quot] override [/FONT][FONT=&quot]، متدی به اسم [/FONT][FONT=&quot]myMethod [/FONT][FONT=&quot] رو با متد همنام به ارث رسیده از مادرش ، تعویض کنیم و کلاس دومی رو زیر کلاس اون قرار بدیم و در کلاس فرزند بنویسیم [/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]

[FONT=&quot] [/FONT]
PHP:
super.myMethod();

[FONT=&quot]در این حالت فقط به متد مادری کلاس فرزند دست پیدا کردیم و چون این متد ، در کلاس مادر با دستور[/FONT][FONT=&quot] override [/FONT][FONT=&quot]تعویض شده بود ، به متد جدید دوم (تعویش شده ) دست پیدا کردیم ، نه متد اولیه اصیل[/FONT][FONT=&quot]. [/FONT][FONT=&quot]این نکته رو خوب تحویل بگیرید[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample25-03[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنید . این مثال به تفسیر دستور [/FONT][FONT=&quot]override[/FONT][FONT=&quot] [/FONT][FONT=&quot] می پردازه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]بعد از دانلود این مثال ، می تونید دستورات فارسی اونو در مقابل کدها دنبال کنید و به این مبحث پی ببرید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در آینده ای نزدیک به مبحث بعدی یعنی کلاسهای داینامیک و اشیای داینامیک [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]خواهیم پرداخت[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پایان بخش ششم[/FONT]
[FONT=&quot]
[/FONT]
 

پیوست ها

  • Sample25-01.rar
    7.1 کیلوبایت · بازدیدها: 308
  • Sample25-02.rar
    8.6 کیلوبایت · بازدیدها: 302
  • Sample25-03.rar
    6.2 کیلوبایت · بازدیدها: 304
  • Lesson25-Pictures.rar
    570.9 کیلوبایت · بازدیدها: 684
  • As3 inherite Multiple.rar
    40.7 کیلوبایت · بازدیدها: 371
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 از صفر - درس بیست و ششم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]
[FONT=&quot]مبحث کلاسهای داینامیک و کلاس اشیای داینامیک ([/FONT][FONT=&quot]Object[/FONT][FONT=&quot]):[/FONT]
[FONT=&quot]با سلام خدمت شما [/FONT]
[FONT=&quot]به بحث کلاسهای داینامیک و اشیای داینامیک از نوع [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] می پردازیم. این دو مقوله شبیه همند و به همین خاطر هر دو رو در مبحث درس بیست و ششم می گیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شروع بحث[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همونطوری که می دونید ، نمونه های ساخته شده از یه کلاس ، از لحاظ کارایی و تعداد و نوع مشخصه ها و متد هایی که به ارث می برن ، خیلی شبیه همند . به گفته بهتر ، مشاهده می کنید که نمونه های ساخته شده از یک کلاس ، بصورت استاتیک ، محدود به مشخصات و متد های به ارث رسیده از مادر یا مادرانش هستند و از نظر تعداد و نوع مشخصات و متد ها ، مساویند. پس تمامی نمونه ها در یک قالب و ساختار ثابت ، مثل همند و فقط از نظر مقادیر مشخصاتی و تأثیراتشون در متد هاشون ، با هم دیگر اختلاف دارند. ما دربرخی پروژه ها نیاز به این داریم که نمونه های ساخته شده از یک کلاس رو ، انعطاف پذیر تر کنیم تا هر نمونه بتونه جدای از الباقی نمونه ها ، کارهای خاصی رو انجام بده . برای درک بهتر گفته هام به شکل زیر توجه کنید[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]


Pic01.jpg



[FONT=&quot]همونطوری که ملاحظه می فرمایید ، در کنار نمونه های ساخته شده از کلاس انسان های عادی ، ما چهار انسان دیگه رو بوجود آوردیم که چیزهایی رو از بقیه بیشتر دارن و می تونن کارهای خارق العاده ای رو انجام بدن مثل پرواز ، مثل قد بلند و قدرت زیاد و ... پس هر چهار نفر نیاز به چیزهای جدید و اضافه ای دارند که بقیه ، اونها رو ندارند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]کلاسهای داینامیک[/FONT][FONT=&quot] : [/FONT][FONT=&quot][/FONT]
[FONT=&quot]بحث کلاسهای داینامیک ، به این مسائل ختم می شه ، واژه داینامیک یعنی پویا و انعطافپذیر ، ما کلاسی رو بوجود می یاریم و نمونه هایی رو از روی اون تولید می کنیم و این نمونه ها ، در عین ارث بری مشخصات و متد های کلاس مادر و مادران ، می تونن گروه دیگه ای از مشخصات و متد های جدید و ثانویه رو به صورت اختصاصی برای هر نمونه جدید ، داشته باشند. این عامل موجب می شه که نمونه های جدید بتونن از نظر ساختاری ، تفاوت های اساسی با هم داشته باشند و هر نمونه ، گروهی پارامتر های جدید و خاص خودشو داشته باشه . با استفاده از این کلاسها ، دست کاربر طراح ، در بوجود آوردن نمونه های کاربردی و اختصاصی ، بازتر می شه و خود این عامل ، امتیاز و مزیت بزرگی در پروژه های قدرتمند و بزرگ هست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]ساختار کلاسهای داینامیک[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]برای ساختن کلاسهای داینامیک ، کافیه در تعریف یک کلاس ، بعد از کلمه کلیدی [/FONT][FONT=&quot] [/FONT][FONT=&quot]class [/FONT][FONT=&quot]و قبل از نام دلخواه کلاس ، عبارت کلیدی [/FONT][FONT=&quot]dynamic [/FONT][FONT=&quot] رو بنویسیم[/FONT][FONT=&quot] :[/FONT]


Pic02.JPG



[FONT=&quot]با [/FONT][FONT=&quot]import [/FONT][FONT=&quot] کردن این کلاس در یک محیط کد نویسی و نمونه سازی از این کلاس ، خواهید دید که می تونیم ، مشخصه ها و متد های جدیدی رو با روش نقطه ای و به نمونه های ساخته شده اختصاص بدیم [/FONT][FONT=&quot] :[/FONT]


Pic03.jpg



[FONT=&quot]و خروجی این شکل هست :[/FONT]

[FONT=&quot]I'M PUBLIC PROPERTIE[/FONT]
[FONT=&quot]undefined[/FONT]
[FONT=&quot]I'M NEW STRING PROPERTIE[/FONT]
[FONT=&quot]79[/FONT]
[FONT=&quot]false[/FONT]
[FONT=&quot]I'M NEW METHODE[/FONT]
[FONT=&quot]I'M PUBLIC PROPERTIE[/FONT]
[FONT=&quot]undefined[/FONT]
[FONT=&quot]I'M NEW STRING PROPERTIE[/FONT]
[FONT=&quot]79[/FONT]
[FONT=&quot]false[/FONT]

[FONT=&quot]چند نکته[/FONT][FONT=&quot]:[/FONT][FONT=&quot] [/FONT][FONT=&quot]همونطوری که شاهد بودید ، ما مشخصه های جدید رو در بیرون از کلاس به نمونه های ساخته شده از کلاس داینامیک اختصاص دادیم ، ولی در تعریف مشخصه جدید و مقدار دهی به اون ، ما نوع مشخصه مثل [/FONT][FONT=&quot]Boolean , String , Number [/FONT][FONT=&quot] را تعیین نکردیم . اگر بعد از تعریف مشخصه یا متد ثانویه بیرون از کلاس داینامیک ، نوع اونو بعد از دو نقطه ( : ) بنویسیم و تعیین کنیم ، با خطای زمان کامپایل مواجه می شیم ، پس نباید نوع مشخصه ها و متد های ثانویه رو به روش معمول داخل کلاسی تعیین کنیم ، در این حالت ، مشخصه های جدید بسته به مقداری که بهشون می دیم و نوع مقداری که بهشون می دیم ، در ساختار های مختلف تعیین می شه یعنی مثلا اگر به مشخصه جدید ، رشته ای رو بین دو دابل کوتیشن (" ") نسبت بدیم ، مشخصه جدید به نوع رشته ای یا [/FONT][FONT=&quot]String [/FONT][FONT=&quot] تبدیل می شه و اگر به اون ، مقدار [/FONT][FONT=&quot]true [/FONT][FONT=&quot]یا [/FONT][FONT=&quot]false [/FONT][FONT=&quot] بدیم ، این مشخصه به نوع بولین تبدیل می شه و اگر به اون ، عددی رو اختصاص بدیم ، به نوع عددی [/FONT][FONT=&quot]Number , int [/FONT][FONT=&quot] تبدیل می شه ، یعنی این مشخصه ی عددی رو هم در متغیر نوع [/FONT][FONT=&quot]Number [/FONT][FONT=&quot] و هم در متغیر نوع [/FONT][FONT=&quot]int [/FONT][FONT=&quot] می تونیم بریزیم ، همچنین مثلا اگر یک مقدار هگزای مبنای 16 مثل کد رنگ[/FONT][FONT=&quot] (0x65ABF2) [/FONT][FONT=&quot]رو به اونها اختصاص بدیم ، می تونیم اونو در متغیر عددی نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Number [/FONT][FONT=&quot]بریزیم و چیزای دیگه[/FONT][FONT=&quot] ...[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در مورد متد ها یا همون توابع جدید ثانویه بیرون از کلاسی ، ما می تونیم توابع رو به دو صورت به نمونه های ساخته شده از کلاسهای داینامیک ، نسبت بدیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]تعریف متد با روش عبارت تابع[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]استفاده از تعریف لیترال توابع[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در ادامه بحث ، در این مورد ، توضیحاتی رو خواهیم داد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]نکته بعدی در مورد مشخصه ها و متد های جدید اضافه شده ، اینه که مشخصه ها و متد های جدید می تونن به همدیگه دسترسی داشته باشند ، یعنی می تونیم مشخصه ای جدید رو در متدی جدید استفاده کنیم و به مقدار اون دست بیابیم ،همچنین طبق روال عادی ، این مقولات جدید ثانویه می تونن به مشخصه ها و متد های اصلی عمومی[/FONT][FONT=&quot] (public) [/FONT][FONT=&quot] کلاس مادرشون (که در ساختار کلاسی تعیین می شه ) دسترسی داشته باشند ، ولی متد ها و مشخصه های جدید اضافه شده ، نمی تونن به متد ها و مشخصه های اصلی خصوصی[/FONT][FONT=&quot] (private) [/FONT][FONT=&quot]کلاس اصلیشون دسترسی داشته باشند. اگر بخواهیم مشخصه خصوصی نمونه ساخته شده از یک کلاس داینامیک رو در یک محیط کدنویسی تریس کنیم ، مقدار [/FONT][FONT=&quot]undefined [/FONT][FONT=&quot] برگردونده می شه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample26-01 [/FONT][FONT=&quot]رو دانلود کنید ، این مثال در مورد ساختن یک کلاس داینامیک و نمونه سازی از اون هست و در مقابل هر خط کد ، توضیحات فارسی اونو نوشتم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]توابع رو در اکشن اسکریپت 3 ، به دو روش می شه تعریف کرد[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]روش عبارت تابع[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]روش تعریف تابع لیترال[/FONT][FONT=&quot][/FONT]
[FONT=&quot]روش استفاده از عبارت تابع[/FONT][FONT=&quot] :[/FONT][FONT=&quot] [/FONT][FONT=&quot]همون روش رایج تعریف تابع هست که با نوشتن کلمه کلیدی [/FONT][FONT=&quot] [/FONT][FONT=&quot]function [/FONT][FONT=&quot]و سپس اسم تابع ، به شکل زیر عمل می شه[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]

Pic04.jpg



[FONT=&quot]روش استفاده از لیترال تابع[/FONT][FONT=&quot] :[/FONT][FONT=&quot] [/FONT][FONT=&quot]این روش بیشتر و پیشتر در اکشن اسکریپت 2 مورد استفاده قرار می گرفته و در اکشن اسکریپت 3 ، زیاد کاربرد نداره . یعنی با عبارت [/FONT][FONT=&quot]var [/FONT][FONT=&quot]، متغیری رو تعریف می کنیم و در اون یک [/FONT][FONT=&quot] [/FONT][FONT=&quot]function [/FONT][FONT=&quot]قرار می دیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال زیر ، تکرار مثال بالاست ، این بار به روش لیترال[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
Pic05.jpg



[FONT=&quot]البته در شرایط معمول و در تعریف تابع ، بعد از نوشتن نام دلخواه تابع لیترال ، دو نقطه قرار می دیم و نوع اونو از نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]function [/FONT][FONT=&quot]قرار می دیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]به شکل زیر توجه کنید ، در این شکل ملاحظه می کنید که کلاسی رو تعریف کردیم و در ساختار اون ، دو متد رو یکی به روش لیترال و دیگری رو به روش عبارت تابع ، تعریف کردیم[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]


Pic06.jpg



[FONT=&quot]اگر این کلاس رو در جایی [/FONT][FONT=&quot]import [/FONT][FONT=&quot] و نمونه سازی کنیم ، مشاهده می کنید که به دو روش می تونیم به متد های نمونه های ساخته شده دسترسی داشته باشیم[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]


Pic07.jpg



[FONT=&quot]خروجی این مثال هست :[/FONT]

[FONT=&quot]Ali[/FONT]
[FONT=&quot]47[/FONT]
[FONT=&quot]Now This String Trace From Literal Methode[/FONT]
[FONT=&quot]Ali[/FONT]
[FONT=&quot]47[/FONT]
[FONT=&quot]Now This String Trace From Literal Methode[/FONT]

[FONT=&quot]به گونه ای که در شکل بالا ملاحظه کردید ، روش اول دسترسی به متد های نمونه ساخته شده از کلاس ، روش نقطه ای است که با نوشتن نام نمونه و قرار دادن نقطه و بعد از اون ، نام متد مورد نظر ، به متد نوشته شده دسترسی پیدا می کردیم . روش دوم روش قرار گیری نام رشته ای متد ، در بین دابل کوتیشن[/FONT][FONT=&quot] (" ") [/FONT][FONT=&quot]در داخل براکت[/FONT][FONT=&quot] [/FONT][FONT=&quot] ([]) [/FONT][FONT=&quot] است . یعنی ابتدا نام نمونه رو می نویسیم و بعد براکت رو باز و در داخل دابل کوتیشنی ، نام متد مد نظر رو نوشته و براکت رو می بندیم و بعد ازبستن براکت ، پرانتز باز و بسته رو قرار می دیم و اگه متد مد نظر ، پارامتر ورودی داشته باشه ، ورودی ها رو در بین پرانتز ها قرار می دیم. این مسئله رو در شکل بالا به وضوح می تونید ببینید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample26-02 [/FONT][FONT=&quot]رو دانلود کنید .این مثال در مورد تعریف و استفاده و فراخوانی توابع لیترال و نوع عبارت تابع هست[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مقایسه روش تعریف عبارت تابع و روش لیترال[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]به تجربه ثابت شده که در ساختار های مختلف ، استفاده از حالت عبارت تابع ، سازگاری بیشتری رو نسبت به حالت لیترال تابع داره . به همین خاطر بهتره که از روش عبارت تابع برای تعریف متد ها و توابع استفاده کرد، مگر اینکه مجبور باشیم از روش لیترال استفاده کنیم . حالت عبارت تابع ، نسبت به حالت لیترال ، خوانایی بیشتری داره چرا که لیترال ، گمراه کننده تره .علتش هم اینه که در حالت لیترال ، ما هم با دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]var [/FONT][FONT=&quot]و هم دستور [/FONT][FONT=&quot]function [/FONT][FONT=&quot] متوالی ، سر و کار داریم و در حقیقت این دو خلاف همند ([/FONT][FONT=&quot] [/FONT][FONT=&quot]var [/FONT][FONT=&quot]مخفف [/FONT][FONT=&quot]variable [/FONT][FONT=&quot]هست و به متغیر ها اختصاص داره و [/FONT][FONT=&quot] [/FONT][FONT=&quot]function [/FONT][FONT=&quot]به متد ها یا همون توابع[/FONT][FONT=&quot])[/FONT]
[FONT=&quot]در بعضی ساختارها ، وقتی ما کلاسی استاتیک رو تعریف می کنیم و متدی رو به روش لیترال و متد دیگه ای رو به روش عبارت تابع ، در ساختار اون تعریف می کنیم ، بعد از نمونه سازی از این کلاس ، در دسترسی به هر دو متد یاد شده ، می تونیم با هر دو روش (نقطه ای و نام رشته ای متد در براکت) به متد تعریف شده با روش عبارت تابع ، دسترسی داشته باشیم ، ولی نمی تونیم با روش نقطه ای ، به متد لیترال دسترسی پیدا کنیم .(البته برخی ساختارها نه همیشه[/FONT][FONT=&quot] [/FONT][FONT=&quot](. [/FONT][FONT=&quot]در این ساختارها ، فقط باید به روش نام رشته در براکت ، به متد های لیترال دسترسی داشته باشیم . استفاده از روش لیترال برای وقتیه که ما می خواهیم تمرکز بیشتری رو بر رفتار زمان اجرا داشته باشیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]نکته [/FONT][FONT=&quot]: [/FONT][FONT=&quot] در تعریف کلاسهای داینامیک و پویا و در ساختارهای فاقد دسترسی به متدهای لیترال از روش نقطه ای، ما به راحتی می تونیم از هر دو روش نقطه ای و براکتی ، به متدهای لیترال کلاس داینامیک دسترسی داشته باشیم.همچنین در انتصاب متدهای جدید به نمونه های ساخته شده از یک کلاس داینامیک ، بهتره متدهای جدید رو به روش لیترال تعریف کنیم ، چون این نوع تعریف تابع ، مربوط به تمرکز بر یک نمونه و یک شی هست[/FONT][FONT=&quot] . [/FONT][FONT=&quot]نقطه ضعف اون اینه که برخی عملکردهای حالت دقیق رو به همه نمونه های اون کلاس قربانی کرده ایم . بیشترین مورد استفاده از حالت لیترال تابع ، در جایی هست که قصد داریم از اون ، یک بار استفاده کنیم و بعد اونو ، کنار بگذاریم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]دو تفاوت عمده توابع لیترال و عبارت های تابع[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot]توابع لیترال ، مستقلا به عنوان شی همراه با مشخصه ای که به اون تخصیص داده شدن ، به کار می رن ، یعنی اگه تابع لیترال رو به شی دیگری مثل آرایه یا خصوصیت کلاس اختصاص بدیم ، تنها تفاوت رو به لیترال تابع اون شی دادیم ، اگر اون نمونه یا شی رو حذف کنیم و یا به روشی ، از دسترس دور کنیم ، دیگه نمی تونیم به لیترال اون دست پیدا کنیم.در واقع تابع لیترال بستگی و وابستگی صد در صد به مشخصه ای داره که به اون اختصاص داره و با حذف اون مشخصه ، این تابع لیترال هم حذف خواهد شد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
PHP:
dynamic class myNew {...}
var obj:myNew=new myNew();
obj.literal=function()
{
            trace("Function Literal");
}
obj.literal();   //Output: Function Literal
delete obj.literal;
obj.literal();   //error
[FONT=&quot]
[/FONT]
[FONT=&quot]ولی در تعریف تابع به روش عبارت تابع ، این تابع به عنوان شی خاص وجود خواهد داشت و حتی بعد از حذف شدن این تابع ، با اینکه مشخصه ای که به این تابع ضمیمه شده ، دیگه در دسترس نخواهد بود ، ولی خود این تابع ، بصورت کلی به حیات خود ادامه می ده[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]

PHP:
dynamic class myNew{...}
var obj02:myNew=new myNew();
function stateFunction():void
{
             trace("State Function Trace");
}
obj.newFunction=stateFunction;
obj.newFunction();   //Output: State Function Trace
delete stateFunction;   //no effect
stateFunction();   //Output: State Function Trace
obj.newFunction();   //error

[FONT=&quot][FONT=&quot][/FONT][/FONT][FONT=&quot]2- تفاوت دوم در اینه که متد هایی که با روش عبارت تابع ، تعریف می شن در سراسر محدوده ای که تعریف شده اند قابل دسترسی و فراخوانی هستند ، چه قبل از تعریفشون و چه بعد از تعریفشون ، ولی لیترال های تابع از جایی که تعریف شده اند به بعد (به پایین ) قابل دسترسی هستند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در مورد عبارت تابع[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]

PHP:
stateTest();       //Output:State Test Trace
function StateTest():void
 {
         trace("State test Trace");
 }
 stateTest();        //Output:State Test Trace
--------------------------------------------------------------------------------------------------------------------------------
در مورد تابع لیترال :
PHP:
 literalTest();       //runtime error
 var literalTest:function = function()
 {
      trace("Literal Test Trace");
 }
 literalTest();     //Output:Literal Test Trace

[FONT=&quot]اشیای داینامیک نوع [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در اکشن اسکریپت 2 ، نوع داده [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] همون نوع داده از هر نوع و یا بهتر بگم پیش فرض بوده و ما در پارامتر ورودی یک تابع ، وقتی پارامتری رو از نوع [/FONT][FONT=&quot] Object [/FONT][FONT=&quot] تعریف می کردیم ، منظور ما این بود که هر نوع داده ای که از طریق پارامتر ورودی وارد این تابع شد ، به داخل باید پاس داده شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در اکشن اسکریپت 3 ، برای تعیین هر نوع داده پیش فرض ، ما از علامت ستاره[/FONT][FONT=&quot] (*) [/FONT][FONT=&quot]استفاده می کنیم و با تعیین پارامتر ورودی یا داده یا متغیری از نوع ستاره ، تعیین کرده ایم که این متغیر یا پارامتر می تونه از هر نوعی ، اعم از [/FONT][FONT=&quot] [/FONT][FONT=&quot]String [/FONT][FONT=&quot]یا [/FONT][FONT=&quot] [/FONT][FONT=&quot]Number [/FONT][FONT=&quot]یا [/FONT][FONT=&quot]Boolean [/FONT][FONT=&quot] یا ... باشه . متغیر هایی که با این روش تعریف می شن ، از نوع بی نوع هستن و می تونن هر نوع داده ای رو قبول کنند .این دو دستور زیر در اکشن اسکریپت [/FONT][FONT=&quot]3 [/FONT][FONT=&quot] معادل همند[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
PHP:
   var  someObject:*; 
  var  someObject;
[FONT=&quot]
[/FONT]​
---------------------------------------------------------------------------------------------------------------------------------
[FONT=&quot]همچنین دو دستور بالا معادل دو دستور پایین در اکشن اسکریپت 2 هست[/FONT][FONT=&quot] :[/FONT][FONT=&quot] [/FONT]
PHP:
   var  someObject:Object; 
  var  someObject;
[FONT=&quot]
[/FONT]​
----------------------------------------------------------------------------------------------------------------------------------
[FONT=&quot]نوع داده [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]در اکشن اسکریپت 3 ، چهار تفاوت عمده با اکشن اسکریپت 2 داره[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot] [/FONT][FONT=&quot]نوع داده [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] در اکشن اسکریپت 3 دیگه نوع داده پیش فرض و بی نوع نیست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot] [/FONT][FONT=&quot]نوع داده [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] در اکشن اسکریپت 3 دیگه مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]undefined [/FONT][FONT=&quot]نمی گیره.[/FONT][FONT=&quot]
[/FONT]

[FONT=&quot] . )[/FONT][FONT=&quot]البته فقط در مورد مشخصه هاش می گیره .)[/FONT][FONT=&quot][/FONT]
[FONT=&quot]3-[FONT=&quot] [/FONT][/FONT][FONT=&quot]نوع داده [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]در اکشن اسکریپت 3 مقدار پیش فرض [/FONT][FONT=&quot]null [/FONT][FONT=&quot] می گیره[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]4-[FONT=&quot] [/FONT][/FONT][FONT=&quot]نوع داده [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]در اکشن اسکریپت 3 ، نمونه ای از یک کلاس به نام [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] است و در حقیقت نقش انباره ای ( لیست ، آرایه) از مشخصات در انواع مختلف رو بازی می کنه و در اصطلاح به این نوع اشیا می گن آرایه تجمعی[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]اگر بخواهیم نوع داده [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] رو تعریف کنیم ، داده نوع [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] در اکشن اسکریپت 3 به داده ای گفته می شه که ، به شکل زیر تولید می شه :[/FONT]


Pic08.jpg



[FONT=&quot]این اشیا در اکشن اسکریپت 3 ، مثل نمونه های کلاسهای داینامیک عمل می کنند ، به این مفهوم که شما با تولد یک [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]در اکشن اسکریپت 3 ، انگار یک نمونه از یک کلاس داینامیک خاص به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]بوجود آوردید و می تونید به سبک تعریف مشخصه ها و متد های جدید و ثانویه برای نمونه های کلاسهای داینامیک ، به اونها هم مشخصه و متد جدید تعریف کنید. در حقیقت می شه از اونها به عنوان آرایه ای پویا یاد کرد که انواع مختلفی از داده رو در خود ذخیره می کنند ولی یکی از تفاوتهای عمده این اشیا با آرایه اینه که ترتیب عددی بین مشخصه ها و متد های این اشیا وجود نداره و فقط می تونیم از طریق نام رشته ای مشخصه ها ، به اونها دسترسی پیدا کنیم ، لازم به ذکره که بگم ، همیشه نام مشخصه های اضافه شده به اشیای [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]، از نوع [/FONT][FONT=&quot]String [/FONT][FONT=&quot] هست[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]


Pic09.jpg



[FONT=&quot]در شکل بالا ، اگه مشخصه 1 ، زودتر از بقیه ، به لیست مشخصات شی مورد نظر اضافه بشه ، هیچ اولویت خاصی رو نسبت به بقیه نداره و فقط می شه با نام نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]String [/FONT][FONT=&quot] مشخصه اون ، به اون دست پیدا کرد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]


Pic010.jpg



[FONT=&quot]و خروجی این مثال هست :[/FONT]
[FONT=&quot]This is New Function That Traces : Entered String Ha Ha Ha ![/FONT]
[FONT=&quot]I'm String[/FONT]
[FONT=&quot]67[/FONT]
[FONT=&quot]true[/FONT]
[FONT=&quot]null[/FONT]
[FONT=&quot]This string Is From New Function[/FONT]

[FONT=&quot]در مثالی که ذکر شد ، هم به روش لیترال و هم به روش عبارت تابع ، متد های جدیدی رو به نمونه ساخته شده از کلاس [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] اختصاص دادیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]تولید مشخصه های شی و مقدار دهی به آنها [/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه های شی رو به دو روش عمده می تونیم بسازیم و به اونها مقدار دهی کنیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot][/FONT][FONT=&quot]1- روش نقطه ای 2- روش تولید مشخصه ها و مقدار دهی در گیومه[/FONT][FONT=&quot][/FONT]


Pic011.jpg



[FONT=&quot]در روش نقطه ای ، مشخصات جدید رو با نقطه به شی اختصاص داده و به اونها مقدار دهی می کنیم و در روش گیومه ای ، بعد از تعریف شی ، گیومه ای ({}) رو باز می کنیم و در درون گیومه ، نام تک تک مشخصه ها و بعد ، دو نقطه ( : ) و بعد مقدار مشخصه رو می نویسیم . مشخصه های مختلف با علامت[/FONT][FONT=&quot] (,) [/FONT][FONT=&quot]از هم جدا می شند[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]حلقه [/FONT][FONT=&quot]for … in [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]این دستور برای تکرار عملی خاص به تعداد مشخصه های یک شی [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] به کار می ره ، البته موارد استفاده از اون در آرایه ها هم هست ، ولی ما در مورد [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]بحث می کنیم .در حقیقت این دستور برای تکرار تابعی خاص روی نام و مقدار تک تک مشخصه های یک شی [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] هست و با این دستور ، هم می تونیم به خود نام رشته ای هر مشخصه دست پیدا کنیم و هم می تونیم به مقدار ذخیره شده در هر مشخصه ، دسترسی داشته باشیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot]این دستور در مورد مشخصه ها و متد های ثانویه یک شی از نوع کلاس داینامیک عمل می کنه .[/FONT]


Pic012.jpg



[FONT=&quot]جواب کد بالا ، تریس نام رشته ای هر مشخصه[/FONT][FONT=&quot] ( i ) [/FONT][FONT=&quot]و بعد از اون ، قرارگیری دو نقطه ( : ) و سپس ، چاپ مقادیر ذخیره شده در هر مشخصه[/FONT][FONT=&quot] (OBJ) [/FONT][FONT=&quot]هست . پس مشاهده می کنیم که [/FONT][FONT=&quot]i [/FONT][FONT=&quot] شمارنده ای از نوع [/FONT][FONT=&quot]String [/FONT][FONT=&quot]هست و در اون ، هر بار نام تک تک مشخصه های شی قرار می گیرند و و طبعا با نوشتن [/FONT][FONT=&quot](OBJ) [/FONT][FONT=&quot] به سبک آرایه ها ، به مقدار مشخصه [/FONT][FONT=&quot]i [/FONT][FONT=&quot]دسترسی پیدا می کنیم . در ترتیب اجرای عملیات تابع به همه مشخصات شی با دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]for…in [/FONT][FONT=&quot]باید بگم ، چون ترتیب و اولویت بندی خاصی بین مشخصه های شی داینامیک نیست ، عملیات بصورت رندوم (تصادفی ) روی مشخصه ها انجام می شود[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample26-03 [/FONT][FONT=&quot]رو دانلود کنید ، این مثال به تولید و اضافه کردن مشخصه و متد در لیست مشخصات و متد های شی داینامیک می پردازه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]متغیر ها و متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Global [/FONT][FONT=&quot]با استفاده از [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]سراسری نوع [/FONT][FONT=&quot]static [/FONT][FONT=&quot] [/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]اگه یادتون باشه ، ما در درس بیست و چهارم ، نحوه ساختن متغیر ها و متد های سراسری نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Global [/FONT][FONT=&quot]رو گفتیم . همونطوری که می دونید برای ساختن اونها باید در یک کلاس ، مشخصه یا متد نوع [/FONT][FONT=&quot]static [/FONT][FONT=&quot] تعریف کنیم و با استفاده از اسم اصلی کلاس و بعد با استفاده از این مشخصات و متد ها، متغیر ها و متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]global [/FONT][FONT=&quot]( که در هر تایم لاین و در هر فریم از یک سورس قابل دسترسی هستند) بسازیم [/FONT][FONT=&quot].[/FONT][FONT=&quot]اگه یادتون باشه گفتیم که نمونه های ساخته شده از کلاس نمی تونن مشخصه ها و متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]static [/FONT][FONT=&quot]رو به ارث ببرند و فقط با استفاده از نام اصلی کلاس می تونیم به این اقلام ، دسترسی داشته باشیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]حالا راهی رو با استفاده از شی [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]بهتون می گیم تا لیستی از مشخصات و متد های سراسری رو از انواع و اقسام مختلف ، درون شی سراسری بوجود بیارین . دقت کنید که تفاوت این روش با روش تعریف مشخصات و متد های [/FONT][FONT=&quot]static [/FONT][FONT=&quot] ، در داینامیک بودن تعداد و نوع متغیر ها و توابع سراسری کاربر هست. یعنی در این روش ، کاربر به هر تعداد و هر نوعی از مشخصات و متد های سراسری ، در داخل سورس خودش تولید و استفاده می کنه ، بدون اینکه نیازی به دستکاری فایل کلاسی داشته باشه . به دستورات زیر توجه کنید[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
Pic013.jpg



[FONT=&quot]پس از بوجود آوردن مشخصه شی سراسری به منظور نگهداری مجموعه مشخصات و متد های سراسری ، در هر فضای کاری که می خواهیم از مشخصه مورد نظر استفاده کنیم ، ابتدا کلاس مد نظر رو [/FONT][FONT=&quot]import [/FONT][FONT=&quot] و پس از اون ، مشخصه های جدیدی رو در لیست مشخصات ثانویه شی سراسری بوجود آورده و مقدار دهی می کنیم و این مشخصات ، بصورت عمومی و سراسری از داخل فریم ها هر تایم لاین (چه صحنه اصلی و چه تایم لاین مووی کلیپ های دیگر )، قابل دسترسی است[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
Pic014.jpg





[FONT=&quot]دقت کنید چون مشخصه ای در فریم بعد ، به لیست مشخصات شی سراسری اضافه و تعریف شده ، در این فریم با تریس اون ، مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]undefined [/FONT][FONT=&quot]تریس می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot] [/FONT][FONT=&quot]Sample26-04 [/FONT][FONT=&quot]رو دانلود کنید و با این مسئله بصورت پیشرفته تر روبرو بشین[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]استفاده از اشیای [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] به عنوان آرایه ای از پارامتر های ورودی یک تابع[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]ما می تونیم عده ای از مشخصات در انواع مختلف رو در یک نمونه از شی نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]قرار بدیم و بصورت آرایه ای از پارامتر های ورودی ، به یک تابع پاس بدیم . بعد ، در تابع یاد شده ، با دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]for…in [/FONT][FONT=&quot]به تک تک مشخصه های شی ورودی ، دست پیدا کنیم و ... در این شرایط اگر نام تک تک مشخصات داخل شی [/FONT][FONT=&quot]Object [/FONT][FONT=&quot]، همنام مشخصات تعریف شده و اصلی در بدنه تابع یا کلاس مد نظر باشه ، به راحتی می تونیم مقدار مشخصات شی ورودی رو در مقدار مشخصات کلاس یا تابع مد نظر ، بریزیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]به شکل زیر توجه کنید . این شکل مربوط به تعریف کلاس اصلی کار راه انداز یک سورس فلش هست[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]


Main01.gif



[FONT=&quot]مشاهده کردید دو شی رو که نقش انباره مشخصات و پارامتر های مورد نیاز برای ترسیم دایره رو بازی می کنند ، به وجود آورده و به دو نمونه ساخته شده از کلاس ترسیم دایره پاس دادیم.کلاس ترسیم دایره رو خودمون طراحی کردیم و کانسترکتور این کلاس ، با دریافت ورودی شی از نوع [/FONT][FONT=&quot] ) Object[/FONT][FONT=&quot]انبار مشخصات مورد نیاز برای ترسیم دایره) اقدام به رسم دایره می کنه . کلاس ترسیم دایره رو در فایل کلاسی دیگه ای ، واقع در بسته [/FONT][FONT=&quot] [/FONT][FONT=&quot]shapes [/FONT][FONT=&quot]قرار دادیم .این کلاس ، زیر کلاس اشکال[/FONT][FONT=&quot] (shape)[/FONT][FONT=&quot]هست[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
[/FONT]

[FONT=&quot]
Main02.gif
[/FONT]

[FONT=&quot] [/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample26-05 [/FONT][FONT=&quot]رو دانلود کنید و به صورت مفصل تر ، این مثال رو بررسی کنید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پس ملاحظه کردید که شی نوع [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] می تونه نقش آرایه ای از پارامتر های ورودی یک تابع یا کلاس رو بازی کنه ، به شرط اینکه نام تک تک مشخصات شی [/FONT][FONT=&quot]Object [/FONT][FONT=&quot] ورودی ، همنام مشخصه های اصلی تعریف شده در بدنه تابع یا کلاس مد نظر باشه .سپس با دستور [/FONT][FONT=&quot]for…in [/FONT][FONT=&quot] ، جایگذاری بین مشخصه ها انجام می شه[/FONT][FONT=&quot] .

[/FONT][FONT=&quot][/FONT]

[FONT=&quot]نکته الحاقی بسیار مهم[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT]
[FONT=&quot]در مثال آخر ، ما درون کلاس و با استفاده از دستور[/FONT][FONT=&quot] for...in [/FONT][FONT=&quot]، به تک تک مشخصه های کلاس از طریق مشخصه های شی نوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]مقدار دهی کردیم . چرا از دستور[/FONT][FONT=&quot] for ...in [/FONT][FONT=&quot]استفاده کردیم ؟[/FONT]

[FONT=&quot]ما این کار رو کردیم تا مقادیر مشخصه های[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی رو در مشخصه های همنام و همنوع خودشون واقع در کلاس بریزیم.این کار یک جایگزینی کامل و بی برو برگرد هست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همونطوری که می بینید و می دونید ، ما شی رو با مشخصات خاص ، به تابع کانسترکتور کلاسی که پارامتر ورودی اون یک شی نوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]هست پاس دادیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]گفتیم که شی نوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]الویت و نظم خاصی رو در ترتیب مشخصه هاش نداره .ما فقط می تونیم از طریق نام مشخصه ، به مقدار اون مشخصه در شی نوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]دسترسی داشته باشیم [/FONT][FONT=&quot].[/FONT][FONT=&quot] در این مثال توجه کنید که گروهی مشخصه رو در ساختار کلاس و مخصوص کلاس ، تعریف کردیم و نام و نوع این مشخصه های کلاس ، یک به یک همنام و همنوع مشخصه های شی[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی بود[/FONT][FONT=&quot] . [/FONT][FONT=&quot]پس برای اینکه یک به یک ، مقادیر مشخصه های شی نوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی رو ( که نقش انباره رو بازی می کنه ) در مشخصه های همنام و همنوعش در کلاس مد نظر ، بریزیم ، از[/FONT][FONT=&quot] for ...in [/FONT][FONT=&quot]برای دسترسی به تک تک مشخصه های شی[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی استفاده کردیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]در دستور[/FONT][FONT=&quot] for...in [/FONT][FONT=&quot]، ما هر بار ، مشخصه ای از مشخصه های شی رو که اسمش از نوع رشته[/FONT][FONT=&quot] ( String ) [/FONT][FONT=&quot]بود ، در متغیر رشته ای با نام[/FONT][FONT=&quot] i [/FONT][FONT=&quot]قرار دادیم و در هر بار اجرای این حلقه ، نام یکی از مشخصه های[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی بصورت رندوم و بدون ترتیب خاص ، در[/FONT][FONT=&quot] i [/FONT][FONT=&quot]قرار می گیره و سپس با استفاده از نام شی بصورت آرایه ای مثل[/FONT][FONT=&quot] :[/FONT][FONT=&quot] [/FONT]
PHP:
 OBJ[i]
[FONT=&quot]به مقدار ذخیره شده در مشخصه ای با نام رشته ذخیره شده در[/FONT][FONT=&quot] i [/FONT][FONT=&quot]دسترسی پیدا می کنیم . بعد می تونیم با استفاده از این روش به تک تک مشخصه های واقع در ساختار کلاس ، از مشخصه های همنام و همنوع[/FONT][FONT=&quot] Object [/FONT][FONT=&quot]ورودی ، مقدار دهی کنیم .برای دسترسی به نام مشخصه کافیه از[/FONT][FONT=&quot] i [/FONT][FONT=&quot]استفاده کرده و برای دسترسی به مقدار مشخصه[/FONT][FONT=&quot] i [/FONT][FONT=&quot]کافیه بنویسیم [/FONT][FONT=&quot] [/FONT][FONT=&quot](OBJ)[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پایان بخش هفتم[/FONT]
</div>
 

پیوست ها

  • Sample26-04.rar
    6.5 کیلوبایت · بازدیدها: 295
  • Sample26-03.rar
    6.3 کیلوبایت · بازدیدها: 282
  • Sample26-02.rar
    5.8 کیلوبایت · بازدیدها: 277
  • Sample26-01.rar
    6.5 کیلوبایت · بازدیدها: 289
  • Sample26-05.rar
    6.2 کیلوبایت · بازدیدها: 285
آخرین ویرایش:

++Hadi++

Active Member
دستور اکشن 3 برای کلیک روی دکمه و رفتن به آدرس url

سلام

برای اینکه در اکشن اسکریپت 3 ، با کلیک بر روی دکمه ای ، به آدرس URL خاصی برید باید ابتدای امر ، دکمه تونو انتخاب کنید و در پنل properties و در کادر instance name ، اسم دلخواهی رو به دکمه تون بدین مثل myButton.
بعد فریم تایم لاین دکمه تون رو انتخاب می کنید و دکمه f9 رو می زنید تا وارد کادر اکشن اسکریپت بشین .(محیط کد نویسی ).
بعد در کادر اکشن ، دستورات زیر رو می نویسید :
PHP:
myButton.addEventListener(MouseEvent.CLICK,newFunction);
function newFunction(evt:MouseEvent):void
{
     navigateToURL(new URLRequest("http://www.google.com"),'_self');
}
به جای سایت گوگل ، آدرس کامل URL رو می نویسید .
اگه بخواهین صفحه جدید URL در خود صفحه مرورگرتون (IE , FireFox , Opera , ...) آپدیت بشه جوری که پنجره جدیدی باز نشه و با دکمه back , forward به صفحه قبلی / بعدی برین ، در جایی که نوشتم self_ ، تغییری ایجاد نمی کنید .
اگه بخواهین برای رفتن به صفحه URL ، پنجره دیگه و جدیدی باز شه ، به جای self_ باید بنویسین blank_
اگه هم می خواهین تا صفحه مرورگرتون آپدیت نشه و فقط صفحه جدید در یه iframe از html یا بهتر بگم در یه خانه از table لود بشه ، بجای self_ باید اسم iframe تونو بنویسین .مثلا اگه در html ، اسم تگ آیفریمتون باشه Main_ ، باید بجای self_ بنویسین Main_.
بای...
 
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکريپت 3- درس بيست و هفتم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]​
[FONT=&quot]بحث تکمیلی کلاس های داینانیک و کلاس اشیای نوع [/FONT]Object [FONT=&quot] و اشیای نوع [/FONT]prototype
[FONT=&quot]درود بر شما[/FONT][FONT=&quot][/FONT]
[FONT=&quot]امروز بحث اشیای نوع [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو تموم می کنیم و در جلسه بعد ، به آموزش دو مثال بازی گرافیکی با مبحث کلاس می پردازیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شروع بحث [/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همونطوری که قبلا گفتیم ، در اکشن اسکریپت 3 ، اشیای نوع [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot] با همنوعانش در اکشن اسکریپت 2 تفاوت زیادی رو داره و در اکشن اسکریپت 3 ، شی نوع [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot] به شیی می گن که نمونه ای از یک کلاس داینامیک به نام [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست و این کلاس داینامیک اصلی ، دو مشخصه و شش متد اصلی و عمومی رو داره که برای انجام کارهایی خاص به کار می رند و در ادامه بحث امروز به تفصیل اونها می پردازیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]اشیای نوع نمونه اولیه یا [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در اکشن اسکریپت 1 و2 ، راهی برای ارث بری اشیا از هم وجود داشت که به ارث بری نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] معروف بوده و این نوع ارث بری در اکشن اسکریپت 3 هم وجود داره . البته در اکشن اسکریپت 3 ، گونه ای دیگر از ارث بری اصلی تر و جدیدتری به نام ارث بری کلاسی با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] [/FONT][FONT=&quot] وجود داره (که در درس های پیشین به طور مفصل به اون پرداختیم)، ارث بری کلاسی رو می شه اولین و اصلی ترین روش ارث بری در اکشن اسکریپت 3 دونست ، ولی باز هم می تونیم از روش ارث بری [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]استفاده کنیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot] Prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا اشیای نوع نمونه اولیه ، به عده ای از مشخصه ها و متد های یک کلاس گفته می شه که با دستور [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] و در ساختار کلاس تعریف می شند[/FONT][FONT=&quot]. [/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic01.GIF
[/FONT]

[FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] مثل چمدانی از مشخصه ها و متد ها می مونه که همشون عمومی یا [/FONT][FONT=&quot]public[/FONT][FONT=&quot] هستن و در ساختار یک کلاس بوجود می یان و تمامی نمونه های ساخته شده از کلاس ، اونها رو به ارث می برند[/FONT][FONT=&quot] [/FONT][FONT=&quot]. [/FONT][FONT=&quot]این مشخصه ها و متد ها در حقیقت مقدار دهی می شن و هر نمونه ساخته شده از کلاس ، اونها رو با مقادیر اولیه شون به ارث می بره . سپس هر جا که در بیرون از ساختار کلاسی خواستیم ، می تونیم با استفاده از نام اصلی کلاس و بعد با نوشتن کلمه [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] و در انتها با نوشتن نام مشخصه یا متد نمونه اولیه ، مقدار اونها رو به سبک مشخصه ها و متد های استاتیک عوض کنیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic02.GIF
[/FONT]

[FONT=&quot]مشاهده کردید که با نوشتن نام اصلی کلاس و بعد از نقطه ، نوشتن کلمه کلیدی [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]و بعد از نقطه ، نوشتن نام مشخصه یا متد نوع نمونه اولیه ، می تونیم به اصل مشخصه یا متد در کلاس اصلی ، دسترسی پیدا کنیم و مقدار اصل اونو در کل نمونه ها عوض کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot][/FONT]
[FONT=&quot]اگه برای یک کلاس مثل کلاس [/FONT][FONT=&quot]F [/FONT][FONT=&quot]، مشخصه یا متد نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]بوجود بیاریم و از کلاس [/FONT][FONT=&quot]F[/FONT][FONT=&quot] [/FONT][FONT=&quot] نمونه سازی کنیم و به اون مشخصه یا متد نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] نمونه ساخته شده ، بصورت مستقیم دسترسی خواندنی / نوشتنی پیدا کنیم ، باید اون کلاس[/FONT][FONT=&quot] ([/FONT][FONT=&quot]F[/FONT][FONT=&quot]) [/FONT][FONT=&quot]رو حتما از نوع [/FONT][FONT=&quot]dynamic[/FONT][FONT=&quot] [/FONT][FONT=&quot] طراحی کنیم وگرنه به خطا بر می خوریم ، ولی اگه قصد داشتیم کلاس داینامیکی مثل [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو بوجود بیاریم که زیر فرزند کلاس استاتیکی مثل [/FONT][FONT=&quot] [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]باشه و نمونه ای از کلاس فرزند[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot]([/FONT][FONT=&quot]B[/FONT][FONT=&quot]) [/FONT][FONT=&quot]رو بوجود بیاریم و بخواهیم به مشخصه یا متد [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] کلاس مادر[/FONT][FONT=&quot] [/FONT][FONT=&quot]استاتیک[/FONT][FONT=&quot] ([/FONT][FONT=&quot]A[/FONT][FONT=&quot]) [/FONT][FONT=&quot]دسترسی داشته باشیم ، هیچ اشکالی پیش نمی یاد[/FONT][FONT=&quot].[/FONT][FONT=&quot] [/FONT][FONT=&quot]کوتاه سخن بالا اینکه برای دسترسی مستقیم به مشخصه یا متد نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] نمونه ساخته شده از یک کلاس ، باید اون کلاس داینامیک باشه ، مگر اینکه مشخصه یا متد نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک کلاس استاتیک ، با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot] [/FONT][FONT=&quot]به ارث زیر کلاس اون (از نوع داینامیک) در بیاد تا بشه بصورت غیر مستقیم از [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک کلاس استاتیک در نمونه ساخته شده از فرزند استفاده و دسترسی پیدا کرد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic03.GIF

[/FONT]
[FONT=&quot]پس از تغییر مقدار مشخصه ها و متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] از بیرون از ساختار کلاسی و در ساختار اصلی کلاسی ، خواهیم دید که مشخصه ها و متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] در نمونه های ساخته شده قبلی ( نمونه هایی که قبل از تغییرات ساخته شدند)، تغییر می کنند البته به شرط اینکه پس از بوجود آوردن هر نمونه ، در مقادیر مشخصه ها و متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] مخصوص اون نمونه ، تغییری بوجود نیاورده باشیم. تغییرات جدید در اصل [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] های کلاس اصلی ، فقط در نمونه هایی که مقادیر [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] هاشون هنوز پیش فرض مونده ، به چشم می خوره. برای اینکه بتونیم مشخصه ها و متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] مخصوص هر نمونه ساخته شده رو عوض کنیم ، کافیه به سبک دسترسی به مشخصه ها و متد های [/FONT][FONT=&quot]public[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک نمونه از کلاس ، به اونها دسترسی پیدا کنیم و اونها رو عوض کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot][/FONT]

Pic04.GIF

[FONT=&quot]مشخصه های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] به ارث رسیده از اصل یک کلاس ، در نمونه های اون ، وقتی بعد از تولد نمونه دستکاری بشند ، از منطق [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]اصلی کلاس جدا شده و با تغییر در اصل [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] کلاس اصلی ، تغییری رو در اونها نخواهیم دید. مثل فرزندی که اگه بر خلاف نظر پدرش عمل کنه ، از خونه طرد می شه و از ارث محروم می شه و دیگه اتفاقاتی که برای اون فرزند بیفته ، واسه پدر مهم نخواهد بود و دیگه هر کدوم راه خودشونو طی می کنند و پدر فقط به کسانی توجه می کنه که طبق خواسته اون رفتار کنند .[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پس[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شباهت کانسترکتور یک کلاس با اشیای [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] : کانسترکتور می تونه مقادیر پیش فرض به گروهی از مشخصات و متد های یک کلاس بده ، در مورد [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] هم مشخصه ها و متد های نوع نمونه اولیه می تونن مقادیر پیش فرض بگیرند.اختلافشون در اینه که بعد از تغییرات در [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک نمونه ، دیگه حساب اون از [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]کلی اصل کلاس ، جدا می شه و با تغییر در [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] اصلی کلاس ، دیگه تغییری در [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] اون نمونه بوجود نمی یاد[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]شباهت مشخصه ها و متد های نوع [/FONT][FONT=&quot]static[/FONT][FONT=&quot] [/FONT][FONT=&quot] با نوع [/FONT][FONT=&quot] : prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot]به هر دو و از بیرون یک کلاس و با نام اصلی کلاس می تونیم دسترسی داشته باشیم[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]تفاوت های مشخصه ها و متد های نوع [/FONT][FONT=&quot]static[/FONT][FONT=&quot] [/FONT][FONT=&quot] با نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot] : مشخصه ها و متد های نوع [/FONT][FONT=&quot]static[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو نمونه های ساخته شده از کلاس به ارث نمی برن و این مقوله فقط به اصل کلاس اختصاص داره ، ولی مشخصه ها و متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو تمام نمونه های ساخته شده به ارث می برند و بعد از ارث بری عمومی ، می تونیم به مشخصه و متد [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] هر نمونه دسترسی پیدا کنیم و در اون نمونه و بصورت خصوصی برای اون نمونه تغییر ایجاد کنیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال [/FONT][FONT=&quot]Sample27-01 , Sample27-02[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنین و به صورت مفصل ، بحث رو دنبال کنید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه ها و متد های کلاس داینامیک اصلی [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]مشخصه ای در نمونه های ساخته شده از کلاسهای داینامیک که مرجعی به کلاس اصلی خودشون بوجود می یاره و با تریس مشخصه [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک نمونه ساخته شده از یک کلاس داینامیک ، نام کلاس مادر این نمونه به نمایش در می یاد[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این مشخصه برای این است که بتونیم جایگزینی برای نام اصلی کلاس داینامیک یک نمونه ساخته شده داشته باشیم. همچنین این مشخصه برای این بکار می ره که اصل و ریشه یک شی رو برمی گردونه و با این کار می تونیم به طریقه زیر ، شیی از کلاس خاصی رو به نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]تبدیل کنیم و با استفاده از مشخصه [/FONT][FONT=&quot]constructor[/FONT][FONT=&quot] [/FONT][FONT=&quot] اون شی [/FONT][FONT=&quot]Object[/FONT][FONT=&quot]، اصل و ریشه اونو به شیی از یک کلاس خام می دیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
Pic05.GIF

[FONT=&quot]در تبدیل اشیا به اشیای دیگه می تونیم اونها رو به [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]تبدیل کنیم و بعد ، با این مشخصه ، اصل سازنده و ساخت و ساز اونها رو به شی دیگری اعمال کنیم ، البته در تمرینها ، اونجوری که تست کردیم مشخصه ها و متد های شی اول به ارث شی دوم نرسید ولی اگر اطلاعاتی رو کسب کردم حتما در اختیار شما قرار می دم[/FONT][FONT=&quot]. [/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]این مشخصه برای دسترسی به مشخصه ها یا متد های نوع [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] یک کلاس اصلی و با نام اصلی کلاس است[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همچنین در نمونه های ساخته شده از کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]ما می تونیم با این مشخصه ، [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو به اون اختصاص بدیم و از اون استفاده کنیم.البته [/FONT][FONT=&quot] [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]اعمال شده به شی نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]فقط یک مورد می تونه باشه نه بیشتر[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همچنین در مورد کلاسهای اصلی فلش مثل کلاس [/FONT][FONT=&quot]MovieClip[/FONT][FONT=&quot] [/FONT][FONT=&quot] می تونیم به شکل زیر و با استفاده از مشخصه [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot]، به گنجینه اونها دسترسی پیدا کنیم و یک سری مشخصه ها و متد های جدید به اونها اضافه کنیم . به شکل زیر نگاه کنید ، این شکل خیلی خیلی مهمه [/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic14.GIF
[/FONT]

[FONT=&quot]و دو نمونه از مووی کلیپهای یاد شده قبل از خروجی گرفتن در صحنه فلش به قرار زیر هستند :[/FONT]


Pic15.GIF

[FONT=&quot]و پس از خروجی گرفتن ، بصورت زیر معکوس می شن:[/FONT]


Pic16.GIF

[FONT=&quot]مثال [/FONT][FONT=&quot]Sample27-05[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنین و به این موضوع پی ببرید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]متد [/FONT][FONT=&quot]hasOwnProperty()[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]این متد به شکل زیر به کار می ره[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]
Pic06.GIF
[/FONT]

[FONT=&quot]در حقیقت این متد ، مقدار بولین [/FONT][FONT=&quot] [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا [/FONT][FONT=&quot] [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot]را به شرح زیر بر می گردونه [/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]1-[FONT=&quot] [/FONT][/FONT][FONT=&quot] [/FONT][FONT=&quot]اگر نام رشته ای مشخصه یا متد نوشته شده داخل دابل کوتیشن ، همنام با یکی از مشخصه ها یا متد های کلاس اصلی نمونه ساخته شده باشه ، مقدار [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot] برگردونده می شه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2-[FONT=&quot] [/FONT][/FONT][FONT=&quot]اگر نام رشته ای مشخصه یا متد نوشته شده داخل دابل کوتیشن ، همنام با یکی از مشخصه ها یا متد های نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]static[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا نوع [/FONT][FONT=&quot]prototype [/FONT][FONT=&quot] کلاس اصلی نمونه ساخته شده باشه ، مقدار [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot] برگردونده می شه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]البته قوانین گفته شده در بالا ، بیشتر در مورد کلاس و شی نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]صدق می کنه و استفاده از این مشخصه ها و متد ها در جای دیگر و بر روی دیگر مباحث اکشن اسکریپت ، شاید تفاوت کنه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]متد [/FONT][FONT=&quot]isPrototypeOf()[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]این متد برای نتیجه گیری یک کلاس از کلاس دیگر است . در حقیقت ما می خواهیم ببینیم که آیا یک نمونه از یک کلاس ، از کلاس دیگری مشتق شده و یا آیا نمونه ساخته شده ، از کلاس خاصی ساخته شده و یا آیا نمونه از کلاسی ساخته شده که زیر کلاس کلاس دیگری هست یا نه ؟ همینطور می تونیم تست کنیم و ببینیم آیا کلاسی ، زیر کلاس کلاس دیگه ای هست یا نه ؟ و به گفته دیگر ببینیم که آیا کلاس داخل پارامتر ورودی این متد ، مشتق شده و زیر کلاس کلاس ارتباطی بیرون است یا نه[/FONT][FONT=&quot].[/FONT][FONT=&quot] [/FONT][FONT=&quot]می شه گفت این متد ، گزینه دیگری برای دستور [/FONT][FONT=&quot]is[/FONT][FONT=&quot] [/FONT][FONT=&quot] هست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این متد به شکل زیر به کار می ره[/FONT][FONT=&quot]:[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic07.GIF
[/FONT]

[FONT=&quot]و اما مثلا در شکل زیر می بینید که تونستیم تست کنیم که آیا کلاس [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot]، مادر کلاس [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot] هست یا نه[/FONT][FONT=&quot] [/FONT][FONT=&quot]و اگر [/FONT][FONT=&quot]A[/FONT][FONT=&quot] [/FONT][FONT=&quot] مادر [/FONT][FONT=&quot] [/FONT][FONT=&quot]B[/FONT][FONT=&quot] [/FONT][FONT=&quot]بود مقدار [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot] و در غیر اینصورت مقدار [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot]برگردونده می شه[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic08.GIF
[/FONT]

[FONT=&quot]متد [/FONT][FONT=&quot]propertyIsEnumerable()[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]این متد برای تعیین شمارش پذیر بودن مشخصه یا متد یک نمونه از کلاس داینامیک خاص هست.در حقیقت اگر مشخصه یا متدی با نام داخل پرانتز در شی نمونه از یک کلاس داینامیک خاص یا از نوع [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]به صورت اضافه شده ثانویه پیدا شه ، این متد مقدار [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot] را برمی گردونه و در غیر اینصورت حتی اگر نام مشخصه یا متد داخل پرانتز ، همنام مشخصات و متد های اصلی و اولیه تعریف شده در بدنه اصلی کلاس داینامیک یا [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]باشه ، این متد ، مقدار [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو برمی گرداند. در حقیقت این متد ، مشخصات و متد های ثانویه اضافه شده به نمونه ساخته شده از یک کلاس داینامیک و یا [/FONT][FONT=&quot] [/FONT][FONT=&quot]Object[/FONT][FONT=&quot] [/FONT][FONT=&quot]را نشون می ده . در مورد [/FONT][FONT=&quot]prototype[/FONT][FONT=&quot] [/FONT][FONT=&quot] ها هم این متد ، پروتوتایپ های اولیه اضافه شده به نمونه کلاس رو نشون نمی ده بلکه پروتوتایپ ثانویه اضافه شده به نمونه را نشون می ده.(منظور از نشون دادن همون مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot]برگردونون هست[/FONT][FONT=&quot](.[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic09.GIF
[/FONT]

[FONT=&quot]متد [/FONT][FONT=&quot]setPropertyIsEnumerable[/FONT][FONT=&quot]()[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT][FONT=&quot]این متد برای تنظیم حالت شمارش پذیر یا شمارش ناپذیر بودن یک مشخصه یا متد ثانویه اضافه شده به نمونه ساخته شده از یک کلاس داینامیک یا یک نمونه از نوع [/FONT][FONT=&quot] Object[/FONT][FONT=&quot] به کار می روه. یعنی مشخصه یا متد ثانویه ای که با این روش حالت شمارشش [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot] می شه ، در حقیقت می تونه مورد دسترسی تریس قرار بگیره ولی نه جزء مشخصه ها و متد های ثانویه شمارش پذیر . مشخصه ها و متد هایی که با این روش [/FONT][FONT=&quot] [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot]می شند در دستور [/FONT][FONT=&quot]for … in[/FONT][FONT=&quot] [/FONT][FONT=&quot] هم به حساب مشخصه های شمارش پذیر نمی یاند و جزء مشخصه ها و متد هایی که یک بار کامل ، کل دستورات داخل تگ [/FONT][FONT=&quot]for … in[/FONT][FONT=&quot] [/FONT][FONT=&quot] برای اون اجرا بشه قرار نمی گیرند (یعنی دستور[/FONT][FONT=&quot] [/FONT][FONT=&quot] [/FONT][FONT=&quot]for … in[/FONT][FONT=&quot] [/FONT][FONT=&quot]بر روی مشخصه ها و متد هایی که با این متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot]می شند ، غیر فعال بوده و بر روی آنها اعمال نمی شه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]

[FONT=&quot][/FONT]
[FONT=&quot]
Pic10.GIF
[/FONT]

[FONT=&quot]متد [/FONT][FONT=&quot]toString[/FONT][FONT=&quot]()[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT][FONT=&quot]این متد نام اصلی کلاسی رو که نمونه مد نظر، از آن ساخته شده به حالت رشته در می یاره و می تونه تریس بشه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]

[FONT=&quot] [/FONT]
[FONT=&quot][/FONT]
[FONT=&quot]
Pic11.GIF
[/FONT]

[FONT=&quot]
[/FONT]

[FONT=&quot] مثال :[/FONT]
[FONT=&quot]
Pic12.GIF
[/FONT]

[FONT=&quot]متد [/FONT][FONT=&quot]valueOf[/FONT][FONT=&quot]()[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
[/FONT][FONT=&quot]این متد دو کارآیی مهم می تونه داشته باشه[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]

[FONT=&quot]1-[/FONT][FONT=&quot] [/FONT][FONT=&quot]اگه بخواهیم فقط در مورد یک نمونه ساخته شده از یک کلاس داینامیک عمل کنیم ، مثل متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]toString[/FONT][FONT=&quot] [/FONT][FONT=&quot]فقط نام کلاس رو به حالت رشته بر می گردونه[/FONT][FONT=&quot] .[/FONT][FONT=&quot]
[/FONT][FONT=&quot]2- [/FONT][FONT=&quot] [/FONT][FONT=&quot]اگر به شکل زیر بخواهیم در مورد مشخصه ای خاص از یک کلاس داینامیک عمل کنه ، مقدار مشخصه رو بر می گردونه حال چه این مشخصه از مشخصات اولیه تعریف شده در بدنه کلاس اصلی باشه یا جزء مشخصات ثانویه باشه ، چه رشته ای باشه و چه عددی و چه[/FONT][FONT=&quot] ... [/FONT][FONT=&quot]..[/FONT]

[FONT=&quot][/FONT]
[FONT=&quot]
Pic13.GIF
[/FONT]

[FONT=&quot]مثال [/FONT][FONT=&quot]Sample27-23 , Sample27-04[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو دانلود کنید و به صورت بهتری بحث رو دنبال کنید[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پایان بخش هشتم[/FONT][FONT=&quot][/FONT]
 

پیوست ها

  • Sample27-05.rar
    7.8 کیلوبایت · بازدیدها: 275
  • Sample27-04.rar
    9.9 کیلوبایت · بازدیدها: 273
  • Sample27-03.rar
    5.5 کیلوبایت · بازدیدها: 275
  • Sample27-02.rar
    5.7 کیلوبایت · بازدیدها: 281
  • Sample27-01.rar
    7.1 کیلوبایت · بازدیدها: 285
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 – درس بیست و هشتم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]
[FONT=&quot]آموزش بازی پازل[/FONT]
[FONT=&quot]در این بخش ، سعی دارم یه مثال گرافیکی از یه بازی زیبا رو به طور تمام و کمال با مبحث کلاس جوری یاد بدم که تمامی دوستان علاقه مند به اکشن اسکریپت 3 ، انگشتاشونو باهاش بخورند .(البته در حین کد نویسی)[/FONT][FONT=&quot] [/FONT][FONT=&quot][/FONT]
[FONT=&quot]این مثال تشکیل شده از[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]1- یک فایل سورس [/FONT][FONT=&quot] [/FONT][FONT=&quot]fla[/FONT][FONT=&quot] [/FONT][FONT=&quot]که نقش کلیدی کار و منبع مووی کلیپ ها و گرافیک ها رو بازی می کنه[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]2- دو فایل کلاسی از نوع اکشن اسکریپت[/FONT][FONT=&quot] ([/FONT][FONT=&quot]as[/FONT][FONT=&quot]) [/FONT][FONT=&quot][/FONT]
[FONT=&quot]و اما استفاده از این دو فایل کلاسی[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]الف[/FONT][FONT=&quot]- [/FONT][FONT=&quot] فایل کلاسی اولمون اسمش هست [/FONT][FONT=&quot]MainClass[/FONT][FONT=&quot] [/FONT][FONT=&quot]، این فایل ، کلاس اصلی کار راه انداز فلشمون هست ، بهتر بگم سناریوی اصلی قصه فلشمون در این کلاس نوشته شده[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]ب- فایل کلاسی دوممون اسمش هست [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] . [/FONT][FONT=&quot] این فایل نقش نسبتا همپوشانی رو با مووی کلیپ های خاصی بازی می کنه[/FONT][FONT=&quot] .[/FONT][FONT=&quot] [/FONT][FONT=&quot]چرا نسبتا ؟[/FONT][FONT=&quot][/FONT]
[FONT=&quot]به خاطر اینکه این روش با همه روش هایی که بهتون یاد داده بودیم اندکی فرق داره . چه فرقی ؟[/FONT][FONT=&quot][/FONT]
[FONT=&quot]فرقش اینه که قراره کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot]، نقش کلاس مادر یک سری مووی کلیپ ها رو بازی کنه . پس تکلیف سرپرستی مووی کلیپ ها از طریق کلاس اصلی مووی کلیپ ها چی می شه ؟[/FONT][FONT=&quot][/FONT]
[FONT=&quot]به راحتی !!! فقط کافیه کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو زیر کلاس مووی کلیپ ها کنیم و اون مووی کلیپ ها رو زیر کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] یعنی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic01.gif

[/FONT]
[FONT=&quot]در حقیقت مووی کلیپ های قطعه پازلهامون ، زیر کلاس مووی کلیپ ها هستند البته به صورت غیر مستقیم و با واسطه کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]dragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot]که خودش زیر کلاس مووی کلیپ هاست. شاید سؤالی واستون پیش بیاد که خوب این بحث چه فرقی با مبحث ارث بری سلسله زنجیروار کلاسها داره و در جواب باید بگم که این دقیقا همون بحثه منتها اینبار قراره وقتی مووی کلیپ های قطعه پازل ها رو [/FONT][FONT=&quot] [/FONT][FONT=&quot]export for actionscript[/FONT][FONT=&quot] [/FONT][FONT=&quot]می کنیم ، در کادر [/FONT][FONT=&quot]Sub Class[/FONT][FONT=&quot] [/FONT][FONT=&quot] بنویسیم [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] یعنی اسم کلاس واسطه رو[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]و اما ساختار بازی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]قرار هست 9 قطعه مووی کلیپ قطعه پازلها رو در یک محدوده مستطیلی و بصورت رندوم در نقاط مختلف این محدوده پخش کنیم . بعد شما روی تک تک این قطعات کلیک و درگ می کنید تا به جای مناسبشون در یک کادر مربعی ، قرار بدین . با برچیدن هر قطعه ، سایه ای زیر اون ظاهر می شه و برای این کار فیلتر سایه به اونها در حین درگ اختصاص داده می شه . بعد اگه قطعه ای در جای خودش قرار بگیره ، در جای درستش چفت می شه و دیگه نمی شه اونو درگ کرد . اگر هم که در جای درستش قرار نگیره ، با رها کردن موس ، در جای اولیه اش قرار می گیره . زیر این بازی ، یه تکست باکسی قرار گرفته که در حالت عادی ، مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]Continue[/FONT][FONT=&quot] [/FONT][FONT=&quot]در اون قرار گرفته و وقتی که شما بازی رو بردین ، این نوشته به [/FONT][FONT=&quot]You Win![/FONT][FONT=&quot] [/FONT][FONT=&quot] تبدیل می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic02.JPG

[/FONT]
[FONT=&quot]ملزومات بازی :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]عکسی با پیکسل [/FONT][FONT=&quot]300 *300[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو در فتوشاپ به قسمت های مختلف و نامنظم تقسیم کردیم (فتوشاپ ابزار [/FONT][FONT=&quot]Path[/FONT][FONT=&quot] [/FONT][FONT=&quot]و [/FONT][FONT=&quot]PenTool[/FONT][FONT=&quot] ) و تک تک این تکه ها رو در لایه ای خاص قرار دادیم و از هر قطعه به حالت [/FONT][FONT=&quot]Crop[/FONT][FONT=&quot] [/FONT][FONT=&quot] شده و ترنسپرنتی ، با فرمت [/FONT][FONT=&quot]png[/FONT][FONT=&quot] [/FONT][FONT=&quot] در جایی از هارد [/FONT][FONT=&quot]save[/FONT][FONT=&quot] [/FONT][FONT=&quot] کردیم . در نهایت از عکس کلی و کامل هم با فرمت [/FONT][FONT=&quot]jpeg[/FONT][FONT=&quot] [/FONT][FONT=&quot] در همون جا [/FONT][FONT=&quot]save[/FONT][FONT=&quot] [/FONT][FONT=&quot] کردیم . بعد همه اونها رو در فلش وارد کردیم .عکس کامل ما به شکل زیر هست[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]
Pic03.jpg

[/FONT]
[FONT=&quot]فایل [/FONT][FONT=&quot] [/FONT][FONT=&quot]Lesson28-Game-Picture[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنید . این فایل 1 فایل فتوشاپ [/FONT][FONT=&quot] [/FONT][FONT=&quot](PSD)[/FONT][FONT=&quot] [/FONT][FONT=&quot]به اضافه عکس های بریده شده هستند[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]بعد از ورود این عکس ها در فلش ، اونها رو تک تک به مووی کلیپ تبدیل می کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]در این زمان با دو مقوله مووی کلیپ سروکار داریم ، یکیش یه عکس کامل با پیکسل بندی 300 * 300 و بعد از اون ، 9 قطعه مووی کلیپ از تکه های مختلف[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]بعد از تبدیل به مووی کلیپ ، 9 قطعه مووی کلیپ رو در 2 فولدر [/FONT][FONT=&quot] [/FONT][FONT=&quot]library[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار می دیم . یک پوشه که حاوی 9 قطعه مووی کلیپ قطعه پازلهاست و اینها ، مربوط به هدف های نهایی هر قطعه می شند و کاربردشون در این مورد هست که بعد از قرار گیری هر قطعه در جای درستش ، باید قطعات قابل درگ در محل [/FONT][FONT=&quot]x , y[/FONT][FONT=&quot] [/FONT][FONT=&quot] این مووی کلیپ ها قرار بگیرند و طبعا باید آلفاشون صفر باشه تا در هدف غیر قابل مشاهده باشند . این قطعات هدف در فولدر [/FONT][FONT=&quot]Target Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] از [/FONT][FONT=&quot]Library[/FONT][FONT=&quot] [/FONT][FONT=&quot] سورس قرار می گیرند . در فولدر دیگه ای از [/FONT][FONT=&quot]library[/FONT][FONT=&quot] [/FONT][FONT=&quot] به نام [/FONT][FONT=&quot]Dragable Pieces[/FONT][FONT=&quot]، همین 9 قطعه مووی کلیپ قطعات پازل رو کپی می کنیم و این بار تک تک اونها رو در این فولدر ، [/FONT][FONT=&quot]export for actionscript[/FONT][FONT=&quot] [/FONT][FONT=&quot] می کنیم و تک تک اونها رو(9 قطعه واقع در فولدر [/FONT][FONT=&quot]Dragable Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] ) به شیوه زیر ، زیر کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] که از قضا خودش ، زیر کلاس مووی کلیپ هاست ، می کنیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic04.JPG

[/FONT]
[FONT=&quot]در نهایت یک دایره سیاهرنگ خیلی ریزی رو در صحنه رسم می کنیم و اونرو به یه مووی کلیپ تبدیل می کنیم و 9 تا نمونه از اونو در صحنه درگ می کنیم (باید [/FONT][FONT=&quot] [/FONT][FONT=&quot]9[/FONT][FONT=&quot] [/FONT][FONT=&quot]نمونه از اونو در [/FONT][FONT=&quot] [/FONT][FONT=&quot]scene[/FONT][FONT=&quot] [/FONT][FONT=&quot]داشته باشیم ). این مووی کلیپ دایره[/FONT][FONT=&quot] [/FONT][FONT=&quot]، نقش آهنربا رو بازی می کنه و برای هر قطعه ، یکی از اونها تعریف می شه تا وقتی قطعه ای به آهنربای خودش رسید و در هنگام رهایی موس به اون برخورد کرد ، جذب اون بشه .حالا ما آهنرباها رو به شکل[/FONT][FONT=&quot] [/FONT][FONT=&quot]و نام های نمونه ای زیر در صحنه داریم[/FONT][FONT=&quot] ([/FONT][FONT=&quot]instance name[/FONT][FONT=&quot]) [/FONT][FONT=&quot]و آلفای اونا رو صفر می کنیم تا نامرئی شن[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
pic05.JPG

[/FONT]
[FONT=&quot]منظور ما از [/FONT][FONT=&quot]Magnetic[/FONT][FONT=&quot] [/FONT][FONT=&quot]، واژه انگلیسی آهنربا هست و همینطور[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]T[/FONT][FONT=&quot] -----> [/FONT][FONT=&quot]Top[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا بالا[/FONT][FONT=&quot][/FONT]
[FONT=&quot]B[/FONT][FONT=&quot] ------> [/FONT][FONT=&quot]Below[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا پایین[/FONT][FONT=&quot][/FONT]
[FONT=&quot]M[/FONT][FONT=&quot] ----->[/FONT][FONT=&quot]Middle[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا وسط[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پس وقتی می گیم [/FONT][FONT=&quot]MagneticTM[/FONT][FONT=&quot] [/FONT][FONT=&quot] یعنی گفتیم آهنربای بالا وسط . با این سیستم نامگذاری آشنا بشید. این آهنرباها حکم سنسور حسی رو برای برخورد قطعات با نقاط محدوده اصلی پازل رو بازی می کنند . بعد از برخورد ، اگه قطعه پازلمون به آهنربای مخصوص خودش برخورد کرد به اون گفته می شه که در مکان ایکس و ایگرگ قطعه هدف خودش [/FONT][FONT=&quot] [/FONT][FONT=&quot]([/FONT][FONT=&quot]مووی کلیپ درگ شده از فولدر [/FONT][FONT=&quot]Target Pieses[/FONT][FONT=&quot] [/FONT][FONT=&quot] که در هدف نهایی درست قرار گرفتند و آلفاشون صفر شده تا دیده نشند) قرار می گیره . حالا چرا ما از آهنربای ریز استفاده می کنیم و از خود قطعات هدف به عنوان آهنربا استفاده نمی کنیم ؟[/FONT][FONT=&quot][/FONT]
[FONT=&quot]چون قطعات هدف ( قطعات پازل ) اندازشون بزرگتره و کاربر کافیه قطعه رو به هدف ( با اندازه بزرگتر ) برسونه تا به اون بچسبه و این باعث می شه تا بازی راحت بشه و ارزش خودشو از دست بده ، چرا که کاربر تا پازل رو به داخل محدوده بیاره و در هنگام رهایی موس ، به کمترین اندازه به هدف خودش تماس بده ، قطعه سر جاش قرار می گیره و به همین علت ، ما از آهنرباهای خیلی کوچیک استفاده کردیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شکل زیر هم اسم نمونه ای تکه قطعات واقع در محدوده هدف رو نشون می دن و اینا ، اسامی نمونه ای[/FONT][FONT=&quot] (instance name) [/FONT][FONT=&quot]قطعات هدف هست که اونها رو از فولدر [/FONT][FONT=&quot] [/FONT][FONT=&quot]Target Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot]به صحنه و در جای درستشون درگ کردیم و آلفاشونو صفر کردیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic06.JPG

[/FONT]
[FONT=&quot]منظور ما از [/FONT][FONT=&quot] [/FONT][FONT=&quot]T[/FONT][FONT=&quot] [/FONT][FONT=&quot]اول اسامی ، همون [/FONT][FONT=&quot] [/FONT][FONT=&quot]Target[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا هدف هست و الباقیشون به روال قبل[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]T[/FONT][FONT=&quot] -----> [/FONT][FONT=&quot]Top[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا بالا و[/FONT][FONT=&quot] ...[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شکل زیر هم اسامی کلاسی تکه قطعاتی رو نشون می ده که قرار هست در کادر مستطیلی سمت چپ بازی ، بصورت رندوم پخش شن و کاربر ،[/FONT][FONT=&quot] [/FONT][FONT=&quot]اونها رو درگ کنه و در جای درستشون در کادر مربعی سمت راست قرار بده . اینا اسم کلاسی قطعات واقع در فولدر [/FONT][FONT=&quot]Dragable Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] هستند و این اسامی به ترتیب بالا راست و بالا وسط و ... هست[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]
Pic07.JPG

[/FONT]
[FONT=&quot]اشتباه نکنید اسامی بالا ، اسامی نمونه ای یا [/FONT][FONT=&quot]Instance name[/FONT][FONT=&quot] [/FONT][FONT=&quot] نیستند بلکه اسامی کلاسی هستند ، یعنی کابر طراح ، وقتی داره هر تکه مووی کلیپ (در فولدر [/FONT][FONT=&quot] (Dragable Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو [/FONT][FONT=&quot]export for actionscript[/FONT][FONT=&quot] [/FONT][FONT=&quot] می کنه ، اسم واقع در کادر [/FONT][FONT=&quot]Class[/FONT][FONT=&quot] [/FONT][FONT=&quot] هر کدوم رو به ترتیب بالا قرار می ده[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]یه تکست باکس هم با نام نمونه ای [/FONT][FONT=&quot] [/FONT][FONT=&quot]StatueText [/FONT][FONT=&quot]قرار دادیم و کار اون اینه که اگه کاربر برنده شد ، بنویس [/FONT][FONT=&quot]You Win![/FONT]
[FONT=&quot]تصویر کامل زمینه رو هم به مووی کلیپ تبدیل کردیم و یه نمونه از اون رو در صحنه ، درگ گردیم و اسم نمونه ای اونو [/FONT][FONT=&quot] [/FONT][FONT=&quot]BackGround[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار دادیم و اونو در جای هدف قرار دادیم . آلفاشو در دستورات کلاس اصلی ، صفر می کنیم تا دیده نشه . بعد از اتمام بازی و قرار گیری تمام قطعات پازل در جای درستشون ، این تصویر به طور کامل به نمایش در می یاد (آلفاش یک می شه[/FONT][FONT=&quot]( .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]شیوه طراحی کلاسهای این بازی :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این ساختار کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست دقت کنید[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot][/FONT]
PHP:
package//تعریف بسته
{
    import flash.display.MovieClip;
    //ورود کلاس مووی  کلیپ ها
    import flash.events.MouseEvent;
    //ورود کلاس رویداد های موس
    import flash.filters.DropShadowFilter;
    //ورود کلاس فیلتر ها
    public class DragDrop extends MovieClip
    {//تعریف کلاس اصلی درگ قطعات  زیر کلاس مووی کلیپ ها 
    //این کلاس باید زیر کلاس مووی کلیپ ها باشد تا
    //در محدوده مووی کلیپ ها بر هر مووی کلیپ اعمال شود
        //همچنین فراموش نکنید که هر مووی کلیپ قطعه درگ شدنی ، زیر کلاس این کلاس خواهد شد
        //در واقع هر مووی کلیپ قطعه درگ شدنی قرار است نوه مووی کلیپ ها باشد
        public var _MagneticPoint :*;
        //مشخصه ای از هر نوع برای تعیین مووی کلیپ آهنربای هدف  هر نمونه قطعه از این کلاس
        //آهنربا ، تکه ای است که نشان می دهد آیا قطعه با آن برخورد کرده یا نه
        public var _Goal:*;
//مشخصه ای از هر نوع برای تعیین قطعه مشابه هدف برای قرار گیری در مکان ایکس و ایگرگ آن
//قطعه هدف ، برای وقتی است که مووی کلیپمان در مکان درستش استقرار یافته و ایکس و ایگرگش 
//برابر قطعه مشابه هدف می شود
        public var _MainX:Number;
        //ایکس هر قطعه در اینجا قرار می گیرد
        public var _MainY:Number;
        //ایگرگ هر قطعه در این مشخصه قرار می گیرد
        public function DragDrop():void 
        //کانسترکتور این کلاس برای اجرای اولیه این کلاس
        {
            _MainX=this.x;
            //ایکس هر کارت در مشخصه ایکس اصلی آن قرار می گیرد
            _MainY=this.y;
            //ایگرگ هر کارت در مشخصه اصلی ایگرگش قرار می گیرد
            this.buttonMode=true;
        //می شود true حالت دست شدن اشاره گر موس روی هر نمونه از این کلاس 
            this.addEventListener(MouseEvent.MOUSE_DOWN,FunctionDrag);
        //در حالت فشرده شدن موس روی نمونه های این کلاس تابع درگ داده شد
            this.addEventListener(MouseEvent.MOUSE_UP,FunctionDrop);
        //در حالت رها شدن موس روی نمونه های این کلاس تابع رهایی موس داده شد
        }
        function FunctionDrag(event:MouseEvent):void
                //متد درگ 
        {
            this.startDrag();
            //نمونه این کلاس درگ شد
            this.filters=[new DropShadowFilter()];
            //فیلتر سایه به نمونه این کلاس اعمال شد
            this.parent.addChild(this);
            //این نمونه قطعه جزء قطعات فرزند صحنه می شود
        }
        
        function FunctionDrop(event:MouseEvent):void
        //متد رهایی از حالت درگ
        {
            this.stopDrag();
            //رهایی نمونه ساخته شده از این کلاس در حالت رهایی موس
            this.filters=[];
            //حذف فیلتر سایه
        }
        public function FunctionDisable():void
        //متد غیر فعال کننده
        {
            this.buttonMode=false;
            //حالت نشانگر موس از حالت دست خارج شد
            this.removeEventListener(MouseEvent.MOUSE_DOWN,FunctionDrag);
            //متد  حالت درگ از نمونه ساخته شده از این کلاس حذف می شود
            this.removeEventListener(MouseEvent.MOUSE_UP,FunctionDrop);
            //متد رهایی از حالت درگ موس از نمونه ساخته شده از این کلاس حذف شد
        }
    }
}
[FONT=&quot]این کلاس ، زیر کلاس مووی کلیپ هاست و ما در این کلاس ، دو مشخصه از نوع پیش فرض همه چیز (*) رو تعریف کردیم . یکیش مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]MagneticPoint[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست و برای اینه که وقتی از بیرون به نمونه های اصلی و یا نمونه های زیر کلاسهای این کلاس ، آهنربا تعیین کردیم ، آهنربای نوع مووی کلیپ یا هر چیز دیگه ، در این مشخصه قرار بگیره . اون یکیش هم [/FONT][FONT=&quot]_[/FONT][FONT=&quot]Goal[/FONT][FONT=&quot] [/FONT][FONT=&quot] یا هدف هست و اینیکی برا اونه که شما به نمونه های این کلاس یا نمونه های زیر کلاسهای این کلاس ، مووی کلیپ هدف تعیین کنید[/FONT][FONT=&quot] ([/FONT][FONT=&quot]Target Pieces[/FONT][FONT=&quot]) . [/FONT][FONT=&quot]دو مشخصه دیگه هم از نوع عددی تعریف کردیم و اینا برا اونه که مکان ایکس و ایگرگ هر نمونه ، در مشخصه های به ارث رسیده از این کلاس قرار بگیره[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]سپس [/FONT][FONT=&quot]2 [/FONT][FONT=&quot] تابع به نمونه های این کلاس یا نمونه هایی از زیر کلاسهای این کلاس نسبت داده می شه . یکیش در حال گرفتن کلیک موس و درگ کردن هست و می گیم که باید این قطعه درگ بشه . در این حالت فیلتر سایه به نمونه اعمال می شه . متد بعدی در حالت رهایی موس از حالت درگ هست و در این حالت ، فیلتر سایه حذف می شه و عمل درگ ، استپ می شه . متد دیگری هم در این کلاس نوشته شده و برا این هست که اگه فرا خونی بشه ، حالت دست رو از روی نمونه ها (در حالت لمس موس ) حذف کنه و دو تابع درگ و رهایی رو هم از نمونه های این کلاس یا نمونه های زیر کلاسهای این کلاس حذف کنه . در نهایت کانسترکتوری برا این کلاس تعریف شده و در این کانسترکتور ، مکان ایکس و ایگرگ نمونه ها ، در دو مشخصه عددی مناسب به ارث رسیده از این کلاس قرار می گیره و حالت دست شدن نشانگر موس روی نمونه ها فعال می شه و دو تابع مذکور درگ و رهایی به نمونه ها اعمال می شه . مووی کلیپ قطعات پازل که در پوشه [/FONT][FONT=&quot]Dragable Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار دارند و زیر کلاس این کلاس می شند ، این مشخصه ها و متد ها رو به ارث می برند . و اما می ریم سر کلاس اصلی کار راه انداز سورس فلشمون یا بهتر بگم کلاس [/FONT][FONT=&quot]MainClass[/FONT][FONT=&quot]، به کدهای زیر دقت کنید[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot][/FONT]
PHP:
package//تعریف بسته
{
    import flash.display.MovieClip;
    //ورود کلاس مووی کلیپ ها
    import flash.events.MouseEvent;
    //ورود کلاس رویداد های موس
    import DragDrop;//ورود کلاس درگ قطعات
    import TR;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه بالا راست
    import TM;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه بالا وسط
    import TL;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه بالا چپ
    import BR;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه پایین راست
    import BM;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه پایین وسط
    import BL;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه پایین چپ
    import ML;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه وسط چپ
    import MM;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه وسط وسط
    import MR;//ورود  کلاس مووی کلیپ اکسپورت شده قطعه وسط راست
    public class MainClass extends MovieClip
    {
//کلاس اصلی سورس ما  که زیر کلاس مووی کلیپ ها شده تا در این ناحیه کار کند
        private var part1:TL;//مشخصه ای از نوع قطعه بالا چپ
        private var part2:TM;//مشخصه ای از نوع قطعه بالا وسط
        private var part3:TR;//مشخصه ای از نوع قطعه بالا راست
        private var part4:ML;//مشخصه ای از نوع قطعه وسط چپ
        private var part5:MM;//مشخصه ای از نوع قطعه وسط وسط
        private var part6:MR;//مشخصه ای از نوع قطعه وسط راست
        private var part7:BL;//مشخصه ای از نوع قطعه پایین چپ
        private var part8:BM;//مشخصه ای از نوع قطعه پایین وسط
        private var part9:BR;//مشخصه ای از نوع قطعه پایین راست
        private var _TotalTrace:Number;
        //مشخصه تعداد کل  قطعات تصاویر که جمعا نه قطعه است
        private var _CurrentTrace:Number;
        //مشخصه تعداد  قطعات جور شده تصاویر تا به حال که هنوز صفر است
        public function MainClass():void 
        //کانسترکتور کلاس اصلی و راه انداز سورس
        {
            _TotalTrace=9;
//مقدار دهی اولیه به مشخصه حد اکثر جور شدن قطعات تصاویر در محل درست به تعداد نه تا
            _CurrentTrace=0;
//مقدار دهی به مشخصه تعداد  قطعات جا گرفته در محل درست با مقدار اولیه صفر
            createPieces();
//فراخوانی متد اصلی برای ساخت و چیدمان  قطعات تصاویر
            BackGround.alpha=0;
            //آلفای عکس کامل پس زمینه صفر می شود
            //بعد از تکمیل چیدمان صحیح قطعات ، آلفای این عکس 1 می شود
            //این عکس برای نمایش کامل تصویر است
        }
        private function createPieces():void
        //متد اصلی چیدمان و ساماندهی به قطعات تصاویر
        {
            part1=new TL();
            //شی از نوع مووی کلیپ قطعه تصویر بالا چپ ساخته شده و
            //در مشخصه خاصش قرار می گیرد
            addChild(part1);
            //نمایش مشخصه بالا چپ
            part1._MagneticPoint=MagneticTL;
                       //تعیین آهنربای مخصوص قطعه 1 در صحنه
//این آهنربا برای وقتیست که موی را از روی کارت رها کنیم و تست شود که آیا 
//قطعه روی آهنربا رها شده یا خیر
            part1._Goal=TLT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part1.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part1);
//برای تعیین مکان تصادفی و رندوم قطعه اول ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part2=new TM();
            //شی از نوع مووی کلیپ قطعه تصویر بالا وسط ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part2);
            //نمایش قطعه بالا وسط
            part2._MagneticPoint=MagneticTM;
            part2._Goal=TMT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part2.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part2);
//برای تعیین مکان تصادفی و رندوم قطعه دوم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part3=new TR();
            //شی از نوع مووی کلیپ قطعه تصویر بالا راست ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part3);
            //نمایش قطعه بالا راست
            part3._MagneticPoint=MagneticTR;
            part3._Goal=TRT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part3.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part3);
//برای تعیین مکان تصادفی و رندوم قطعه سوم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part4=new ML();
            //شی از نوع مووی کلیپ قطعه تصویر وسط چپ ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part4);
            //نمایش قطعه وسط چپ
            part4._MagneticPoint=MagneticML;
            part4._Goal=MLT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part4.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part4);
//برای تعیین مکان تصادفی و رندوم قطعه چهارم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part5=new MM();
            //شی از نوع مووی کلیپ قطعه تصویر وسط وسط ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part5);
            //نمایش قطعه وسط وسط
            part5._MagneticPoint=MagneticMM;
            part5._Goal=MMT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part5.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part5);
//برای تعیین مکان تصادفی و رندوم قطعه پنجم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part6=new MR();
            //شی از نوع مووی کلیپ قطعه تصویر وسط راست ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part6);//نمایش قطعه وسط راست
            part6._MagneticPoint=MagneticMR;
            part6._Goal=MRT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part6.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part6);
//برای تعیین مکان تصادفی و رندوم قطعه ششم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part7=new BL();
            //شی از نوع مووی کلیپ قطعه تصویر پایین چپ ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part7);
            //نمایش قطعه پایین چپ
            part7._MagneticPoint=MagneticBL;
            part7._Goal=BLT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part7.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part7);
//برای تعیین مکان تصادفی و رندوم قطعه هفتم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part8=new BM();
            //شی از نوع مووی کلیپ قطعه تصویر پایین وسط ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part8);//نمایش  قطعه پایین وسط
            part8._MagneticPoint=MagneticBM;
            part8._Goal=BMT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part8.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part8);
//برای تعیین مکان تصادفی و رندوم قطعه هشتم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            part9=new BR();
            //شی از نوع مووی کلیپ قطعه تصویر پایین راست ساخته شده
            //و در مشخصه خاصش قرار می گیرد
            addChild(part9);//نمایش قطعه پایین راست
            part9._MagneticPoint=MagneticBR;
            part9._Goal=BRT;
            //آهنربا و درحقیقت نقطه برخورد هدف این نمونه قطعه تعیین شد
            part9.addEventListener(MouseEvent.MOUSE_UP,checkTarget);
            //به این نمونه از قطعه ، در حالت رهایی موس ، متد کنترل هدف  پیوست شد
            randomPosition(part9);
//برای تعیین مکان تصادفی و رندوم قطعه نهم ، این قطعه به متد تعیین رندوم مکان پاس داده شد
            
        }
        private function checkTarget(event:MouseEvent):void
        //متد تست محل برخورد (محل  قطعه در زمان رهایی موس )  قطعه 
        //با این متد ، محلی که قطعه در هنگام رهایی موس در آنجا قرار می گیرد ، بررسی می شود
        //اگر این مکان ، همان نقطه هدف بود ، قطعه در جایش ثابت می شود
        {
            if(event.currentTarget.hitTestObject(event.currentTarget._MagneticPoint))
            {//اگر محل برخورد قطعه پاس داده شده به این متد ، همان نقطه هدفش بود 
            //دستورات زیر اجرا می گردد
                event.currentTarget.x=event.currentTarget._Goal.x;
                //مکان ایکس قطعه ، مکان ایکس هدف قطعه نهایی می شود
                event.currentTarget.y=event.currentTarget._Goal.y;
                //مکان ایگرگ قطعه ، مکان ایگرگ قطعه هدف نهایی می شود
                event.currentTarget.removeEventListener(MouseEvent.MOUSE_UP,checkTarget);
                //این متد بررسی هدف ، از قطعه حذف می شود
                event.currentTarget.FunctionDisable();
            //متد غیر فعال کننده  درون قطعه فعال شده و عملیات موس روی این قطعه حذف می شود
                _CurrentTrace++;//یک واحد به مشخصه تعداد قطعات جور شده ، اضافه شد
                if(_CurrentTrace==_TotalTrace)
                //اگر تعداد قطعات جور شده برابر با کل تعداد قطعات شد
                //به عبارت بهتر اگر تمام قطعات جور شدند
                {
                    StatueText.text="You Win!";
                    //تکست باکس عبارت برنده شدن شما را نمایش می دهد
                    BackGround.alpha=1;
                    //مقدار آلفای تصویر پس زمینه یک می شود
                }
            }
            else
            //اگر مکان برخورد قطعه در هنگام رهایی موس ، روس آهنربای مخصوصش نبود
            {
                event.currentTarget.x=event.currentTarget._origX;
                //ایکس موس ، همان مقدار مشخصه ایکس سابقش (قبل از درگ ) می شود
                event.currentTarget.y=event.currentTarget._origY;
                //ایگرگ  قطعه ، همان مقدار مشخصه ایگرگ سابقش (قبل از درگ ) می شود
                //این دستورات برای بازگردانی قطعه به محل اولیه اش است .
            }
            
        }
        private function randomPosition(piece:*):void
        //متد نعیین مکان رندوم و تصادفی  قطعات در هنگام چیدمان
            {
                piece.x=Math.round(Math.random()*(400-piece.width));
                //ایکس قطعه بصورت رندوم از بین صفر تا 400منهای طول قطعه  تعیین شد
//تفریق 400 از طول قطعه به خاطر این بود که قطعات در جایی نیاستند که قسمتی از آنها 
//، روی کادر مربع میدان بیفتند
                piece.y=Math.round(Math.random()*(500-piece.height));
                //ایگرگ قطعه از بین صفر تا 500 تعیین شد
                //مستطیلی به طول 350 و عرض 500 در سمت چپ کادر کشیدیم
                // خواستیم مکان اولیه قطعات درون کادر این مستطیل باشد
                //در حقیقت مکان اولیه قطعات بصورت رندوم بین یک محدوده مستطیلی انتخاب شد
//تفریق 500 از عرض قطعه به خاطر این بود که قطعات در جایی نیاستند که قسمتی از آنها 
//، روی کادر مربع میدان بیفتند
                piece._origX=piece.x;
                //مقدار ایکس مکان قطعه ، پس از تعیین رندوم در مشخصه ایکسش قرار گرفت
                piece._origY=piece.y;
                //مقدارایگرگ مکان قطعه ، پس از تعیین رندوم در مشخصه ایگرگش قرار گرفت
            }
    }
}
[FONT=&quot]چون این کلاس ، کلاس اصلی کار راه انداز هست پس باید زیر کلاس اشیای نمایش مثل مووی کلیپ ها باشه . در این[/FONT][FONT=&quot] [/FONT][FONT=&quot]کلاس، هر کدوم از کلاسهای [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] و کلاس قطعات تکه های پازل[/FONT][FONT=&quot] ([/FONT][FONT=&quot]Dragable Pieces[/FONT][FONT=&quot]) [/FONT][FONT=&quot]رو [/FONT][FONT=&quot]import[/FONT][FONT=&quot] [/FONT][FONT=&quot] کردیم . بعد مشخصه هایی رو از نوع هرکدوم بوجود آوردیم تا در آینده ، نمونه ساخته شده با دستور [/FONT][FONT=&quot]new[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو در اونها قرر بدیم . دو مشخصه عددی تعریف کردیم . یکیش [/FONT][FONT=&quot]_[/FONT][FONT=&quot]TotalTrace [/FONT][FONT=&quot]هست و در اون ، تعداد کل قطعات که 9 تاست قرار می گیره و اون یکی [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CurrentTrace[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست و در اون تعداد قطعات در سر جای خودشون قرار گرفته تا به حال ، قرار می گیره و چون در ابتدا ، هیچ قطعه ای سر جاش نیست ، پس در کانسترکتور ، به این مشخصه مقدار صفر داده می شه . سپس کانسترکتور این کلاس رو می بینید که در اون ، آلفای تصویر کامل [/FONT][FONT=&quot] [/FONT][FONT=&quot]BackGround[/FONT][FONT=&quot]، صفر می شه تا در هدف دیده نشه . بعد هم متد [/FONT][FONT=&quot]createPieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] که از متد های این کلاسه ، اجرا می شه و این متد ، نقش اصلی طراحی های بازی رو داره . در متد [/FONT][FONT=&quot]createPieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] مشاهده کردید که یک یک نمونه های کلاسی قطعات قابل درگ ، ساخته شدند و تک تکشون به نمایش در اومدند . چون این قطعات ، نمونه های ساخته شده و زیر کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot]هستند ، پس مشخصه ها و متد های [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو به ارث بردند ، پس الان تعیین می کنیم که مشخصه آهنربای هر قطعه ، چه مووی کلیپی هست و همینطور مشخصه قطعه پازل هدف نهایی (قطعات درگ شده از فولدر [/FONT][FONT=&quot]Target Pieces[/FONT][FONT=&quot] [/FONT][FONT=&quot] ) کدوم قطعه هست و به تک تکشون در حال رهایی موس ، متد چک کردن هدف اختصاص داده شد تا وقتی که خواستیم موس رو از روی اونها رها کنیم ، متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]checkTarget[/FONT][FONT=&quot] [/FONT][FONT=&quot]چک کنه که آیا اونها به آهنربای خودشون برخورد کردند یا نه . سپس می بینید که برای تعیین مکان رندوم این قطعات در محدوده مستطیل سمت چپ ، اونها رو به متد دیگری تحت عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]randomPosition [/FONT][FONT=&quot]پاس دادیم . سپس متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]checkTarget[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو می بینید و در این متد ، با دستور شرطی چک می شه که آیا مووی کلیپ پاس داده شده به این متد ، به مشخصه آهنربای خودش برخورد کرده یا نه[/FONT][FONT=&quot] [/FONT][FONT=&quot][/FONT]
[FONT=&quot].[/FONT][FONT=&quot]”[/FONT][FONT=&quot]([/FONT][FONT=&quot]mc01. hitTestObject (mc01. _MagneticPoint)[/FONT][FONT=&quot])[/FONT][FONT=&quot]”[/FONT]
[FONT=&quot]hitTestObject[/FONT][FONT=&quot] [/FONT][FONT=&quot] متدی از متد های اصلی فلش هست که تعیین می کنه آیا مووی کلیپ بیرونیش به مووی کلیپ داخل پارامتر ورودیش برخورد فیزیک داشته (در محدوده مستطیلی[/FONT][FONT=&quot] [/FONT][FONT=&quot]( [/FONT][FONT=&quot]یا نه و این متد ، مقدار بولین [/FONT][FONT=&quot]true [/FONT][FONT=&quot] یا [/FONT][FONT=&quot]false[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو برمی گردونه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]اگر در شرط ، مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot]برگرده که یعنی قطعه به آهنرباش برخورد کرده . پس از برخورد و شرط [/FONT][FONT=&quot] [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot]، هر قطعه در مکان ایکس و ایگرگ قطعه هدفش[/FONT][FONT=&quot] ( [/FONT][FONT=&quot]Target Pieces[/FONT][FONT=&quot]--- [/FONT][FONT=&quot]_Goal[/FONT][FONT=&quot]) [/FONT][FONT=&quot]قرار می گیره . سپس دیگه متد هدف در حالت رهایی موس از روی اون ورداشته می شه و در نهایت ، متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]FunctionDisable [/FONT][FONT=&quot] که از کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] به هر قطعه به ارث رسیده ، در مورد هر قطعه به اجرا در می یاد و فراخوانی می شه و باعث می شه که عملکردهای کانسترکتوری کلاس [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] در مورد قطعه قرار گرفته سر جاش عملا صفر و غیر فعال شه . سپس یه واحد به مقدار عددی مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CurrentTrace[/FONT][FONT=&quot] [/FONT][FONT=&quot]اضافه می شه تا بگه تعداد قطعات جور شده ، یکی بیشتر شد . در انتهای این متد هم شرطی چک می شه که اگر مقدار عددی مشخصه تعداد قطعات پازل جور شده با تعداد کل قطعات برابر شدند ، مشخصه نوشته تکست باکس [/FONT][FONT=&quot]StatueText [/FONT][FONT=&quot] رو برابر با [/FONT][FONT=&quot]You Win![/FONT][FONT=&quot] [/FONT][FONT=&quot] کنه و آلفای تصویر کامل نهایی [/FONT][FONT=&quot]Backgroun [/FONT][FONT=&quot] رو یک کنه تا تصویر کامل به نمایش در بیاد . در غیر اینصورت وقتی قطعه به آهنربای هدفش برخورد نکرده باشه ، ایکسش ، مقدار مشخصه ایکس به ارث رسیده از [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot] می شه (ایکس سابقش ) و ایگرگش ، ایگرگ سابقش در[/FONT][FONT=&quot] ...[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در انتها ، شما متد [/FONT][FONT=&quot]randomPosition[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو مشاهده می کنید که این متد ، پارامتر ورودی از نوع هر نوع (*) رو می گیره (مووی کلیپ قطعات پازل قابل درگ ) و ایکس و ایگرگش رو بسته به مستطیل کادر سمت چپ و با کم کردن مقدار رندوم از طول و عرض خود قطعه ، بدست می یاره . این کم شدن واسه اونه که قطعات یخورده چپ تر برن و روی اضلاع مستطیل کادر چپ و کادر راست قرار نگیرند . پس از تعیین مکان رندوم هر قطعه ، ایکس و ایگرگ جدیدشون ، در مشخصه های ایکس و ایگرگ به ارث رسیده از کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]DragDrop[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار گرفت[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این مثال رو بهتر هم می شه کرد ، مثلا فرض کنین می شه به هر قطعه در کلاس [/FONT][FONT=&quot]DragDrop [/FONT][FONT=&quot]، مشخصه ای عددی رو اختصاص داد که اعداد یک تا چهار در اون قرار بگیره و مثلا با ترفند هایی می شه هر قطعه رو چرخوند[/FONT][FONT=&quot] ([/FONT][FONT=&quot]rotation(90)[/FONT][FONT=&quot]) [/FONT][FONT=&quot]و طبیعتا در تعیین مکان رندوم هر قطعه ، حالت رندومی هم برای چرخیدن هر قطعه تعیین می شه و در نهایت ، چرخش قطعه ها رو هم خواهیم داشت[/FONT][FONT=&quot]. [/FONT]
[FONT=&quot]از شما دوستان عزیز ، هر کس که بخواد می تونه به سان بازی خرگوش که [/FONT][FONT=&quot]Sizanjaved[/FONT][FONT=&quot] [/FONT][FONT=&quot] عزیز در بحث های قبل درست کرده بودند ، این مثال رو هم تغییر بده و اگه تغییرات قابل قبول شما عزیزان بود ، در همین تایپیک قرار بدین[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]فایل تمرین [/FONT][FONT=&quot]Lesson28-Game-Puzzle[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو دانلود کنید[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پایان بخش نهم[/FONT]

[FONT=&quot]بای...[/FONT]
 

پیوست ها

  • Lesson28-Game-Puzzle.rar
    604.3 کیلوبایت · بازدیدها: 802
  • Lesson28-Game-Picture.rar
    725.9 کیلوبایت · بازدیدها: 798
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 – درس بیست و نهم

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]
[FONT=&quot]آموزش بازی کارت[/FONT]
[FONT=&quot]درود و دو صد بدرود:wink:
[/FONT]
[FONT=&quot]امروز می خوام ساخت بازی دیگه ای با عنوان بازی کارتها رو براتون آموزش بدم که با مبحث کلاسها طراحی شده و این مثال رو ، من چند وقت پیش در سلسله سی دی های آموزش اکشن اسکریپت 3 که کاری از شرکت پارسیان افزار دیده بودم . پس تصمیم گرفتم کمی اونو تغییر بدم و آموزششو براتون بنویسم.[/FONT][FONT=&quot][/FONT]
[FONT=&quot]روش اجرای بازی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]پس از دانلود فایل تمرین [/FONT][FONT=&quot]Sample29-Card.rar[/FONT][FONT=&quot] [/FONT][FONT=&quot]و اجرای فایل [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card.swf[/FONT][FONT=&quot]خواهید دید که 12 پنجره به گونه ای کنار هم قرار گرفته اند و در هر کدوم تصویری از اتومبیل وجود داره . در واقع 6 تا تصویر ماشین داریم و از هر کدوم دو تا نمونه بوجود آوردیم و بصورت رندوم در این پنجره ها قرار دادیم و جمعا شد 12 تا تصویر [/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]


Pic01.jpg


[FONT=&quot]
[/FONT]
[FONT=&quot]سپس کاربر یکی از پنجره ها رو که در ابتدا بسته هستند کلیک می کنه و اون پنجره باز می شه و تصویرش دیده می شه . بعد کاربر کارت دومی رو کلیک می کنه و اون دومی هم باز می شه . اگه این دو تا عکس با هم یکی (جفت ) بودند ، دیگه اونا باز می مونند و کاربر ، بقیه عکس ها رو به این سبک باز می کنه . اگر هم یکی نبودند ، هر دو تا عکس بسته می شند . کاربر دو تا دو تا به این روال ادامه می ده تا کل عکس ها باز شند . هر بار که جفت عکس باز شند ، مقدار [/FONT][FONT=&quot]Match[/FONT][FONT=&quot] [/FONT][FONT=&quot] و هر بار که دو تا عکس ، جفت و مشابه نباشند ، مقدار [/FONT][FONT=&quot]Wrong[/FONT][FONT=&quot] [/FONT][FONT=&quot] در خروجی تریس می شه و در انتها که مسابقه رو بردید ، مقدار [/FONT][FONT=&quot]You Win![/FONT][FONT=&quot] [/FONT][FONT=&quot] تریس می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]تهیه ما یحتاج بازی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]برای تولید این بازی به 6 عکس اتومبیل با پیکسل بندی 190*260 پیکسل نیاز دارید که اونا رو در فایل [/FONT][FONT=&quot]Sample29-Pictures.rar[/FONT][FONT=&quot] [/FONT][FONT=&quot] می تونید دانلود کنید[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]همچنین نیاز به چهار تصویر تکه درهای بسته داشتیم که اونا رو هم در فتوشاپ تولید و وارد فلش کردیم . در نهایت همه اینها وارد فلش[/FONT][FONT=&quot] ([/FONT][FONT=&quot]import[/FONT][FONT=&quot] ) [/FONT][FONT=&quot]می شند. اسامی این تصاویر رو [/FONT][FONT=&quot] [/FONT][FONT=&quot]Pic01,Pic02 , … , Pic06[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار دادیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]منطق برنامه نویسی بازی[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این بازی تشکیل شده است از یک فایل سورس فلش [/FONT][FONT=&quot] [/FONT][FONT=&quot](fla)[/FONT][FONT=&quot] [/FONT][FONT=&quot]که در اون تمام مووی کلیپ ها و گرافیک ها و تصاویر رو قرار دادیم . همچنین تصاویر اتومبیل ها رو تک تک به مووی کلیپ تبدیل کردیم و اونا رو [/FONT][FONT=&quot] [/FONT][FONT=&quot]linkage[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا بهتر بگم [/FONT][FONT=&quot] [/FONT][FONT=&quot]export for actionscript[/FONT][FONT=&quot] [/FONT][FONT=&quot]کردیم . اسامی کلاسی [/FONT][FONT=&quot]export[/FONT][FONT=&quot] [/FONT][FONT=&quot] شده هم اینا هستند ، [/FONT][FONT=&quot]Pic01 , Pic02 , Pic03 , …Pic06[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]فایل بعدی یه فایل کلاسی هست به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card.as [/FONT][FONT=&quot]. [/FONT][FONT=&quot]در این فایل ، کلاسی به این اسم نوشته شده و این فایل رو زیر کلاس مووی کلیپ ها کردیم . سپس مووی کلیپی رو به این نام و در سورس فلش بوجود آوردیم تا از طریق همپوشانی مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]و کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card.as[/FONT][FONT=&quot] [/FONT][FONT=&quot]بتونیم عملیات واحدی رو پوشش بدیم . ما حصل این دو مقوله ، کارتی با پنجره بسته هست که وقتی روی اون کلیک می کنیم ، باز می شه و تصویر داخل اون نمایان می شه . فریمی رو با اسم فریمی [/FONT][FONT=&quot] [/FONT][FONT=&quot]flipback[/FONT][FONT=&quot] [/FONT][FONT=&quot]در اون داریم و هر وقت به اون فریم بریم و ادامه فریم ها رو پیمایش کنیم ، در ها دوباره بسته می شه و به اولین فریم این مووی کلیپ برمیگردیم. همچنین در این همپوشانی ، مشخصه ای با عنوان [/FONT][FONT=&quot]_type[/FONT][FONT=&quot] [/FONT][FONT=&quot]داریم و نوعش هم پیش فرض (از هر نوع - * ) هست تا تصاویر و مووی کلیپ هایی رو به اون پاس بدیم و اونا رو در یکی از مووی کلیپ های واقع در این مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]addChild[/FONT][FONT=&quot] [/FONT][FONT=&quot]کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]چون اندازه مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]خیلی بزرگ بود ، اونو با ابزار [/FONT][FONT=&quot]transform[/FONT][FONT=&quot] [/FONT][FONT=&quot]، کوچیک کردیم و در یه مووی کلیپ دیگه ای به اسم [/FONT][FONT=&quot]MainCard[/FONT][FONT=&quot] [/FONT][FONT=&quot] قرار دادیم و در حقیقت ما [/FONT][FONT=&quot]MainCard[/FONT][FONT=&quot] [/FONT][FONT=&quot] رو به اسم کلاسی [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]برای استفاده و همپوشانی در اکشن اسکریپت ، [/FONT][FONT=&quot] [/FONT][FONT=&quot]export[/FONT][FONT=&quot] [/FONT][FONT=&quot]کردیم . اسم نمونه ای مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]card[/FONT][FONT=&quot] [/FONT][FONT=&quot]داخل مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]MainCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو هم [/FONT][FONT=&quot]Inside [/FONT][FONT=&quot] گذاشتیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]این دستورات برای فایل کلاسی [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card.as[/FONT][FONT=&quot] [/FONT][FONT=&quot]است [/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot][/FONT]
PHP:
package//تعریف بسته
{
    import flash.display.MovieClip;//ورود کلاس مووی کلیپ
    import flash.events.MouseEvent;//ورود کلاس رویدادها
    public class Card extends MovieClip//تعریف کلاس یک کارت ها 
    //این کلاس ، زیر کلاس مووی کلیپ هاست
    {
        public var _type:*;//مشخصه ای از هر نوع برای پاس دادن  کلاس مووی کلیپ عکس ها
        public function Card():void//تعریف کانسترکتور کارت ، این تابع همیشه در ابتدای کار اجرا می گردد
                                    //در مورد هر نمونه کارت این متد همیشه اجرا می شود
        {
            this.buttonMode=true;
            //با لمس زیر کلاسها و نمونه های این کلاس ، حالت نشانگر موس ، به حالت دست تبدیل شد
            this.addEventListener(MouseEvent.CLICK,onClick);
            //در حالت کلیک ، تابع زیر به هر کارت اعمال شد
        }
        private function onClick(evt:MouseEvent):void//تابع کلیک
        {
            if(this.Inside.currentFrame==1)
            //اگر فریم مووی کلیپ کارت ما ، فریم اول بود
            {
                this.Inside.play();//می شود play مووی کلیپ کارتمان  
            }
            
        }
        
        public function setType(type:*):void
        //تابع قرار دادن مووی کلیپ تصویری در مشخصه نوع پیش فرض تایپ (ذخیره عکس ) 
        {
            _type=type;
            //مووی کلیپ تصویر پارامتر ورودی در مشخصه تایپ این کلاس قرار می گیرد
            Inside.loader_mc.addChild(_type);//هست loader_mc در کلاس مووی کلیپ کارد ، مووی کلیپی با نام نمونه ای 
            //مووی کلیپ تصویر پارامتر ورودی را در این مووی کلیپ برای نمایش قرار دادیم
        }
    }
}
[FONT=&quot]وقتی در این کلاس ما دستور [/FONT][FONT=&quot] [/FONT][FONT=&quot]this[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو می نویسیم ، در واقع به نمونه های ساخته شده از کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا مووی کلیپ های همپوشان [/FONT][FONT=&quot] [/FONT][FONT=&quot]export[/FONT][FONT=&quot] [/FONT][FONT=&quot]شده اشاره می کنیم . هر جایی هم که بخواهیم به مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]با اسم نمونه ای [/FONT][FONT=&quot] [/FONT][FONT=&quot]Inside[/FONT][FONT=&quot] [/FONT][FONT=&quot]دسترسی پیدا کنیم ، فقط کافیه با این دستور به اون دسترسی پیدا کنیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]
[FONT=&quot]this.Inside….[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثلا برای رفتن به فریم [/FONT][FONT=&quot] [/FONT][FONT=&quot]flipBack[/FONT][FONT=&quot] [/FONT][FONT=&quot]اون می نویسیم[/FONT][FONT=&quot]
[/FONT]

[FONT=&quot] :[/FONT][FONT=&quot][/FONT]

PHP:
this.Inside.gotoAndPlay("flipBack");

[FONT=&quot]بعد می تونیم به مووی کلیپ های داخلی اون از داخل کلاس [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot] دسترسی پیدا کنیم یا اونو کنترل کنیم . در این کلاس ، ما دستورات زیر رو به نمونه های ساخته شده از مووی کلیپ [/FONT][FONT=&quot]MainCard[/FONT][FONT=&quot] [/FONT][FONT=&quot] با اسم کلاسی [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot] دادیم[/FONT][FONT=&quot] :[/FONT][FONT=&quot][/FONT]

PHP:
package//تعریف بسته
{
    import flash.display.MovieClip;//ورود کلاس مووی کلیپ
    import flash.events.MouseEvent;//ورود کلاس رویدادهای موس
    import Card;//ورود کلاس کارد (کلاس همپوشان ) برای نمونه سازی
    import Pic01;//ورود کلاس تصویر 1
    import Pic02;//ورود کلاس تصویر 2
    import Pic03;//ورود کلاس تصویر 3
    import Pic04;//ورود کلاس تصویر 4
    import Pic05;//ورود کلاس تصویر 5
    import Pic06;//ورود کلاس تصویر 6
    public class MemoryGame extends MovieClip//تعریف کلاس اصلی زیر کلاس مووی کلیپ ها
    {
        private var _firstCard:*;//مشخصه کارت اول از هر نوع 
        //این مشخصه برای ذخیره اولین کارت باز شده در هر سری است
        private var _card:Card;//مشخصه کارت از نوع کلاس کارد
        private var _picture01:Pic01;//مشخصه تصویر از نوع تصویر شماره 1
        private var _picture02:Pic02;//مشخصه تصویر از نوع تصویر شماره 2
        private var _picture03:Pic03;//مشخصه تصویر از نوع تصویر شماره 3
        private var _picture04:Pic04;//مشخصه تصویر از نوع تصویر شماره 4
        private var _picture05:Pic05;//مشخصه تصویر از نوع تصویر شماره 5
        private var _picture06:Pic06;//مشخصه تصویر از نوع تصویر شماره 6
        private var _CardX:Number;//مشخصه عددی مکان ایکس کارت
        private var _CardY:Number;//مشخصه عددی مکان ایگرگ کارت
        private var _totalMatches:Number;//مشخصه عددی تعداد کل دفعات جور شدن کارتها
        private var _currentMatches:Number;//مشخصه عددی تعداد جفتهای جور شده تا به حال
        private var _cards:Array;//مشخصه آرایه برای نگهداری هر نمونه کارت 
        public function MemoryGame():void//تابع کانسترکتور
        {
            _cards=new Array();//آرایه نگهداری کارتها ساخته شد
            _totalMatches=6;//عدد شش در مشخصه تعداد کل ترازها قرار گرفت
            //چون قرار است 12 کارت در صحنه قرار بگیرند که دو به دو با هم مشابه باشند 
            //پس در کل 6 تراز جفت کارتها را می توانیم داشته باشیم
            _currentMatches=0;//عدد صفر در مشخصه تعداد کارتهای جور شده قرار گرفت
            createCards();//متد تولید کارت اجرا گشت
        }
        private function createCards():void
        //متد تولید کارتها
        {
            _CardX=20;//مشخصه اولیه مکان ایکس کارت ، مقدار 45 شد
            _CardY=20;//مشخصه اولیه مکان ایگرگ کارت ، مقدار 31 شد
            //این دو مشخصه برای نگهداری ایکس و ایگرگ اولین کارت تولید شده است تا 
            //ایکس و ایگرگ کارتهای بعدی را به نسبت این دو مشخصه بوجود بیاوریم.
            for (var i:Number=0;i<2;i++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 1
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture01=new Pic01();//تولید نمونه ای از کلاس تصویر اول
                _card.setType(_picture01);//نمونه بوجود آمده از کلاس تصویر بیت مپی یک ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }
            for (var j:Number=0;j<2;j++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 2
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture02=new Pic02();//تولید نمونه ای از کلاس تصویر دوم
                _card.setType(_picture02);//نمونه بوجود آمده از کلاس تصویر بیت مپی دو ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }            
            _CardX=20;//تغییر مقدار مشخصه ذخیره ایکس کارت
            _CardY+=_card.height+20;//قرار گیری مقدار ارتفاع کارت به اضافه 45 در مشخصه کارت
            //چون کارتهای جدید قرار است از مکان اولیه ایکس و پایینتر از مکان ایگرگ کارتهای اول چینش شوند پس 
            //ایکس اولیه  و ایگرگ اولیه به اضافه 45 در این مشخصات عددی قرار گرفت
            for (var k:Number=0;k<2;k++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 3
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture03=new Pic03();//تولید نمونه ای از کلاس تصویر سوم
                _card.setType(_picture03);//نمونه بوجود آمده از کلاس تصویر بیت مپی سه ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }
            for (var u:Number=0;u<2;u++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 4
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture04=new Pic04();//تولید نمونه ای از کلاس تصویر چهارم
                _card.setType(_picture04);//نمونه بوجود آمده از کلاس تصویر بیت مپی چهار ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }    
            _CardX=20;//تغییر مقدار مشخصه ذخیره ایکس کارت
            _CardY+=_card.height+20;//قرار گیری مقدار ارتفاع کارت به اضافه 45 در مشخصه کارت
            //چون کارتهای جدید قرار است از مکان اولیه ایکس و پایینتر از مکان ایگرگ کارتهای اول چینش شوند پس 
            //ایکس اولیه  و ایگرگ اولیه به اضافه 45 در این مشخصات عددی قرار گرفت
            for (var o:Number=0;o<2;o++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 5
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture05=new Pic05();//تولید نمونه ای از کلاس تصویر پنجم
                _card.setType(_picture05);//نمونه بوجود آمده از کلاس تصویر بیت مپی پنجم ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }
            for (var w:Number=0;w<2;w++)
            //دو بار این دستورات زیر اجرا می شود تا جفت کارتهای تصویر شماره 6
            //ساخته شده و در مکان رندوم مناسب قرار گیرند
            {
                _card=new Card();//تولید نمونه ای از کلاس کارت
                addChild( _card);//نمایش نمونه کارت
                _picture06=new Pic06();//تولید نمونه ای از کلاس تصویر ششم
                _card.setType(_picture06);//نمونه بوجود آمده از کلاس تصویر بیت مپی ششم ، به عنوان پارامتر ورودی متد جایگزینی نمونه ساخته شده از مووی کلیپ کارت اعمال شد
                _card.x=_CardX;//ایکس کارت در مشخصه ایکس کلاس کارت قرار گرفت
                _card.y=_CardY;//ایگرگ کارت در مشخصه ایگرگ کارت قرار قرار می گیرد
                _CardX+=_card.width+20;//طول افقی کارت به اضافه 50 در مشخصه ایکس کارت قرار گرفت
                _card.addEventListener(MouseEvent.CLICK, checkCards);//به کارت در حالت کلیک موس ، متد چک کننده کارت اعمال شد
                _cards.push(_card);//کارت ، در آرایه ذخیره کارتها ، ذخیره شد
            }    
            
            
            randomizeCards(_cards);//متد رندوم شدن جای کارتها با دریافت آرایه محجموعه کارتها ، اجرا شد
        }
        
        private function checkCards(event:MouseEvent):void//متد چک کردن درستی کارتها
        {
            event.currentTarget.removeEventListener(MouseEvent.CLICK,checkCards);//متد چک کردن کارتها ، در مورد کارتی که به این متد پاس داده شده حذف شد
            if(_firstCard==undefined)//اگر مشخصه کارت اول باز شده خالی بود و هیچ مقداری نداشت
            {
                _firstCard=event.currentTarget;//قرار گیری کارت پاس داده شده به مشخصه اولین کارت
            }
            else if (String(_firstCard._type)==String(event.currentTarget._type))//وگرنه اگر مشخصه رشته شده نوع کارت اول ، با مشخصه رشته شده شده نوع کارت پاس داده شده به این متد برابر باشد 
            {
                trace("Match!");//تریس می شود برابر
                _currentMatches++;//یک واحد به مشخصه عددی جمع ترازهای جفت شده تا به الان اضافه می شود
                if (_currentMatches>=_totalMatches)//اگر تعداد جفت کارتهای جور شده با تعداد کل جفت کارتها برابر باشد
                {
                    trace("You Win!!");//تریس می شود تو برنده شدی
                }
                _firstCard=undefined;//مشخصه کارت اول مقدارش خالی می شود (تعریف نشده )
            }
            else//وگرنه اگرمشخصه نوع رشته شده کارت پاس داده اول و دوم برابر نشد
            {
                trace("Wrong!");//تریس می شود اشتباه
                _firstCard.Inside.gotoAndPlay("flipBack");//کارت اول باز شده در مشخصه اولین کارت به فریمی می رود که با پلی شدنش از آنجا به عقب بر می گردد و بعد به فریم 1 می رود
                event.currentTarget.Inside.gotoAndPlay("flipBack");//کارت جدید پاس داده شده به فریمی می رود که به عقب برمیگردد
                _firstCard.addEventListener(MouseEvent.CLICK,checkCards);//متد چک کارت دوباره به کارت اول باز می گرد(در حالت کلیک ) موس
                event.currentTarget.addEventListener(MouseEvent.CLICK,checkCards);
                //به کارت پاس داده شده به این متد در حالت کلیک دوباره متد چک کارت داده می شود
                _firstCard=undefined;//مشخصه کارت اول مقدارش خالی و تعریف نشده می شود
            }
        }
        
        private function randomizeCards(Cards:Array ):void//متد رندوم کردن مکان کارتها
        {
            var randomCard1:Number;//مشخصه داخلی و محلی کارت رندوم اول
            var randomCard2:Number;//مشخصه داخلی و محلی کارت دوم برای رندوم کردن
            //این دو مشخصه برای اینست که از بین 1 تا 12 ، بصورت رندوم انتخاب شده و در اینها قرار گیرند 
            //سپس ایکس و ایگرگ کارتهای پاس داده شده به آرایه ذخیره کارتها ، به شماره درایه این دو  مشخصه عددی با هم جابجا می شوند
            var card1X:Number;//مشخصه داخلی و محلی ایکس کارت اول
            var card1Y:Number;//مشخصه داخلی و محلی ایگرگ کارت اول
            //این  دو مشخصه برای ذخیره ایکس و ایگرگ  یکی از کارتهای نقلی است 
            for(var e:Number = 0;e < 40 ; e++)//چهل بار اعمال زیر انجام می گیرند
            //در حقیقت دستورات زیر برای بر زدن کارتها جهت جابجایی مکانشان است
            {
                 randomCard1=Math.floor(Math.random()* Cards.length);
                 //تعیین شماره ای رندوم از بین 0 تا تعداد کل کارتها برای کارت 1
                 randomCard2=Math.floor(Math.random()* Cards.length);
                 //تعیین شماره ای رندوم از بین 0 تا تعداد کل کارتها برای کارت 2
                 card1X= Cards[randomCard1].x;
                 //دسترسی به  مکان ایکس کارتی که در شماره درایه رندوم اول قرار گرفته و ایکسش در مشخصه ذخیره ایکس قرار می گیرد
                 card1Y= Cards[randomCard1].y;
                 //دسترسی به مکان ایگرگ کارتی که در شماره درایه آرایه ذخیره کارتها به شماره رندوم دوم قرار گرفته و مکان ایگرگش را در مشخصه مکان ایگرگ قرار دادیم
                 Cards[randomCard1].x=Cards[randomCard2].x;//جابجایی ایکس کارت تصادفی دوم به ایکس کارت تصادفی اول تصادفی در آرایه
                 Cards[randomCard1].y=Cards[randomCard2].y;//جابجایی ایگرگ کارت تصادفی دوم به ایگرگ کارت تصادفی اول در آرای ذخیره
                 Cards[randomCard2].x=card1X;//جابجایی ایکس با جایگزینی از متغیر ایکس ها ( زاپاس )  این مشخصه حالت نقلی دارد 
                 Cards[randomCard2].y=card1Y;//جابجایی با ایگرگ متغیر ایگرگ ها (مشخصه زاپاس )   این مشخصه حالت نقلی درد
            }
        }
    }
}
[FONT=&quot]اگه موس روی نمونه های ساخته شده از این کلاس قرار بگیره ، نشانه موس ، به دست تبدیل می شه ، در حالت کلیک بر روی این نمونه ها ، متد [/FONT][FONT=&quot]onClick[/FONT][FONT=&quot] [/FONT][FONT=&quot] اجرا می شه . در این متد گفته شد که اگر فریم کنونیت ، اولین فریم بود ، تا اونجایی که [/FONT][FONT=&quot] [/FONT][FONT=&quot]stop[/FONT][FONT=&quot] [/FONT][FONT=&quot]نشدی ، [/FONT][FONT=&quot]play[/FONT][FONT=&quot] [/FONT][FONT=&quot] شو . یه متدی هم براش تعریف کردیم و یه ورودی از هر نوع رو می پذیره و اونو در مشخصه [/FONT][FONT=&quot]_type[/FONT][FONT=&quot] [/FONT][FONT=&quot]که از هر نوع هست ، قرار می ده . بعد ، اون ورودیه رو در مووی کلیپ با نام نمونه ای [/FONT][FONT=&quot]Inside[/FONT][FONT=&quot] [/FONT][FONT=&quot] و در داخلش ، در مووی کلیپ [/FONT][FONT=&quot]loader_mc [/FONT][FONT=&quot] که مووی کلیپ مستطیل سفید رنگی با پیکسل بندی اندازه تصاویر (190*260[/FONT][FONT=&quot] [/FONT][FONT=&quot])[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست ، قرار می ده تا به نمایش در بیان[/FONT][FONT=&quot].[/FONT][FONT=&quot][/FONT]
[FONT=&quot]در پایان ، ما یه فایل کلاس با نام [/FONT][FONT=&quot]MemoryGame[/FONT][FONT=&quot] [/FONT][FONT=&quot] طراحی کردیم و این فایل ، نقش یک کلاس اصلی کار راه انداز سورس رو بازی می کنه و باید زیر کلاس اشیای نمایش مثل [/FONT][FONT=&quot]MovieClip[/FONT][FONT=&quot] [/FONT][FONT=&quot] ها باشه . در این فایل ، ما کلاس همپوشان [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot] و مووی کلیپ های اکسپورت شده (کلاس شده ) رو وارد کردیم[/FONT][FONT=&quot] .([/FONT][FONT=&quot]import[/FONT][FONT=&quot])[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه ای از نوع پیش فرض[/FONT][FONT=&quot] (*)[/FONT][FONT=&quot] [/FONT][FONT=&quot]با نام [/FONT][FONT=&quot]_firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot] طراحی کردیم تا وقتی هر بار ، بر روی اولین کارتها کلیک کردیم ، اونو در این مشخصه ذخیره کنیم تا با کلیک بر روی دومین کارتها در هر سری ، بتونیم اونو با این کارت ، مقایسه کنیم . اگر این مشخصه خالی باشه ، مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]undefined[/FONT][FONT=&quot] [/FONT][FONT=&quot]یا تعریف نشده رو در خود می گیره . مشخصه هایی رو از نوع مووی کلیپ همپوشان [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot] و 6 مووی کلیپ تصویر بوجود آوردیم . همچنین دو مشخصه عددی با عناوین [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardX[/FONT][FONT=&quot] [/FONT][FONT=&quot]و [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardY[/FONT][FONT=&quot] [/FONT][FONT=&quot]بوجود آوردیم و کار اونها هم نگهداری مکان ایکس و ایگرگ کارتهای بعدی ، در چینش اولیه کارتها هست[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مشخصه عددی با عنوان [/FONT][FONT=&quot]_[/FONT][FONT=&quot]totalMatches[/FONT][FONT=&quot] [/FONT][FONT=&quot]بوجود آوردیم تا تعداد حداکثر جفت شدنها که 6 جفت جور شده هست ، در خود ذخیره کنه و مشخصه عددی دیگه ای رو با عنوان [/FONT][FONT=&quot] [/FONT][FONT=&quot]_[/FONT][FONT=&quot]currentMatches[/FONT][FONT=&quot] [/FONT][FONT=&quot]بوجود آوردیم تا تعداد جفت کارتهای مشابه و جور شده تا حالا رو در خود نگه داره و قطعا مقدار اولیه اون ، در کانسترکتور ، 0 است . مشخصه دیگه ای رو به اسم [/FONT][FONT=&quot]_[/FONT][FONT=&quot]cards[/FONT][FONT=&quot] [/FONT][FONT=&quot]و از نوع آرایه بوجود آوردیم تا هر کارت بوجود اومده رو در اون قرار بدیم تا به راحتی بتونیم به اونها دسترسی داشته باشیم و اونا رو کنترل و جابجا کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]در کانسترکتور ، مقادیر ذکر شده در مشخصه ها قرار گرفتند و نمونه ای از آرایه ساخته شد و در مشخصه آرایه قرار گرفت و تابع شروع کننده بعدی با نام [/FONT][FONT=&quot]createCards[/FONT][FONT=&quot] [/FONT][FONT=&quot] و برای چینش اولیه کارتها ، اجرا شد . در این متد ، مکان اولیه ایکس و ایگرگ کارتها در مشخصه های [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardX[/FONT][FONT=&quot] [/FONT][FONT=&quot]و [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardY[/FONT][FONT=&quot] [/FONT][FONT=&quot]قرار گرفتند . سپس 6 بار حلقه دو تایی اجرا می شه و در هر حلقه (که هر حلقه دو بار اجرا می شه ) دو بار ، نمونه ای از مووی کلیپ همپوشان کارت ساخته می شه و به نمایش در می یاد و در هر سری از 6 سری ، نمونه هایی از مووی کلیپ تصویر ها ساخته می شه و این تصویر با متد [/FONT][FONT=&quot]_setType[/FONT][FONT=&quot] [/FONT][FONT=&quot]، به پارامتر ورودی این متد پاس داده می شه و در واقع ، این متد هست که مووی کلیپ تصویر رو به مشخصه [/FONT][FONT=&quot]_type[/FONT][FONT=&quot] [/FONT][FONT=&quot]نمونه ساخته شده از کلاس [/FONT][FONT=&quot] [/FONT][FONT=&quot]Card[/FONT][FONT=&quot] [/FONT][FONT=&quot]پاس می ده و اون هم ، تصویر رو در مووی کلیپ [/FONT][FONT=&quot]loader_mc[/FONT][FONT=&quot] [/FONT][FONT=&quot] اضافه می کنه و به نمایش در می یاره . ایکس و ایگرگ هر کارت به وسیله مشخصه های [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardX[/FONT][FONT=&quot] [/FONT][FONT=&quot]و [/FONT][FONT=&quot]_[/FONT][FONT=&quot]CardY[/FONT][FONT=&quot] [/FONT][FONT=&quot]تعیین می شه و هر بار ، به اندازه مناسبی به این دو مشخصه اضافه می شه تا کارت های بعدی ، در مکان مناسب بعدی قرار بگیرند . سپس هر نمونه ساخته شده از کلاس کارد ، به آرایه ذخیره کارتها پاس داده می شه و در نهایت ، در مورد هر کدوم از کارد های ساخته شده ، وقتی که این نمونه با موس کلیک شد ، متدی به اسم [/FONT][FONT=&quot] [/FONT][FONT=&quot]checkCards[/FONT][FONT=&quot] [/FONT][FONT=&quot]اجرا می شه [/FONT][FONT=&quot]. [/FONT][FONT=&quot]در پایان این دستورات ، متد اصلی دیگری به اسم [/FONT][FONT=&quot]randomizeCards[/FONT][FONT=&quot] [/FONT][FONT=&quot] و با گرفتن پارامتر آرایه مجموعه کارتها ، اجرا می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]متد [/FONT][FONT=&quot]checkCards[/FONT][FONT=&quot] [/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]در ابتدا ، متد [/FONT][FONT=&quot] [/FONT][FONT=&quot]checkCards[/FONT][FONT=&quot] [/FONT][FONT=&quot]رو در حالت کلیک موس بر روی نمونه پاس داده شده به این متد و در حالت کلیک موس ، حذف می کنه و بعد تست می کنه که آیا مشخصه کارت اول یا [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]خالی هست یا نه .اگر خالی باشه که یعنی مقدارش [/FONT][FONT=&quot] [/FONT][FONT=&quot]undefined[/FONT][FONT=&quot] [/FONT][FONT=&quot]هست و در سری باز کردن جفت کارت ها ، اولین سری هست ، پس نمونه کارد پاس داده شده به این متد ، در مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot] قرار داده می شه . در صورتی که مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]خالی نباشه ، یعنی اینکه این کارد در این سری از باز کردن جفت کارتها ، دومین کارد باز شده هست پس با یک شرط ، تست می شه که آیا اسم کلاس مووی کلیپ پاس داده شده به مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]type[/FONT][FONT=&quot] [/FONT][FONT=&quot]کارت پاس داده شده به مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]، با اسم کلاس مووی کلیپ دومی که این بار به این متد پاس داده شده برابر هست یا نه . به بیان بهتر با متد [/FONT][FONT=&quot]String[/FONT][FONT=&quot] [/FONT][FONT=&quot]، اسم کلاسی هر نمونه از مووی کلیپ [/FONT][FONT=&quot] [/FONT][FONT=&quot]export[/FONT][FONT=&quot] [/FONT][FONT=&quot]شده ، (مثل [/FONT][FONT=&quot]Pic01, Pic02, …,Pic06[/FONT][FONT=&quot] [/FONT][FONT=&quot] ) در می یاد . برای درک بهتر این قضیه ، به درس بیست و هفتم مراجعه کنید . اگر نتیجه این تست ، [/FONT][FONT=&quot] [/FONT][FONT=&quot]true[/FONT][FONT=&quot] [/FONT][FONT=&quot]بود که یعنی نوع تصویر هر دو کارت اول و دوم در هر سری ، برابر هست ، پس مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]match[/FONT][FONT=&quot] [/FONT][FONT=&quot]تریس می شه و یک واحد به مقدار مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]currentMatches[/FONT][FONT=&quot] [/FONT][FONT=&quot]اضافه می شه (تعداد جفت کارت های باز شده و تثبیت شده ) . در این شرایط هست که اگه تعداد برد های جفت شده تا حالا برابر تعداد حد اکثر برد ها شد که 6 تا است[/FONT][FONT=&quot] (_[/FONT][FONT=&quot]totalMatches[/FONT][FONT=&quot]) [/FONT][FONT=&quot]مسابقه به پایان رسیده و مقدار رشته [/FONT][FONT=&quot] [/FONT][FONT=&quot]You Win![/FONT][FONT=&quot] [/FONT][FONT=&quot]تریس می شه . در پایان این شرط ، مقدار مشخصه کارت اول یا [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]خالی می شه تا اگه بازی جریان داشته باشه و هنوز تموم نشده باشه ، کارت اولی بعدی در این مشخصه قرار بگیره . ولی در شرایط کلی ، با برابر نبودن اسم کلاسی مشخصه های [/FONT][FONT=&quot]_type[/FONT][FONT=&quot] [/FONT][FONT=&quot]در هر دو کارت باز شده ، مقدار [/FONT][FONT=&quot] [/FONT][FONT=&quot]Wrong[/FONT][FONT=&quot] [/FONT][FONT=&quot]تریس می شه و کارت اول واقع در مشخصه [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]به فریم [/FONT][FONT=&quot]flipBack[/FONT][FONT=&quot] [/FONT][FONT=&quot] می ره تا حالت برگشتی داشته باشه (و در هاش دوباره بسته شه ) و همچنین کارت دومی پاس داده شده به این متد ، به بلای کارت اول دچار می شه و دوباره به هر دو کارت ، متد چک کردن کارد ها[/FONT][FONT=&quot] ([/FONT][FONT=&quot]checkCards[/FONT][FONT=&quot]) [/FONT][FONT=&quot]که حذف شده بودند ، در حالت کلیک موس اضافه می شه و دوباره مقدار مشخصه کارت اول یا همون [/FONT][FONT=&quot]_[/FONT][FONT=&quot]firstCard[/FONT][FONT=&quot] [/FONT][FONT=&quot]خالی می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]متد [/FONT][FONT=&quot]randomizeCards[/FONT][FONT=&quot] :[/FONT][FONT=&quot] [/FONT][FONT=&quot][/FONT]
[FONT=&quot]کار این متد در واقع ، بر زدن اولیه کارتها بصورت رندوم و جابجایی تصادفی اونها و در ابتدای مسابقه است . دو مشخصه محلی و داخلی در این متد و از نوع عددی تعریف کردیم با نامهای [/FONT][FONT=&quot] [/FONT][FONT=&quot]randomCard1[/FONT][FONT=&quot] [/FONT][FONT=&quot]و [/FONT][FONT=&quot]randomCard2[/FONT][FONT=&quot] [/FONT][FONT=&quot] و عدد تصادفی بین صفر تا 11 تعیین می شه (طول آرایه 12 است و با اون دستور رندوم ، عددی بین 0 تا 11 تعیین می شه) در اونها قرار می گیره .این اعداد برای دسترسی تصادفی به شماره درایه های (خانه های ) آرایه ذخیره کارتها با تصاویر مختلف است تا به تصادف ، دو کارت رو از شماره های تصادفی درایه های آرایه ذخیره کارتها پیدا کنیم و اونا رو با هم جابجا کنیم . (فراموش نکنید که شماره اولین خانه آرایه همیشه 0 است ) سپس دو مشخصه عددی و محلی دیگه با نامهای [/FONT][FONT=&quot]card1X[/FONT][FONT=&quot] [/FONT][FONT=&quot] و [/FONT][FONT=&quot]card1Y[/FONT][FONT=&quot] [/FONT][FONT=&quot] در این متد تعریف کردیم تا به عنوان حافظه زاپاس عمل کنه . این دو مشخصه برای ذخیره مکان ایکس و ایگرگ کارتی هست که قرار هست جابجا بشه و ایکس و ایگرگش ، با ایکس و ایگرگ کارت دوم برابر بشه و ایکس و ایگرگ کارت دوم هم با مقادیر این مشخصه ها ، تنظیم و برابر می شه . استفاده از این مشخصه ها برای اینه که وقتی مکان یکی از کارتها قرار هست عوض بشه ، مکان قبلیش باید در اینا قرار بگیره تا از بین نره و کارت بعدی هم با این مقادیر ، جایگزین شه و به مکان سابق این کارت اول بره . برای اینکه بر زنی کارتها تصادفی تر بشه و خیلی تصادفی تر بشه ، ما در متد [/FONT][FONT=&quot]randomizeCards[/FONT][FONT=&quot] [/FONT][FONT=&quot] ، شصت بار عمل جابجایی تصادفی رو تکرار کردیم و می تونیم کمتر یا بیشتر ، این کار رو انجام بدیم و هر چه بیشتر این کار روانجام بدیم ، بر زدن ، تصادفی تر می شه و پراکندگی ها بیشتر می شه[/FONT][FONT=&quot] .[/FONT][FONT=&quot][/FONT]
[FONT=&quot]مثال رو دانلود کنید و از اون لذت ببرید[/FONT][FONT=&quot] ...[/FONT][FONT=&quot][/FONT]
[FONT=&quot]هر وقت از زندگی و آموزش خسته شدید یه نگاهی به امضای من بندازید تا امید و انگیزه بگیرید[/FONT][FONT=&quot]...[/FONT]
[FONT=&quot]پایان بخش دهم
[/FONT]

بای...
[FONT=&quot][/FONT][FONT=&quot][/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]

 

پیوست ها

  • Sample29-Pictures.rar
    207.5 کیلوبایت · بازدیدها: 687
  • Sample29-Card.rar
    338.6 کیلوبایت · بازدیدها: 867
آخرین ویرایش:

++Hadi++

Active Member
آموزش اکشن اسکریپت 3 – درس سی ام

[FONT=&quot]بسم الله الرحمن الرحیم[/FONT]
[FONT=&quot]نکات الحاقی و پیشرفته کلاسها و پایان اولین دوره بحث شی گرایی [/FONT]
[FONT=&quot]سلام بر همه دوستان محترم و فرخنده و خجسته ام :lol:[/FONT]
[FONT=&quot]یه خسته نباشید به همه شما سرورانی که تا به الان ، بحث شی گرایی رو درست ، همراه با مثالها دنبال کردید می گم . امروز قصد دارم آخرین مبحث آموزشی بحث شی گرایی رو بگم و در این تایپیک از خدمت شما ، مرخص شم و این تایپیک رو به دست صاحبخونش یعنی آقا جواد عزیز تحویل بدم. تشکر می کنم از آقا جواد که مسبب یه همچین حرکت خوبی شدند تا ما هم دین خودمون رو در قبال دوستان عزیز ادا کنیم . ما سعی کردیم هر چه کاملتر و بهتر و به زبان ساده تر ، مبحث شی گرایی رو آموزش بدیم ، قطعا هر کاری ، اشکالاتی رو در بر داره و آموزش ما هم از این امر مبرا نبوده .[/FONT]
[FONT=&quot]در این جلسه راجع به نکات پیشرفته تر و اضافی تر بحث کلاسها صحبت می کنیم ، ولی این به اون معنی نیست که بحث کلاسها دیگه تموم شده ، اگر نفسی برای ما بود و توفیقی از برای خدمت گزاری ، بر می گردیم و بحث های پیشرفته تر کلاسها رو مثل مباحث [/FONT][FONT=&quot]interface , implement , namespace , …[/FONT][FONT=&quot]می گیم . در ضمن ، تمامی مباحث درس سی ام فقط و فقط منحصر به شی گرایی نیست ولی لازم دیدم بگم تا اگه در سایتای خارجی به موارد خاصی برخوردید ، جا نزنید[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]بحث ها رو نکته به نکته پی می بریم[/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]نکته شماره 1[/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]همونطوری که بهتون گفته بودم ، اگر در تعریف یک کلاس یا یک مشخصه یا متد ، عبارات دسترسی [/FONT][FONT=&quot]public [/FONT][FONT=&quot]یا [/FONT][FONT=&quot]private[/FONT][FONT=&quot] یا [/FONT][FONT=&quot]protected[/FONT][FONT=&quot]رو استفاده نکنیم ، کامپایلر اکشن اسکریپت 3[/FONT][FONT=&quot]، خود به خود اونو از نوع [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] حساب می کنه ، خوب راه دیگه برای تعریف اشیای [/FONT][FONT=&quot]internal[/FONT][FONT=&quot]اینه که به سبک استفاده از اشیای [/FONT][FONT=&quot]public , private , protected[/FONT][FONT=&quot] ، قبل از تعریف این اشیا ، عبارت[/FONT][FONT=&quot]internal[/FONT][FONT=&quot]رو بنویسیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 2[/FONT][FONT=&quot] : [/FONT]
[FONT=&quot]همونطوری که در جلسات اولیه گفتیم ، در زبانهایی مثل [/FONT][FONT=&quot]C++[/FONT][FONT=&quot] و[/FONT][FONT=&quot]C#[/FONT][FONT=&quot]، ما می تونیم دو یا چند کانسترکتور رو در یک کلاس تعریف کنیم ، با یک اسم و اونم اسم کلاس ، تنها تفاوت این کانسترکتور ها ، در تعداد و نوع پارامتر های ورودی هست که می گیرند [/FONT][FONT=&quot].[/FONT][FONT=&quot]همچنین گفتیم که در ساختار درونی بدنه این کلاسها ، در اکشن اسکریپت 3 ، عملا و در شرایط معمول ، این کار امکانپذیر نیست (البته یه سری راهها در [/FONT][FONT=&quot]adobe Flex[/FONT][FONT=&quot] و ... هست ولی آنچنان مهم تلقی نمی شه ) ، امروز راهی رو بهتون می گم که می تونیم کاری شبیه به این رو انجام بدیم (البته نه خیلی منعطف) و این روش ، مقدار دهی پیش فرض به پارامتر های ورودی یک متد (تابع ) کانسترکتور یا هر متد دیگری هست . یعنی وقتی یک متد رو تعریف می کنیم ، کافیه وقتی در پرانتز و در حین تعریف پارامتر های ورودی اون ، بعد از تعریف هر پارامتر ، یه علامت (=) قرار بدیم و مقدار پیش فرض رو بعد از پرانتز بنویسیم. در این شرایط اگر بعد از نمونه سازی از کلاس یا بعد از فراخوانی متد یا تابع مد نظر ، پارامتر ورودی رو وارد کردیم ، این پارامتر وارد می شه و اثر مطلق خودش رو می گذاره ، یعنی مثلا اگه قراره این پارامتر ، در مشخصه ای قرار بگیره یا به محاسبه یا متد دیگری پاس بشه ، اثر کامل و معمول خودش رو می گذاره ولی اگر ما در فراخوانی اون تابع ، پارامتر ورودی خاصی رو ننویسیم ، اون متد ، مقدار پیش فرض خودش رو ، خواه نا خواه اعمال می کنه (همون مقداری که در تعریف تابع و بعد از = نوشته شده.)[/FONT]
[FONT=&quot]
Pic01.gif
[/FONT]

[FONT=&quot]پس وقتی ما تابعی رو داریم که چند مقدار رو در ترتیبی خاص ، با انواع مختلف و به عنوان ورودی می گیره ، باید سعی کنیم پارامتر های ورودی رو به همون ترتیبی بدیم که اونا رو در تابع ، به عنوان پارامتر ورودی نوشته ایم و اگر قرار باشه مثلا آخرین پارامتر ورودی (در ترتیب پارامتر ها ) رو مقدار دهی کنیم و به بقیه دست نزنیم (تا پیش فرض باشند) ، مجبوریم یک بار به همه ورودی های قبلی (ترتیب ورودی ) مقدار دهی کنیم . این روند ، موجب می شه تا دستمون در تعداد پارامتر های ورودی بازتر بشه و مثلا پارامتر هایی رو که زیاد مهم نیستند و به احتمال قوی ، مقدار ورودی کاربر رو می دونیم ، بصورت پیش فرض وارد کنیم و اونها رو جزء آخرین رده از ورودی ها در ترتیب قرار گیری پارامتر های ورودی در نظر بگیریم تا ما یا کاربران دیگه ، فقط در شرایط خاص مجبور به مقدار دهی اونها ( و به فراخورش ، مقدار دهی به تمامی پارامتر های قبلیش ) باشیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 3[/FONT][FONT=&quot]: [/FONT]
[FONT=&quot] ما می تونیم یک کلاس رو مقطوع النسل کنیم ، یعنی کاری کنیم که دیگه نشه کلاس دیگری رو زیر کلاس اون کرد . به همین روش می تونیم متدی رو در یک کلاس مادری تعریف کنیم و کاری کنیم که دیگه نشه در کلاسهای فرزندی (زیر کلاسهای مادر ) اون متد رو با متد همنام جدیدی [/FONT][FONT=&quot]Override[/FONT][FONT=&quot]کرد . این روش ، استفاده از دستور [/FONT][FONT=&quot]final[/FONT][FONT=&quot]هست و [/FONT][FONT=&quot]syntax[/FONT][FONT=&quot] اون به قرار زیر هست[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
Pic02.gif
[/FONT]

[FONT=&quot]چنانچه بعد از استعمال این دستور ، بخواهیم متد فاینال شده رو ، [/FONT][FONT=&quot]Override[/FONT][FONT=&quot] کنیم یا کلاس فاینال شده رو کلاس مادر یک کلاس دیگر کنیم (با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot]، به خطای کامپایل بر می خوریم[/FONT][FONT=&quot] . [/FONT][FONT=&quot])[/FONT]
[FONT=&quot]نکته شماره 4[/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]ما می تونیم از یک متد ، به عنوان یک مشخصه استفاده کنیم و راه اون هم ، استفاده از دستور [/FONT][FONT=&quot]get[/FONT][FONT=&quot]و [/FONT][FONT=&quot]set[/FONT][FONT=&quot] هست[/FONT][FONT=&quot] .[/FONT][FONT=&quot]فرض کنید که می خواهیم یه متد تعریف کنیم و با سیستم مقدار دهی به مشخصه های معمولی ، پارامتر ورودی به اون پاس بدیم (بدون استفاده از دو پرانتز باز و بسته) و به سیستم معمول مشخصه ها ، پارامتر خروجی اونو در محاسبات و معادلات مختلف قرار بدیم[/FONT][FONT=&quot] :[/FONT]
Pic03.gif

[FONT=&quot]در این حالت ما می تونیم یک متد رو دو بار تعریف کنیم و یک بار اونو با دستور [/FONT][FONT=&quot]set[/FONT][FONT=&quot] و بار دیگر با دستور [/FONT][FONT=&quot]get[/FONT][FONT=&quot]تعریف کنیم و در حالت [/FONT][FONT=&quot]set[/FONT][FONT=&quot]، خروجی اون نوع [/FONT][FONT=&quot]void[/FONT][FONT=&quot]می شه (بدون خروجی ) و یک پارامتر ورودی رو می گیره و در مشخصه ای خاص (واقع در کلاس ) اونو جایگزین می کنه . در حالت [/FONT][FONT=&quot]get[/FONT][FONT=&quot] هم ، نوع متد ، از نوع مشخصه ای می شه که با دستور [/FONT][FONT=&quot]return[/FONT][FONT=&quot] اونو برمی گردونه و در این حالت ، متد ، هیچ ورودی رو نداره و در انتهای این حالت ، با دستور [/FONT][FONT=&quot]return[/FONT][FONT=&quot]، مشخصه ای خاص برگردونده می شه . پس از نمونه سازی از این کلاس ، اگه نمونه ساخته شده از کلاس رو بنویسیم و نقطه بگذاریم و بعد از نقطه ، اسم متدی رو که با استفاده از دستور [/FONT][FONT=&quot]set[/FONT][FONT=&quot] تعریف کردیم بنویسیم و در انتها ، علامت مساوی (=) قرار بدیم و مقداری رو از جنس پارامتر ورودیش ، بعد از علامت مساوی قرار بدیم ، در واقع کاری که کردیم اینه که مقدار دهی ورودی اون متد رو به روش مشخصه ها انجام دادیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]در حالتی هم که از دستور متد [/FONT][FONT=&quot]get[/FONT][FONT=&quot]شده ، به عنوان متغیری استفاده کنیم که در محاسبات نقش نماینده یه عدد رو بازی کنه ، عملی که انجام می گیره اینه که اسم متد [/FONT][FONT=&quot]get[/FONT][FONT=&quot] ، نقش مقدار مشخصه [/FONT][FONT=&quot]return[/FONT][FONT=&quot]شده رو بازی می کنه . توجه داشته باشید که یه متد رو هم می تونیم فقط از نوع [/FONT][FONT=&quot]get [/FONT][FONT=&quot] یا [/FONT][FONT=&quot]set[/FONT][FONT=&quot]تعریف کنیم و هم می تونیم از هر دو نوع تعریف کنیم (دو متد همنام که یکی [/FONT][FONT=&quot]get[/FONT][FONT=&quot]هست و دیگری [/FONT][FONT=&quot]set[/FONT][FONT=&quot] ) بارزترین خصوصیت استفاده از دو دستور [/FONT][FONT=&quot]get[/FONT][FONT=&quot]و [/FONT][FONT=&quot]set[/FONT][FONT=&quot]در یک متد اینه که در فراخوانی و مقدار دهی یا استفاده خواندنی (برگردانی مقدار ) اون متد دیگه نیازی به پرانتز باز و بسته نیست[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 5[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]ما می تونیم در یک فایل کلاسی ، بیش از یک کلاس رو تعریف کنیم ، در این حالت اولین روش اینه که یک کلاس رو در داخل بسته فایل کلاسی نوع [/FONT][FONT=&quot].as[/FONT][FONT=&quot]و از نوع [/FONT][FONT=&quot]public [/FONT][FONT=&quot] تعریف می کنیم و الباقی کلاسها رو بیرون از بسته و بصورت [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] و به روش زیر تعریف می کنیم ، در اصطلاح ، به کلاس اصلی که در داخل بسته تعریف شده ، کلاس اصلی و به کلاس هایی که بیرون از بسته تعریف شده اند ، کلاسهای همسایه یا [/FONT][FONT=&quot]Neighbor Class [/FONT][FONT=&quot] یا کلاسهای کمکی خارجی[/FONT][FONT=&quot] ([/FONT][FONT=&quot]external helper classes[/FONT][FONT=&quot]) [/FONT][FONT=&quot]گفته می شه . دقت کنید که اگر قرار هست کلاس داخل بسته و یا کلاسهای بیرون از بسته ، از یک یا چند کلاس دیگه در جهت گیری نمونه سازی و یا ارث بری ، استفاده کنند ، باید تمامی اونهایی رو که در داخل بسته نیاز هستند با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot]، داخل بسته وارد کنیم و اونهایی که در کلاسهای همسایه (بیرون از بسته ) نیاز هستند ، در بیرون از بسته با دستور [/FONT][FONT=&quot]import[/FONT][FONT=&quot] وارد کنیم ، اگر هم کلاسی بصورت مشترک هم در کلاس اصلی داخل بسته و هم در کلاسهای همسایه خارج از بسته نیاز هست ، باید اونو یک بار در داخل بسته و یک بار بیرون از بسته وارد کنیم[/FONT][FONT=&quot] :[/FONT]
Pic04.gif

[FONT=&quot]نکته ای که لازم به ذکر هست اینه که از کلاس اصلی داخل بسته ، می تونیم بیرون از این فایل کلاسی استفاده کنیم ولی از کلاسهایی که بیرون از بسته تعریف شدند (همسایه) نمی تونیم بیرون از فایل کلاسی مذکور استفاده کنیم . همچنین از کلاسهای همسایه ، می تونیم فقط در داخل کلاس اصلی داخل بسته یا کلاسهای همسایه دیگر واقع در همون فایل کلاسی ، استفاده و نمونه سازی کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]همچنین کلاسهای همسایه خارج از بسته رو فقط می تونیم از نوع [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] تعریف کنیم چرا که اگر [/FONT][FONT=&quot]public [/FONT][FONT=&quot] یا [/FONT][FONT=&quot]private[/FONT][FONT=&quot]یا [/FONT][FONT=&quot]protected[/FONT][FONT=&quot] تعریف کنیم ، به خطای کامپایل دچار می شیم که مبنی بر این است که فضاهای نام [/FONT][FONT=&quot]public , private , protected[/FONT][FONT=&quot]رو فقط و فقط در داخل بسته می تونیم استفاده کنیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 6 :[/FONT]
[FONT=&quot]در ارث بری کلاسی ، وقتی یک کلاس رو زیر کلاس یک کلاس دیگه قرار می دیم ، فرض کنید نمونه ای از کلاس مادر و نمونه ای از کلاس فرزند بسازیم ، پس ما می تونیم نمونه ساخته شده از کلاس فرزند رو در نمونه یا متغیر ساخته شده از کلاس مادر بریزیم ولی نمی تونیم نمونه ساخته شده از کلاس مادر رو در نمونه یا متغیر ساخته شده از کلاس فرزند بریزیم[/FONT][FONT=&quot] .[/FONT]
Pic05.gif

[FONT=&quot]نکته شماره 7[/FONT][FONT=&quot]:[/FONT][FONT=&quot]ما در مباحث اخیر، دو موجودیت اصلی رو برای یک کلاس تعریف کردیم ، مشخصه یا [/FONT][FONT=&quot]property[/FONT][FONT=&quot] و متد یا توابع یا [/FONT][FONT=&quot]. function[/FONT][FONT=&quot]در مقالات [/FONT][FONT=&quot]help[/FONT][FONT=&quot] خود فلش و بعضی رفرنس های انگلیسی دیگر ، موجودیت دیگری رو هم معرفی کرده اند به اسم ثابت ها یا اشیای [/FONT][FONT=&quot]. const[/FONT][FONT=&quot]این اشیا بعد از تعریف و مقدار دهی اولیه توسط کاربر طراح ، دیگر قابل تغییر مقداری ، در هیچ جای دیگر برنامه نیستند . از این بابت ، از نظر ساختار اصلی شبیه به متغیر ها هستند و تفاوتشون با متغیر ها در اینه که مقادیر داخلیشون پس از مقدار دهی اولیه ، قابل تغییر نیست . علت این هم که من از ثابت ها اسم نبردم اینه که تقریبا می شه اونها رو جزو دسته متغیر ها دونست (بدون در نظر گرفتن تغییر ناپذیریشون[/FONT][FONT=&quot]( .[/FONT]
[FONT=&quot]نکته شماره 8[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]همونطوری که می دونید ، ما از گزینه [/FONT][FONT=&quot]publish Setting[/FONT][FONT=&quot] فلش گروهی از تنظیمات فایل [/FONT][FONT=&quot]swf[/FONT][FONT=&quot] خروجی رو انجام می دیم . گروه دیگه تنظیمات خروجی رو هم از گزینه [/FONT][FONT=&quot]document[/FONT][FONT=&quot]انجام می دیم . راهی در اکشن اسکریپت 3 وجود داره که باعث می شه ، فلش ، تنظیمات منوی [/FONT][FONT=&quot]document[/FONT][FONT=&quot] رو در نظر نگیره و فقط این تنظیماتو از اکشن انجام بده[/FONT][FONT=&quot]syntax . [/FONT][FONT=&quot]این دستور به قرار زیر هست[/FONT][FONT=&quot]:[/FONT]
Pic06.gif

[FONT=&quot]در ضمن باید تمامی مقادیر رو داخل دابل کوتیشن ("") قرار بدیم[/FONT][FONT=&quot] .[/FONT][FONT=&quot]ترتیب قرارگیری موارد بالا مهم نیست یعنی می تونید هر کدومو در ترتیب قرار گیری ، هر جایی که خواستید ، قرار بدید. در ضمن ، به این روش ، روش متادیتاهای [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot] می گن و این روش ، یکی از روشهای برنامه [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot] هست که از فلش [/FONT][FONT=&quot]cs3[/FONT][FONT=&quot] به بعد ، در اکشن اسکریپت 3 مورد استفاده قرار می گیره . خاطر نشان می کنم که در این روش ، فلش ، تنظیمات گزینه [/FONT][FONT=&quot]document[/FONT][FONT=&quot] رو مهم تلقی نمی کنه و از این دستور ، برای تنظیمات خروجی [/FONT][FONT=&quot]swf[/FONT][FONT=&quot] استفاده می کنه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 9[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]ما در برخی موارد می تونیم حتی در داخل یک بسته ، چند کلاس رو تعریف کنیم ، البته نه همیشه ، مثلا خود من این قضیه رو در فلش [/FONT][FONT=&quot]cs3[/FONT][FONT=&quot] و [/FONT][FONT=&quot]cs4[/FONT][FONT=&quot] تست کردم و به خطا بر خوردم . اکشن اسکریپت 3 ، گروهی از کاربردهای خاص خودش رو در [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot]داره که در [/FONT][FONT=&quot]Flash[/FONT][FONT=&quot]نداره و برعکس ،( [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot]یه برنامه شبیه فلش هست که بر خلاف فلش که بر پایه گرافیک هست ، بیشتر بر پایه برنامه نویسی هست و می شه با اون ، برنامه هایی رو به زبان اکشن اسکریپت نوشت که در عین داشتن هسته برنامه نویسی بسیار قوی ، محافظت شده بار آورد و خروجی هایی با پسوند های مختلف مثل [/FONT][FONT=&quot]SWF[/FONT][FONT=&quot] و [/FONT][FONT=&quot]SWC[/FONT][FONT=&quot]و ... گرفت و کلاسها و توابع و برنامه هایی رو نوشت که [/FONT][FONT=&quot]OpenSource[/FONT][FONT=&quot] نباشند و کاربر استفاده کننده فقط بتونه اونا رو نصب یا [/FONT][FONT=&quot]import[/FONT][FONT=&quot] و بعد ، استفاده و اجرا کنه ) حتی در کامپایلر های مختلف ، گروهی از دستورات اکشن اسکریپت با هم دیگه فرق داره . این روش استفاده از چند کلاس در یک بسته ، تا اونجایی که در سایتهای خارجی دیدم ( ولی تست نکردم) ، در برخی کامپایلر ها مثل کامپایلر [/FONT][FONT=&quot]Flex2[/FONT][FONT=&quot] و همینطور کامپایلر[/FONT]
[FONT=&quot]Flash 9 Alpha[/FONT][FONT=&quot]قابل اجرا هست . این قضیه رو محض این می نویسم که در وب سایتهای خارجی ، به این نکته هم اشاره شده . باید دقت کرد که در این روش ، کلاس اصلی رو باید از نوع [/FONT][FONT=&quot]public[/FONT][FONT=&quot] تعریف کرد و دیگر کلاسها رو از نوع [/FONT][FONT=&quot]internal[/FONT][FONT=&quot] تعریف کرد . منظور ما هم از کلاس اصلی ، همون کلاسی هست که همنام فایل کلاسیمون هست . البته بعضی جاها ، حتی این مسئله رو ذکر کرده اند که الباقی کلاسها رو هم می شه از نوع [/FONT][FONT=&quot]Public[/FONT][FONT=&quot]تعریف کرد ولی در خیلی جاها هم این قضیه رد شده . بازم می گم ، من اینو در فلش [/FONT][FONT=&quot]cs3[/FONT][FONT=&quot]و [/FONT][FONT=&quot]cs4[/FONT][FONT=&quot] معمولی خودمون تست کردم و جواب نگرفتم. خوب در فولدری به اسم [/FONT][FONT=&quot]test [/FONT][FONT=&quot] ، ما یه فایل کلاسی به اسم [/FONT][FONT=&quot]A[/FONT][FONT=&quot]ساختیم و در اون ، کدهای زیر رو نوشتیم[/FONT][FONT=&quot] :[/FONT]
Pic07.gif

[FONT=&quot]سپس در فایل سورس ، کلاسهای بالا رو [/FONT]import[FONT=&quot] می کنیم و از اونها نمونه سازی می کنیم :[/FONT]
Pic08.gif

[FONT=&quot]و خروجیمون باید بشه[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]B was created by A[/FONT]​
[FONT=&quot]B was created by B[/FONT]​
[FONT=&quot]نکته شماره 10[/FONT][FONT=&quot] :[/FONT][FONT=&quot]همونطوری که در دروس قبل دیدید ، ما یک مووی کلیپ رو در [/FONT][FONT=&quot]library[/FONT][FONT=&quot] ، با اسم خاص کلاسی ، [/FONT][FONT=&quot]export for actionscript[/FONT][FONT=&quot]کردیم و یک کلاس خارجی ، به همون اسم کلاسی ، و بیرون از فایل ساختیم ، سپس از حاصل همپوشانی این دو کلاس ، نتیجه ای مشترک رو در خروجی دیدیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]باید بدونید که همپوشانی فقط در مورد مووی کلیپ ها اعمال نمی شه . بلکه ما می تونیم تصاویر وارد شده به [/FONT][FONT=&quot]library[/FONT][FONT=&quot] فلش ، [/FONT][FONT=&quot]button[/FONT][FONT=&quot] های ساخته شده در [/FONT][FONT=&quot]library[/FONT][FONT=&quot]، انواع صوتها و صدا های قابل قبول وارد شده به [/FONT][FONT=&quot]library[/FONT][FONT=&quot] فلش ، انواع ویدیو های وارد شده به فلش و هر چیز دیگه ای غیر از گرافیک های معمولی فلش رو [/FONT][FONT=&quot]export for action script[/FONT][FONT=&quot] کنیم و با این کار ، اونا رو به کلاسی با اسم خاص ، در اکشن اسکریپت تبدیل کرده ایم . بعد از [/FONT][FONT=&quot]export[/FONT][FONT=&quot]کردن اونها ، مشاهده می کنید که زیر کلاس هر کدوم ، به طور اتوماتیک ، انتخاب می شه (در زمینه اصیل خودشون و در کادر متنی [/FONT][FONT=&quot]SubClass[/FONT][FONT=&quot] ) پس ما می تونیم برای هر کدوم و به اسم کلاسی [/FONT][FONT=&quot]export[/FONT][FONT=&quot]شده هر کدوم ، کلاسی رو (فایل [/FONT][FONT=&quot].as[/FONT][FONT=&quot] ) در کنار سورس بوجود بیاریم (همنام اسم [/FONT][FONT=&quot]export[/FONT][FONT=&quot]شده) و با دستور [/FONT][FONT=&quot]extends[/FONT][FONT=&quot]، زیر کلاس اون کلاسی قرار بدیم که در قسمت [/FONT][FONT=&quot]subclass[/FONT][FONT=&quot]واقع در قسمت [/FONT][FONT=&quot]export[/FONT][FONT=&quot] ، بصورت خودکار نوشته شده بود . پس در این حالت ما می تونیم از همپوشانی فایل های کلاسی و اشیای داخل [/FONT][FONT=&quot]library[/FONT][FONT=&quot] ، نتیجه مشترکی رو در خروجی (بهینه سازی شده ) داشته باشیم . مثال در موارد مختلف از حوصله فروم خارجه ولی مثالی رو در مورد [/FONT][FONT=&quot]SimpleButton[/FONT][FONT=&quot] می زنیم ، فرض کنید که سه مستطیل در صحنه کشیده ایم و هر کدام را [/FONT][FONT=&quot]export for action script[/FONT][FONT=&quot] کردیم ، با نامهای [/FONT][FONT=&quot]Rect01 , Rect02,Rect03[/FONT][FONT=&quot] . [/FONT][FONT=&quot] پس یه دکمه خالی می سازیم و اونو با نام کلاسی [/FONT][FONT=&quot]myButton[/FONT][FONT=&quot]، برای استفاده در اکشن اسکریپت [/FONT][FONT=&quot]export[/FONT][FONT=&quot]می کنیم ، سپس یه فایل کلاسی با نام [/FONT][FONT=&quot]myButton.as[/FONT][FONT=&quot]در کنار سورس می سازیم و در اون کد های زیر رو می نویسیم[/FONT][FONT=&quot] :[/FONT]


PHP:
package//تعریف بسته
{
    import flash.display.MovieClip;//ورود کلاس مووی کلیپ ها برای مستطیل ها
    import flash.display.SimpleButton;//ورود کلاس دکمه ها
    import flash.events.*;//ورود کلاس رویدادها
    import Rect01;//ورود کلاس مستطیل شماره 1
    import Rect02;//شماره 2 //////////////
    import Rect03;//شماره 3 //////////////
    public class myButton extends SimpleButton
    //کلاس اصلی دکمه زیر کلاس دکمه ها
    {
        private const myConst:Number=1;
        //مشخصه ثابت عددی با رقم ثابت 1
        private var myNumber:Number=0;
        //مشخصه عددی با رقم صفر
        public function myButton():void
        //کانسترکتور
        {
            this.upState=new Rect01();
//قرارگیری مستطیل شماره 1 در مشخصه حالت معمولی کلاس دکمه
            this.downState=new Rect03();
//قرارگیری مستطیل شماره 3 در مشخصه حالت فشار دکمه موس
            this.overState=new Rect02();
//قرارگیری مستطیل شماره 2 در مشخصه  حالت لمس موس دکمه
            this.hitTestState=new Rect01();
//قرارگیری مستطیل شماره 1 در مشخصه محدوده لمس موس کلاس دکمه
            this.addEventListener(MouseEvent.CLICK,ClickFunction);
//به نمونه های ساخته شده از این کلاس در هنگام کلیک موس ، تابع کلیک اختصاص داده شد
        }
        
        private function ClickFunction(evt:MouseEvent):void
        //متد کلیک موس
        {
            trace(myConst+myNumber);
            //تریس مقدار حاصلجمع مشخصه ثابت و متغیر عددی
            myNumber++;
            //یک واحد به مقدار مشخصه متغیر عددی اضافه شد
        }
    }
}
[FONT=&quot]با درگ کردن نمونه ای از دکمه در صحنه و اجرای برنامه خواهید دید که سه مستطیل ، در حالات مختلف دکمه[/FONT][FONT=&quot] ([/FONT][FONT=&quot] Up , Over , Hit , Down[/FONT][FONT=&quot]) [/FONT][FONT=&quot]قرار گرفته اند و با کلیک بر روی نمونه درگ شده از دکمه در صحنه ، در ابتدا عدد 1 تریس می شه و با کلیک بعدی ، عدد 2 و بعد 3 و 4 و ... تمامی این دستورات ، از فایل کلاسی ، به کلاس دکمه ، همپوشان شد. می تونید این مسئله رو در مورد دیگر فایلهای قابل ورود به کتابخونه فلش که گفته شد ، تست کنید[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]نکته شماره 11[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]در بازدید سایت های خارجی و در بحث کلاسها ، شاید به مورد [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] کردن تصاویر بر بخورید و کمی به فکر فرو برید ، اما زیاد سخت نگیرید[/FONT][FONT=&quot] . [/FONT][FONT=&quot]استفاده از دستور [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] هم مثل استفاده از دستور [/FONT][FONT=&quot]SWF[/FONT][FONT=&quot]، به روش استفاده از متادیتا های [/FONT][FONT=&quot]Flex SDK[/FONT][FONT=&quot] برمی گرده[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]ابتدای امر [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] کردن چی هست ؟ [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] یکی از متادیتا های [/FONT][FONT=&quot]Adobe Flex[/FONT][FONT=&quot]هست که با استفاده از روش هایی خاص ، از فلش [/FONT][FONT=&quot]Cs3[/FONT][FONT=&quot] به بعد ، قابل استفاده در فلش هم شد[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]متادیتا ، داده ای در مورد داده هست و اطلاعاتی رو در مورد داده ها ، به فلش می ده ، با استفاده از متادیتای [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot]، ما می تونیم ، داده های خاصی رو به خروجی [/FONT][FONT=&quot]SWF[/FONT][FONT=&quot]الحاق کنیم و دقیقا مثل کار [/FONT][FONT=&quot]URLLoader[/FONT][FONT=&quot] عمل می کنه . ما می تونیم تصاویر ، استایل ها ، [/FONT][FONT=&quot]SWF[/FONT][FONT=&quot]ها ، فونتها ، موزیکها ، ویدیوها و ... رو به این روش به فلش الحاق کنیم . در این روش کافیه که با دستور [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot]، آدرس نسبی یا مطلق فایل مورد نظر رو که در خارج از فلش هست ، بنویسیم و فورا بعد از این دستور ، شی از نوع کلاس خام بوجود بیاریم تا فایل الحاق شده با دستور [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot]، در اون قرار بگیره و بعد ، شیی از نوع کلاس اصلی و پایه ای فایل ورودی بوجود بیاریم و شی کلاس خام که دیگه مقادیر فایل ورودی در اون قرار گرفته رو در شی اصلی نوع خودش قرار بدیم[/FONT]
[FONT=&quot]
[/FONT]
PHP:
package
{
    import flash.display.MovieClip;//ورود کلاس مووي کليپ ها
    import flash.display.DisplayObject;//ورود کلاس اشياي نمايش 
    import flash.display.Bitmap;//ورود کلاس بيت مپ
    import flash.media.Sound;//ورود کلاس صدا
    public class Main extends MovieClip//تعريف کلاس اصلي
    {
        [SWF(width="600",height="600",backgroundColor="#ffffff",frameRate="30")];
        //تنظيمات خروجي فلش
            [Embed(source="Images/Image01.jpg")]
                public var Image01Class:Class;
//الحاق شدن تصوير اول به خروجي و ورود فوري آن به کلاس خام
            [Embed(source="Images/Image02.jpg")]
                public var Image02Class:Class;
//الحاق شدن تصوير دوم به خروجي و ورود فوري آن به کلاس خام
            [Embed(source="Images/Image03.jpg")]
                public var Image03Class:Class;
//الحاق شدن تصوير سوم به خروجي و ورود فوري آن به کلاس خام
            [Embed(source="Images/Image04.jpg")]
                public var Image04Class:Class;
//الحاق شدن تصوير چهارم به خروجي و ورود فوري آن به کلاس خام
            [Embed(source="SWFs/SWF01.swf")]
                public var SWF01Class:Class;
//الحاق شدن فلش خروجي اول  به صورت کامل به خروجي و ورود فوري آن به کلاس خام
            [Embed(source="SWFs/SWF01.swf",symbol="Rectangle")]
                public var SWF02Class:Class;
/////// به فلش  و Rectangle الحاق شدن مووي کليپي با نام کلاسي اکسپورت شده 
            [Embed(source="Sounds/Alphaville_Big_in_Japan.mp3")]
                public var Sound01Class:Class;
//الحاق شدن فايل صوتي مزيک به خروجي فلش  و ورود فوري آن به فايل کلاسي خام
        public function Main():void//کانسترکتور
        {
            init();//متد اجرايي که خط استارت آن از کانسترکتور زده شد
        }
        public function init():void
        {
            var myImage01Bitmap:Bitmap=new Image01Class();
//شي از نوع کلاس تصوير اول بوجود آمد و در شي نوع بيت مپ قرار گرفت
            myImage01Bitmap.x=50;//تنظيم مختصات شي تصوير اول
            myImage01Bitmap.y=50;
            var myImage02Bitmap:Bitmap=new Image02Class();
//شي از نوع کلاس تصوير دوم بوجود آمد و در شي نوع بيت مپ قرار گرفت
            myImage02Bitmap.x=250;//تنظيم مختصات شي تصوير دوم
            myImage02Bitmap.y=50;
            var myImage03Bitmap:Bitmap=new Image03Class();
//شي از نوع کلاس تصوير سوم بوجود آمد و در شي نوع بيت مپ قرار گرفت
            myImage03Bitmap.x=50;//تنظيم مختصات شي تصوير سوم
            myImage03Bitmap.y=250;
            var myImage04Bitmap:Bitmap=new Image04Class();
//شي از نوع کلاس تصوير چهارم بوجود آمد و در شي نوع بيت مپ قرار گرفت
            myImage04Bitmap.x=250;//تنظيم مختصات شي تصوير چهارم
            myImage04Bitmap.y=250;
            addChild(myImage01Bitmap);//نمايش تصاوير
            addChild(myImage02Bitmap);
            addChild(myImage03Bitmap);
            addChild(myImage04Bitmap);
            var mySWF01:DisplayObject=new SWF01Class();
//شي کلاسي خروجي فلش ديگر در شي نوع اشياي نمايش قرار گرفت
            addChild(mySWF01);//نمايش خروجي فلش ديگر در صحنه اين فلش
            mySWF01.x=350;//تنظيم مختصات خروجي قبلي
            mySWF01.y=50;
            var mySWF02:DisplayObject=new SWF02Class();
// از فلش قبلي در شيي از نوع اشياي نمايش قرار گرفت Rectangle مووي کليپي با نام کلاسي اکسپورت شده 
            addChild(mySWF02);//نمايش
            mySWF02.x=350;//مختصات
            mySWF02.y=350;
            var mySound:Sound=new Sound01Class() as Sound;
            //قرار گيري کلاس صداي موزيک در شي نوع صدا (تبديلش به صدا )
            mySound.play();//پخش آهنگ
            
        }
    }
}
[FONT=&quot]همونطوری که مشاهده کردید ، با روش[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]ما انواع فایلها رو به خروجی الحاق کردیم ، ما می تونیم ایکسمل و ویدیو و هر چیز دیگه ای که قابل قبول فلش هست رو با روش[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]و به روش خاص خودش[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]کنیم[/FONT][FONT=&quot] . [/FONT][FONT=&quot]اگر فایل تمرین[/FONT][FONT=&quot] Embed Others03.rar [/FONT][FONT=&quot]رو [/FONT][FONT=&quot] Extract [/FONT][FONT=&quot]کنید ، مشاهده می کنید که فولدری به اسم[/FONT][FONT=&quot] PDF [/FONT][FONT=&quot]هست و در اون ، ما دو تا فایل[/FONT][FONT=&quot] PDF [/FONT][FONT=&quot]آماده کردیم که یکیش ، یه مقاله انگلیش در مورد استفاده از دو یا چند کلاس در یک[/FONT][FONT=&quot] package [/FONT][FONT=&quot] هست و دیگریش هم یه مقاله انگلیش در مورد[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]کردن فونت هست[/FONT]
[FONT=&quot]نکته ای که هست اینه که در[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]کردن[/FONT][FONT=&quot] SWF [/FONT][FONT=&quot]، هم می تونیم کل اونو به روش معمول الحاق کنیم و وارد شی کلاس نمایش[/FONT][FONT=&quot] (DisplayObject) [/FONT][FONT=&quot]کنیم و هم می تونیم فقط یک مووی کلیپ خاصو که اونو ، با نام کلاسی خاصی[/FONT][FONT=&quot] Export for ActionScrip t [/FONT][FONT=&quot]کردیم ، به روشی که در کد بالا گفته شده ، (دستور[/FONT][FONT=&quot]( symbo[/FONT][FONT=&quot]، به فلش الحاق کنیم[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]در این حالت ، بعد از زدن [/FONT][FONT=&quot]ctrl+Enter[/FONT][FONT=&quot]خواهید دید که فلش (در فلش [/FONT][FONT=&quot]CS4[/FONT][FONT=&quot]تست شد) پنجره ای رو باز می کنه تا مسیر [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot]سورستون آپدیت شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]وقتی ما با متادیتاها یا بعضی چیزای دیگه [/FONT][FONT=&quot]Adobe Flex SDK[/FONT][FONT=&quot]، در فلش کار می کنیم ، مسیری به یه فایل تجمعی [/FONT][FONT=&quot]SWC[/FONT][FONT=&quot] که در اون مجموعه توابع و دستورات [/FONT][FONT=&quot]Flex[/FONT][FONT=&quot]قرار داره ، برای کامپایل نیاز می شه[/FONT][FONT=&quot] . [/FONT][FONT=&quot]این مسیر رو می شه دو جور تعیین کرد[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]1-[/FONT][FONT=&quot]در این دستور و بعد از زدن [/FONT][FONT=&quot]ctrl+Enter[/FONT][FONT=&quot]، پنجره [/FONT][FONT=&quot]Wizard[/FONT][FONT=&quot] مربوطه باز می شه تا مسیر فایل تجمعی مورد نظر آپدیت شه . پس در کادر متنی اون کافیه دستور زیر رو بنویسیم و بعد ، دکمه [/FONT][FONT=&quot]Update[/FONT][FONT=&quot] رو بزنیم[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]
Pic10.gif
[/FONT]

[FONT=&quot]در این حالت و بعد از زدن دکمه مورد نظر ، اگر اجرا با خطا مواجه شد ، یک بار پنجره خروجی فلش رو ببندید و یه بار دیگه [/FONT][FONT=&quot]ctrl+Enter[/FONT][FONT=&quot]رو فشار بدید[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]2-[/FONT][FONT=&quot]در روش دوم کافیه به گزینه[/FONT][FONT=&quot] Publish Setting [/FONT][FONT=&quot]برید و از سر برگ[/FONT][FONT=&quot] Flash [/FONT][FONT=&quot]و در کنار لیست باز شونده انتخاب ورژن اکشن اسکریپت ، گزینه[/FONT][FONT=&quot]Setting [/FONT][FONT=&quot] رو بزنید و از پنجره باز شده ، سربرگ دوم یا همون[/FONT][FONT=&quot] source Path [/FONT][FONT=&quot]رو بزنید و بعد از زدن دکمه[/FONT][FONT=&quot] + [/FONT][FONT=&quot]رو زده و در کادر مسیر جدید ، رشته متنی شکل بالا رو قرار بدید و [/FONT][FONT=&quot]OK[/FONT][FONT=&quot] رو بزنید[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]می شه دستور [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] رو جایگزینی به دستورات الحاقی خاصی مثل[/FONT][FONT=&quot] : [/FONT]

PHP:
BitmapData.loadBitmap('theLinkageID');
[FONT=&quot]
[/FONT]
[FONT=&quot]در اکشن اسکریپت 2 دونست . بعد از انجام دستورات بالا خواهید دید که تصاویر یا موزیکها یا هر فایل دیگری که [/FONT][FONT=&quot]Embed[/FONT][FONT=&quot] شده ، اگه برای نمایش در خروجی تنظیم شده باشه ، در خروجی به نمایش در می یاد یا [/FONT][FONT=&quot]play[/FONT][FONT=&quot] می شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]مثالها[/FONT][FONT=&quot]:[/FONT]
[FONT=&quot]فایل تمرین [/FONT][FONT=&quot]Sample30-01.rar[/FONT][FONT=&quot] رو دانلود و باز کنید ، 3 فولدر رو به قرار زیر مشاهده خواهید کرد[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot] Default Input[/FONT][FONT=&quot]یک مثال خوب در مورد نکته شماره 2 (پارامتر ورودی پیش فرض ) هست[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]Get Set[/FONT][FONT=&quot] فولدری هست که در اون ، مثالی از نکته شماره 4 یعنی متد های [/FONT][FONT=&quot]Get[/FONT][FONT=&quot] و [/FONT][FONT=&quot]Set[/FONT][FONT=&quot]دیده می شه[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot] Neighbor Helper Class[/FONT][FONT=&quot]فولدری هست که خود [/FONT][FONT=&quot]Help[/FONT][FONT=&quot]فلش اونو مثال زده و من هم به خاطر زیبایی این مثال اونو آوردم و در مورد کلاسهای همسایه کمکی خارج از بسته هست که در نکته شماره 5 به اون اشاره شد [/FONT][FONT=&quot].[/FONT]
[FONT=&quot]بعد از دانلود و باز کردن فایل تمرین [/FONT][FONT=&quot]Sample30-02.rar[/FONT][FONT=&quot] چهار فولدر دیگر رو مشاهده خواهید کرد به قرار زیر[/FONT][FONT=&quot] :[/FONT]
[FONT=&quot]Child Value In Mother [/FONT][FONT=&quot] فولدری هست که در اون مثالی رو از ریختن اشیای فرزند در مادر و برعکس مشاهده خواهید کرد . این مثال بر می گرده به نکته شماره 6[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]3 [/FONT][FONT=&quot]Classes In 1 Package[/FONT][FONT=&quot] فولدری هست که در اون مثالی رو از یک سایت خارجی در این زمینه دانلود کردم و این فایل باید در فلش [/FONT][FONT=&quot]CS3[/FONT][FONT=&quot]ادیت شده باشه ، چون تمامی کسانی که این مثال رو (خارجکی ها ) دانلود و اجرا کرده بودند ، راضی بودند . البته من این مثالو هم در [/FONT][FONT=&quot]CS3 , CS4[/FONT][FONT=&quot]تست کردم و جواب نگرفتم ، باید کامپایلرش مخصوص باشه ، این مثال مربوط به نکته شماره 9 هست[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]SWF Setting Test[/FONT][FONT=&quot] مثالی هست که در اون شما با رفتن به منوی [/FONT][FONT=&quot]Modify[/FONT][FONT=&quot]و زدن گزینه ، پیکسل بندی 100 * 100 و رنگ زمینه سفید و فریم ریت 24 رو مشاهده می کنید ، در صورتی که با دستورات اکشن اسکریپت و دستور متادیتای [/FONT][FONT=&quot]SWF[/FONT][FONT=&quot]، خروجی رو عوض کردیم . این مثال برمیگرده به نکته شماره 8[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot] Simple Button Exported With Class File[/FONT][FONT=&quot]مثالی در مورد همپوشانی یه دکمه با یه فایل کلاسی هست و مربوط می شه به نکته شماره 10[/FONT][FONT=&quot] .[/FONT][FONT=&quot]
[/FONT][FONT=&quot]فایلهای تمرین[/FONT][FONT=&quot] Embed Other01.rar , Embed Other02.rar , Embed Other03.rar [/FONT][FONT=&quot]رو دانلود کنید ، این 3 فایل ، باید در یک فولدر قرار بگیرند ، در حقیقت همشون برای یک تمرین[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]هست ، چون حجم بالایی داشت ، و این فروم اجازه آپ کردن حجم بیشتر از یک مگ رو به کاربران ( در هر الحاق فایل ) نمی ده ، مجبور شدم اونا رو فایل به فایل جدا کنم و در 3 فایل[/FONT][FONT=&quot] rar [/FONT][FONT=&quot]قرار بدم . حتما دانلود کنید تا به بهترین وجه ، در مورد متادیتای[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]، اطلاعات کسب کنید .یه آهنگ لایت عالی هم گذاشتم که مطمئنم لذت می برید[/FONT]
[FONT=&quot]در فایل تمرین[/FONT][FONT=&quot] Embed Others03.rar [/FONT][FONT=&quot]، شما فولدری به اسم[/FONT][FONT=&quot] PDF [/FONT][FONT=&quot]رو مشاهده خواهید کرد که در اون ، 2 فایل[/FONT][FONT=&quot] PDF [/FONT][FONT=&quot]در مورد استفاده از چند کلاس در یک بسته و چگونگی الحاق فونت در فلش رو به روش[/FONT][FONT=&quot] Embed [/FONT][FONT=&quot]خواهید دید . در مورد [/FONT][FONT=&quot]Embed [/FONT][FONT=&quot] کردن الباقی انواع داده ها و فایل ها در فلش ، می تونین به سایت [/FONT][FONT=&quot]GOOGLE [/FONT][FONT=&quot] برید و اونا رو در سایتهای خارجی جستجو کنید[/FONT][FONT=&quot] ...[/FONT]
[FONT=&quot](as3 Embed XML) (as3 Embed Video) , .........[/FONT]
[FONT=&quot]خوب دوستان عزیزم ، کار بنده حقیر دیگه فعلا در این تایپیک تموم شده و امیدوارم از دروس ، استفاده مفید رو کرده باشین و همیشه شاد و موفق باشید [/FONT][FONT=&quot]. [/FONT][FONT=&quot]شما دوستان عزیز رو به خدای بزرگ می سپارم ..[/FONT][FONT=&quot] .[/FONT]

[FONT=&quot]پایان جلسه یازدهم و پایان سری اول آموزش شی گرایی[/FONT]

 

پیوست ها

  • Sample30-01.rar
    20.3 کیلوبایت · بازدیدها: 296
  • Sample30-02.rar
    27.4 کیلوبایت · بازدیدها: 295
  • Embed Others01.rar
    984.4 کیلوبایت · بازدیدها: 833
  • Embed Others03.rar
    122.5 کیلوبایت · بازدیدها: 469
  • Embed Others02.rar
    928.1 کیلوبایت · بازدیدها: 760
آخرین ویرایش:

++Hadi++

Active Member
دانلود فایل PDF فصل چهارم آموزش اکشن اسکریپت 3 از صفر
بحث شی گرایی
حجم فایل زیپ شده : 4.60 مگابایت


توجه : تمامی مثالهای و فایل های دیگر پیوست شده مربوط به بحث شی گرایی (دروس بیستم تا سی ام ) در یک فایل تجمعی فشرده قرار گرفته و آپ شد . برای دانلود این فایل می تونید به لینک زیر مراجعه کنید :

 
آخرین ویرایش:

sizanjavad

کاربر فعال
آموزش اكشن اسكريپت3 - درس سی و یکم

بسم الله الرحمن الرحیم

بابت تاخیر در آپدیت ، و بدقولی معذرت می حوام. این چند وقته سرم خیلی شلوغه. الانم یه جورایی لایی کشیدم تا بیام مطلب بذارم و بیشتر از این بدقول نشم.

بدون معطلی می ریم سراغ درس.

Playhead Movement (حرکت های Playhead) :

یکی از اساسی ترین مهارتهایی که تو AS3 باید یاد گرفته بشه اینه که چطور بتونیم فیلم (Movie) فلشمون رو کنترل کنیم.
درسهای اول رو به یاد بیارین. اگه یادتون باشه گفتیم می تونیم که به وسیله کدنویسی یه فریم های یه فیلم رو کنترل کنیم و مثلا حرکت آهسته برای فیلم ایجاد کنیم و ...

خوب اینا مستلزم اینه که به وسیله AS3 بتونیم تایم لاین فلش و فریم های اون رو کنترل کنیم. حالا تایم لاین می توننه تایم لاین اصلی فلشمون باشه. یا تایم لاین یکی از مووی کلیپها. توجه داشته باشین که هر مووی کلیپ از تعدادی ( یا حداقل یک) فریم تشکیل شده.


بذارین از یه مثال ساده شروع کنیم. می خوایم یه برنامه بنویسیم که با کلیدهای کنترلی تایم لاین اصلی رو کنترل کنه. مثلا یه فیلم ساده بسازیم و بتونیم با فشردن کلید stop فیلم رو متوقف کنیم و با فشردن دکمه play دوباره فیلم شروع به پخش شدن کنه.(نکته: منظور ما اینجا از فیلم اون فیلم که تو تلویزیون میبینید نیست ها!!! یعنی فیلم انیمشن :green: )

مثال زیر رو ببینید تا همه چیز دستتون بیاد :

attachment.php

همون طور که تو عکس میبینید ما یه فیلم داریم که در حال پخشه. و یه سری کلید که می تونیم باهاشون فیلم رو کنترل کنیم.
البته دو تا کلید دیگه هم اضافه کردم تحت عنوان gotoAndPlay و gotoAndStop اینا همون طور که از نامشون پیداست فیلم رو به یه فریم خاص می پرنونن! و به ترتین فیلم رو از اون خاص فریم شروع به پخش(gotoAndPlay ) و در اون فریم متوقف می کنن (gotoAndStop ).

شاید از خودتون بپرسین که : خوی چه دلیلی داره ما از بپریم به یه فریم و از اونجا فیلم رو پخش کنیم یا متوقفش کنیم. در جواب می شه گفت که : فکر کنین که یه فیلم آموزشی برای درس فیزیک ساختین که 3 فصل اول کتاب فیزیک رو شامل میشه.
آیا یه دانشجویی که دو فصل اول رو بلده و فقط می خواد فصل سه رو یاد بگیره مجبوره تمام فیلم رو ببینه و وقت گهربارش رو هدر بده تا برسه به فصل 3؟ نه خداییش این انصافه؟ :green:

کد زیر رو به فریم اول اضافه می کنیم و برنامه رو اجرا می کنیم.

attachment.php


در مورد کد فکر نکنم توضیحی لازم باشه. اگه stopBtn کلیک بشه که تابع onStopClick اجرا میشه و فیلم متوقف میشه و به این ترتیب برای کلیدهای دیگه هم همین اتفاق البته با رفتار متفاوت از سوی اونا (کلیدها) می افته.

نکته: اینجا ما با ()stop و ()Play و ... تایم لاین اصلی رو متوقف یا به فریم خاص می بریم. بعدا یاد خواهیم گرفت که چجوری یه مووی کلیپ رو به یه فریم خاص ببریم ، play کنیم و یا stop و ....

بذارین یه کار خوشکل کوچولوی دیگه هم روی برنامه انجام بدیم. کد زیر رو به انتهای برنامه اضافه کنین.


attachment.php

خط اول می گه که تعداد فریم های فیلم رو تو خروجی نشون بده ( خروجی تست!!!) . و خط دوم می گه که فریم جاری رو نشون بده. البته اگه باهوش باشین می فهین که خط دوم رو باید در هر تابع برنامه کپی کنین تا معنیدار باشه.

اگه انتهای برنامه کپی کنین چی میشه؟ اگه تو تمام تابع ها بذارینش چی؟


Frame Labels ( نشانه گذاری فریم ها):

لیبل گذاری یا همون نشونه گذاری فریم ها شاید در نظر اول کار بیهوده ای به نظر بیاد. چرا باید روی یه فریم اسم یا نشانه بذاریم؟ اصلا این کار چه فایده ای داره؟
مثال قبلی در مورد لزوم استفاده از gotoAndPly رو که یادتونه؟ خوب حالا شما فکر کنین تو فریم اول گفتین اگه روی کلید "فصل سوم" کلیک شد برو به فریم 1300 (شماره فریمی که فصل سوم از اون شروع میشه). تا اینجا هیچ مشکلی وجود نداره.
شما فیلم رو به استادتون نشون می دین تا در صورت تایید به دانشجوها تحویل بدین. استادتون بعد از دیدن فیلم گیر میده که : 25 فریم فیلم اضافیه و باید پاک بشه. و شما هم میگین اشکالی نداره! و سریعا موس رو تو دستتون می گیرین و اون 25 فریم رو انتخاب می کنین و اونا رو حذف می کنین.چه اتفاقی می افته؟

خیلی سادست: دیگه اول فصل سوم فریم شماره 1300 نیست!!! پس کاربر با کلیک روی دکمه "فصل سوم" به اول فصل سوم نخواهد رفت. حالا این که مشکلی نیست نهایتا به تغییر یه عدد تو فریم اول حل میشه. فکرش رو بکنین که شما تو یه پروژه بزرگ 234563746756 تا آدرس دادین:green: اون وقت که واویلا!!!!! :lol:

راه حل چیه؟ خوب مثل یه بچه خوب، از همون اول فریمی رو که می خوایم با کلیک روش بریم نام گذاری میکنیم و به جای عدد فریم در کد نام فریم رو می نویسیم. حالا هر تغییری در تعداد فریم ها ایجاد بشه دیگه هیچ اتفاقی نمی افته

مثال زیر رو در پیوست قرار دادم اون رو بگیرین و بازش کنین و کارایی اون رو ببینید.

attachment.php

اینم کدش:

attachment.php

می بینید که توی کد برای رفتن به یه فریم خاص از نام اون فریم استفاده شده. می بینید که برای فرستاده مووی کلیپ به فریم خاص فقط اسم مووی کلیپ رو اول دستور play یا stop یا gotoAndPlay و... اضافه می کنیم.

نکته: فکر نکنم لازم باشه که بگم برای اضافه کردن label باید فریم رو انتخاب و از پنجره properties فیلد FrameLabel رو مقداردهی کنید!

برای این جلسه بسه. برای درس بعد یه ویژگی جدید در فریم لیبل رو که با As3 معرفی شده رو بررسی خواهیم کرد.


فایل نمونه برنامه اول

فایل نمونه برنامه دوم
 

پیوست ها

  • 31-4.jpg
    31-4.jpg
    32.8 کیلوبایت · بازدیدها: 869
  • 31-3.jpg
    31-3.jpg
    9.3 کیلوبایت · بازدیدها: 862
  • 31-2.jpg
    31-2.jpg
    41.5 کیلوبایت · بازدیدها: 875
  • 31-1.jpg
    31-1.jpg
    10.2 کیلوبایت · بازدیدها: 878
  • 31-5.jpg
    31-5.jpg
    5.2 کیلوبایت · بازدیدها: 863
آخرین ویرایش:

sizanjavad

کاربر فعال
آموزش اكشن اسكريپت3 - درس سی و دوم

بسم الله الرحمن الرحیم

برا مقدمه حرفم نمی آد نمی دونم چرا؟!!!:-? اینم یه جورشه دیگه. بنابر این مستقیم می ریم سر درس.

کار با لیبل فریم ها - پیشرفته

همونطور که جلسه قبل قول داده بودم قرار شد ویژگی جدید و جالبی رو که با As3 برای کار با فریم لیبل معرفی شد رو توضیح بدم.

همونطور که می دونید scene ها توی فلش ابزاری هستند برای مدیریت کردن تایم لاین. با استفاده از scene ها می تونین تایم لاین رو به تیکه ها کوچیک تر تقسیم کنین. فکرش بکنین شما یه تایم لاین برا یه انیمیشن نسبتا طولانی دارین. خوب چه بهتر که بتونین فیلمتون رو به تیکه های کوچیک تر تقسیم کنین تا کار روی اونا و تستوشون راحت تر بشه. در حقیقت شما تایم لاین رو دسته دسته می بینین ولی فلش scene ها رو پشت سر هم و به صورت یه تایم لاین واحد می بینه.

نکته: اگه با scene ها کار نکردین و توضیحات بالا هم بهتون نچسبید می تونین از help خود فلش استفاده کنین

حالا As3 چیکار کرده؟
اومده یه آرایه در اختیار کاربر قرار داده که لیبل فریم ها و خصوصیات اونا توش قرار داره.
و یه آرایه دیگه از scene ها که اسم اونا به همراه تعداد فریم هاشون در این آرایه قرار داره.

خوب اینا رو ساده نگیرین اینا امکانات خیلی خوبی هستن. مخصوصا برای آدما شلخته ای مثل من تا فیلمشون رو خیلی منظم و باحال مدیریت کنن.

این مثال رو با هم ببینیم تا ببینیم چی میشه:

attachment.php


اگه فایل نمونه رو باز کنین و ببینین. متوجه می شین که تایم لاین دو تا scene داره به نام های primery و secondary

attachment.php

تو فریم اول کد زیر رو می بینیم


attachment.php


همونطور که تو کد می بینین بعد از خط اول که تایم لاین رو stop می کنه. چهار دستور بعدی به ترتیب:

نام اولین scene - تعداد فریم های اولین scene - نام لیبل اول scene اول و شماره فریم لیبل اول از scene اول رو به پنجره خروجی می بره.

در خط بعد مووی کلیپ pages رو Stop می کنیم که در فریم اول خودش بمونه.

در خط بعد listener مربوط به کلید output رو تعریف می کنیم. تا با کلیک روی اون تابع onOutputClick اجرا بشه.

و اما کار تابع onOutputClick چیه؟

انتظار ندارین با توضیحات فینگلیشی که توی کدش نوشتم دیگه خط خط براتون توضیح بدم؟:mad::green:


اینا تعدادی از توابع کاربردی مربوط به این بخش هستن. حالا دیگه کار کشیدن از این توابع و امکانات به خلاقیت خودتون بستگی داره و اینکه کجاها بهش احساس نیاز کنین.


یه مبحث کوچولو و کاربردی دیگه رو هم بگم و درس امروز رو تموم کنم.

کنترل سرعت رد شدن فریم ها - frame Rate 

اگه بدونین تو As2 من چقدر دنبال این قابلیت گشتم و نتونستم چیزی پیدا کنم. آخر سر هم از یه کاربر کاردرست فلش (البته خارجی ها!) شنیدم که As2 این قابلیت رو نداره. کلی تو روحیه تاثیر گذاشت:sad:

وقتی تو As3 این قابلیت رو دیدم کلی حال کردم. ولی حیف! دیگه خیلی دیر بود.... حالا برا شما می گم که دیگه این بلا سر شما نیاد!:green:

همونطور که می دونین هر فیلم فلش یه property به نام frame rate داره که سرعت پخش فیلم رو تنظیم میکنه. تو As2 شما فقط می تونستید برا کل فیلم یه سرعت ثابت داشته باشین.

اما این همیشه خوب نبود. مثلا من اون موقع می خواستم یه ماشین در حال حرکت داشته باشم که با فرشده شدن یه کلید ماشین گاز بخوره و سرعتش بیشتر و بیشتر بشه!!!

پس As3 آستینش رو بالا زد و این قابلیت رو به برنامه نویسا داد تا ازش لذت ببرن و بتونن در حالت اجرا (run time) سرعت پخش فیلم رو تنظیم کنن.

مثال زیر رو ببینین.


attachment.php


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

این کد رو به فریم اول اضافه می کنیم.

attachment.php

دیگه نیازی به توضیح نیست.... کلید سرعت بیشتر onFasterClick خاصیت frameRate مربوط به Stage رو 5 تا اضافه و کلید سرعت کمتر onSlowerClick 5 تا از frameRate کم میکنه.
به همین سادگی!


اینم از درس امروز. اگه براتون مفید بود یه فاتحه برا پدربزرگم که 3 روز پیش مرحوم شد بخونین. مرسی:rose:


دریافت سورس مثال اول

دریافت سورس مثال دوم
 

پیوست ها

  • 32-1.jpg
    32-1.jpg
    18 کیلوبایت · بازدیدها: 898
  • 32-2.jpg
    32-2.jpg
    24.8 کیلوبایت · بازدیدها: 890
  • 32-3.jpg
    32-3.jpg
    86 کیلوبایت · بازدیدها: 908
  • 32-4.jpg
    32-4.jpg
    10.3 کیلوبایت · بازدیدها: 879
  • 32-5.jpg
    32-5.jpg
    41 کیلوبایت · بازدیدها: 899

++Hadi++

Active Member
بسم الله الرحمن الرحیم
سلام
پس از پروژه موفق آموزش های اکشن اسکریپت 3 از صفر ، این بار به سراغ آموزش پایه ای کد نویسی ++C در جهت آموزش های زبان اسکریپتی Unreal Script رفتیم.
البته به فراخور تناسب این مبحث با وب سایت رسمی موتور بازی سازی Unreal Engine ،این آموزش ها را در سایت UDK.ir که جزو پیشگامان عرصه فناوری بازی است ، قرار دادیم.
دوستان می توانند در این سایت عضو شوند و از این آموزش ها استفاده نمایند.
انشاء الله قصد داریم این آموزش ها را به حد اعلا برسانیم.
همچنین با یادگیری مفاهیم پایه ای زبان قدرتمند ++C ،می توانید پایه کلی برنامه نویسیتان را تقویت نمایید و سپس به سوی زمینه ها و زبانها و پلتفرم های مختلف حرکت نمایید.
دوستان می توانند به این لینک سر بزنند و از این آموزش ها استفاده نمایند...
آموزش پایه ای کد نویسی Unreal Script با تقویت پایه برنامه نویسی ++C و با اقتباس از کتاب unreal development kit game ..
با تشکر از توجه شما و موفق باشید....
 
آخرین ویرایش:
وضعیت
موضوع بسته شده است.

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

بالا