دسترسی به DisplayObjectهای صفحه

niny-goloo

Member
سلام
ببخشید که من اینقدر سوال میکنم :دی
من یه فایل اصلی دارم به اسم Main.fla که یه داکیومنت کلاس به اسم Main.as داره. داخل Main.as یه نمونه از یه کلاس که یه دکمه ایجاد میکنه ساختم اسم این کلاس Hint هست. کلی شی دیگه هم با یه سری کلاس دیگه ساخته شده. یعنی تمام اشیا با اکشن اسکریپت ساخته شدند.
حالا من میخوام از داخل کلاس Hint یه فایل دیگه به اسم page.swf لود کنم.
تا اینجاش هیچ مشکلی نیست.
مشکل اصلی اینه که میخوام این صفحه بالاترین سطح رو داشته باشه :دی
یعنی در حقیقت میخوام از کلاس hint به displayObject ها دسترسی داشته باشم
کسی چیزی در موردش میدونه؟
 

benyamin_pc

Well-Known Member
شما با تکنیک های oop میتونین این کارهارو انجام بدین مثل ارث بری و public private تعریف کردن و ...
اگه میخاین تو این زمینه خیلی بتونین مانور بدین باید از پروپرتی ها تو C# استفاده کنین C# به شما نهایت oop میده
 

niny-goloo

Member
ممنون کاکو
من میدونم باید از ارث بری استفاده کنم
اینو تا حالا توی شصت جا از این فروم خوندم
ولی کاکو جان میشه بفرمایید یعنی چی؟
ارث بری ها رو میدونم یعنی چی. (شایدم نمیدونم و فکر میکنم که میدونم :دی) ولی این که ازشون برای دسترسی به کل ابجکت ها استفاده کنیم یعنی چی؟
 

++Hadi++

Active Member
می تونین با :
PHP:
myMC.numChildren
به تعداد اشیای نمایشی addChild شده در یک displayObject دست پیدا کنین ولی اشیا از خونه شماره 0 شروع به add شدن می کنند ، بهتر بگم از index شماره 0.
حالا اگه بخواهین یه شی رو رو یه شی دیگه بندازین، بهتر بگم اگه بخواهین عمق شی اول رو بالا تر از عمق شی دوم بندازین :
PHP:
myMainMC.swapChildren(myMainMC.mc1,myMainMC.mc2);
البته به شرطی که جفتشون تو myMainMC با دستور addChild اضافه شده باشند.
و البته می تونین به صورت دستی ایندکسشونو عوض کنین :
PHP:
myMainMC.setChildIndex(myMainMC.mc1,1);
و صد البته اگه بخواهین mc1 که تو myMainMC هست ، بالا ترین ایندکس رو داشته باشه و رو همه این اشیا بیفته می نویسین :
PHP:
myMainMC.setChildIndex(myMainMC.mc1,myMainMC.numChildren-1);
و با دستور آخر می تونین mc1 رو که داخل myMainMC هست، تو بالاترین ایندکس قرار بدین...
بای...
 

niny-goloo

Member
کاکو جان اینارو که میگین من قبلا تست کردم
ولی من وقتی میام از داخل یه کلاس تعداد اشیای صحنه رو بگیرم با این کد
PHP:
trace (stage.numChildren)
فقط 1 میگه؟
این واسه چیه؟
چه جوری میتونم کل ابجکت هایی که رو صحنه است رو بگیرم؟
 

niny-goloo

Member
ببینم یعنی کسی نمیدونه بخوایم به یه شی تو یه صحنه ادرس بدیم باید چیکار کنیم؟
یعنی کسی DisplayObject رو کاملا بلد نیست؟ فکر نمیکردم سئوالم اینقدر نامهفوم یا سخت باشه؟ :-?
 

mehdadoo

Member
اگر کدی رو پیوست کنی، سریعتر مشکلت رو می فهمیم. البته .fla رو در لینوکس نمیتونم باز کنم، پس فقط کد بفرس.
 

niny-goloo

Member
کدهام بسیار پیچیده تر از اونیه که بخوام اینجا بنویسم :دی
ببینید فایل اصلی من ای یه XML یه سری متن رو میخونه و با یه کلاس این متن های خونده شده از XML رو با فیلد متنی TLFTextField رو صحنه ایجاد میکنه.
حالا ممکنه بعضی از این فیلد های متنی یک رخداد کلیک هم داشته باشند که یه صفحه از بیرون رو بخونه
حالا مشکل من اینه که وقتی این صفحه لود میشه زیر بعضی از فیلد های متنی می افته
من میخوام این صفحه که لود میشه روی تمام صفحات باشه
یعنی میخوام بدونم DsiplayObject هایی که ایجاد میشن چه طوری روی صحنه میشه بهشون دسترسی پیدا کرد.
که من بتونم به این ادرس بدم که از همه بالاتر باش
 

++Hadi++

Active Member
چون وقتی یه شی از یه کلاس رو می سازین، stage اصلی توش تعریف نیست.
به دو روش می شه به صحنه دست پیدا کرد،
1- یا مووی کلیپی یا sprite از صحنه رو به این کلاس به عنوان یه آرگمان از بیرون اون کلاس به اون پاس می دین و بعد از طریق mc.root.stage به صحنه اصلی دست پیدا می کنین.
2- یا شی stage رو به عنوان یه آرگمان به اون کلاس پاس می دین و مستقیما به اون دست پیدا می کنین.
در کل به نظر من گزینه دوم مطلوب تر هست.
البته سعی کنین برا هر کلاس یه متد به عنوان dispose یا distructor بوجود بیارین و در اون تمامی رویداد های داخلی اون کلاس رو حذف کنین و تمامی اشیای مختلف رو Null کنین. .البته سعی کنین این متغیر stage ساخته شده توش رو null کنین. درسته بیشتر اشاره گر همون C++ هستند ولی واسه روند کنترل حافظه خیلی بهتره... و باعث نظر بیشتر پروژه ها می شه.
بای...
 

niny-goloo

Member
ممنون
تقریبا دارم میفهمم که چی شد.
این مدل رو ببین

AS3Model.png

ببینید اول file.as اطلاعات XML رو دریافت میکنه. یه شی از کلاس MainClass.as ایجاد میکنه و با متدهایی که داره تحلیلش میکنه.
حالا MainClas بر حسب نیاز نمونه های از سه کلاس دیگه ایجاد میکنه. این سه کلاس متن، تصویر و صدا به صحنه اضافه میکنه. داخل کلاس TextClass ممکنه نیاز باشه یه شی از کلاس Hint.as ایجاد بشه. کلاس Hint.as یه باکس میسازه که با کلیک روی اون یه فایل فلش لود و ادد میشه. و اصلی ترین مشکل من اینه که وقتی ادد میشه زیر بعضی از اشای دیگه که با کلاس های دیگه ساخته میشن میره.
حالا من بایستی که این شی stage رو پاسکاری کنم بین همه اینا؟ و اصلا به این کار نیازی هست؟ یا راه دیگه ای هست؟
 

++Hadi++

Active Member
تا اونجایی که می دونم لازم نیست. ببینید اگه قرار هست محتویات addChild شده داخل یه displayObject مثل sprite یا movieclip رو arrange کنین یعنی تو همون عقب و جلو ببرین، کافیه به اون دست پیدا کنین . ببینید فرض کنین یه ظرف بزرگ دارین. توش 3 تا ظرف زیر و روی هم گذاشتین. وقتی تا اینجا مشکلی ندارید، خوب نیازی به دست پیدا کردن به اون ظرف بزرگ نیست. حالا وقتی تو ظرف وسط از این 3 ظرف، 4 تا تخم مرغ زیر رو رو هم گذاشتین، و می خواهین که تخم مرغ دوم زیر تخم مرغ اول بیفته، اونم در شرایطی که اولی زیر دومیه، دیگه نیازی به دست پیدا کردن به ظرف بزرگ اولیه نیست. بلکه کافیه به ظرف وسطیه دستور بدین که در محتویاتت، تخم مرغ دوم رو زیر تخم مرغ اول بزار. پس با دست پیدا کردن به stage یا همون ظرف بزرگه، و ست کردن اشیای داخلش، می تونین اون 3 ظرف رو عقب و جلو کنین نه تخم مرغ ها رو . و برای arrange کردن تخم مرغ ها، لازم نیست به اون بزرگه دست پیدا کنین ، بلکه به ظرف وسطیه می گین که تخم مرغ دوم رو زیر تخم مرغ اول بزاره...
 

niny-goloo

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

niny-goloo

Member
با راهنمایی های شما تونستم انجامش بدم += متشکرم
ولی اصلا نمیفهمم چرا باید با این کد درست بشه
اصلا به ذهنمم خطور نمیکرد.
PHP:
root.stage.addChild(pageLoader)
مگه root بالاترین سطح displayObject ها نیست؟ پس چرا اول stage رو نوشتم بعد root?
این سوال اولم
و دوم اینکه حالا میخوام با یه دکمه ببندمیش
من اون نمونه ای که توی امضای شما بود رو دیدم.
روند کار اینجوریه که من یا تابع درست کنم که این loaderرو unload کنه
حالا من این تابع رو کجا میتونم بنویسم. تو کلاس داخلی که loader رو لود کرده یا توی کلاس اصلیم
و تا الان که توی کلاس داخلی مینویسم و میام توی صفحه ای که باید لود بشه به دکمه ادرس اون تابع رو بدم میگه که نمیتونه همچین متدی پیدا کنه.
اگه بازم کمک کنید ممنون میشم
یه سوال دیگه هم هست که بعد از این سوال میپرسم. :rose:
 

++Hadi++

Active Member
خیر همه اینا وصل می شند به stage.stage به محیط عمومی کار می گند که همه به اون دست دارند البته به صورت با واسطه یا بدون واسطه.
و اینکه باید یه تابع تو اون کلاس مستطیلتون بنویسین که لود و آنلود رو انجام بده و به صورت public باشه و بعد از بیرون Main اصلی در شرایط لازم بهش دستور بده تا اون، لود رو انجام بده.
ببینید، این یه design pattern هست. یعنی Main همه چیز رو مدیریت می کنه و از فعالیت های تخصصی هر قسمت با خیر نیست.فقط چون مدیر هست، تمام دستورات لازم رو به قسمتها می ده و اون قسمتها به نسبت تخصصشون، اون کار رو انجام می دن.
 

niny-goloo

Member
دوست عزیز اقا هادی ممنون بابت جوابت
من قصد دارم که وقتی کارم با یه Loader تموم میشه اونو پاکش کنم
شما فرمودید که مساوی Null بزارم؟
برابر با Null گذاشتن بهتره یا اینکه من کلا اونو removeChild کنم؟
برای متغییر های ارایه ای هم وقتی که Null بزاریم از مقدار فضای رم استفاده شده کم میشه؟
 

++Hadi++

Active Member
در مورد پاک کردن لودر
اگه امکان لود تصویر دیگه ای هست که فقط unloadAndStop یا unload کنین.اولیه واسه فلش پلیر 10 به بالاست و صدا رو هم تو swf لود شده حذف می کنه و کلا خیلی دقیق تره. اولیه تو همشون هست ولی صدا رو حذف نمی کنه و تو پاک کردن چیزای دیگه خیلی حرفه ای نیست.
ولی اگه دیگه لازمش ندارید، اول unloadAndStop یا unload کنین و بعد اونو از جایی که addChild شده ، removeChild کنین و بعد مساوی null کنین.در نهایت بعد از پاک کردن تمام اشیای به درد نخور و به طبع قبلش غیر فعال کردن و خالی کردنشون، System.gc رو اجرا کنین که همون garbageCollection هست و تو سیستمای روز دنیا، با این دستور، پردازنده و تا حدودی رم، از لوس حضور اشیای Null به درد نخور پاک می شه.
بای...
 

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

بالا