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

شروع موضوع توسط niny-goloo ‏16 اکتبر 2011 در انجمن Action Script 3

  1. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    سلام
    ببخشید که من اینقدر سوال میکنم :دی
    من یه فایل اصلی دارم به اسم Main.fla که یه داکیومنت کلاس به اسم Main.as داره. داخل Main.as یه نمونه از یه کلاس که یه دکمه ایجاد میکنه ساختم اسم این کلاس Hint هست. کلی شی دیگه هم با یه سری کلاس دیگه ساخته شده. یعنی تمام اشیا با اکشن اسکریپت ساخته شدند.
    حالا من میخوام از داخل کلاس Hint یه فایل دیگه به اسم page.swf لود کنم.
    تا اینجاش هیچ مشکلی نیست.
    مشکل اصلی اینه که میخوام این صفحه بالاترین سطح رو داشته باشه :دی
    یعنی در حقیقت میخوام از کلاس hint به displayObject ها دسترسی داشته باشم
    کسی چیزی در موردش میدونه؟
     
    نوشته شده توسط niny-goloo در ‏16 اکتبر 2011
  2. benyamin_pc

    benyamin_pc Well-Known Member

    ارسال‌ها:
    1,160
    تشکر شده:
    516
    امتیاز دستاورد:
    113
    شما با تکنیک های oop میتونین این کارهارو انجام بدین مثل ارث بری و public private تعریف کردن و ...
    اگه میخاین تو این زمینه خیلی بتونین مانور بدین باید از پروپرتی ها تو C# استفاده کنین C# به شما نهایت oop میده
     
    نوشته شده توسط benyamin_pc در ‏16 اکتبر 2011
  3. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    ممنون کاکو
    من میدونم باید از ارث بری استفاده کنم
    اینو تا حالا توی شصت جا از این فروم خوندم
    ولی کاکو جان میشه بفرمایید یعنی چی؟
    ارث بری ها رو میدونم یعنی چی. (شایدم نمیدونم و فکر میکنم که میدونم :دی) ولی این که ازشون برای دسترسی به کل ابجکت ها استفاده کنیم یعنی چی؟
     
    نوشته شده توسط niny-goloo در ‏16 اکتبر 2011
  4. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,802
    امتیاز دستاورد:
    36
    می تونین با :
    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 هست، تو بالاترین ایندکس قرار بدین...
    بای...
     
    نوشته شده توسط ++Hadi++ در ‏16 اکتبر 2011
  5. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    کاکو جان اینارو که میگین من قبلا تست کردم
    ولی من وقتی میام از داخل یه کلاس تعداد اشیای صحنه رو بگیرم با این کد
    PHP:

    trace (stage.numChildren)
     
    فقط 1 میگه؟
    این واسه چیه؟
    چه جوری میتونم کل ابجکت هایی که رو صحنه است رو بگیرم؟
     
    نوشته شده توسط niny-goloo در ‏16 اکتبر 2011
  6. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    ببینم یعنی کسی نمیدونه بخوایم به یه شی تو یه صحنه ادرس بدیم باید چیکار کنیم؟
    یعنی کسی DisplayObject رو کاملا بلد نیست؟ فکر نمیکردم سئوالم اینقدر نامهفوم یا سخت باشه؟ :-?
     
    نوشته شده توسط niny-goloo در ‏17 اکتبر 2011
  7. mehdadoo

    mehdadoo Member

    ارسال‌ها:
    84
    تشکر شده:
    149
    امتیاز دستاورد:
    6
    اگر کدی رو پیوست کنی، سریعتر مشکلت رو می فهمیم. البته .fla رو در لینوکس نمیتونم باز کنم، پس فقط کد بفرس.
     
    نوشته شده توسط mehdadoo در ‏17 اکتبر 2011
  8. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    کدهام بسیار پیچیده تر از اونیه که بخوام اینجا بنویسم :دی
    ببینید فایل اصلی من ای یه XML یه سری متن رو میخونه و با یه کلاس این متن های خونده شده از XML رو با فیلد متنی TLFTextField رو صحنه ایجاد میکنه.
    حالا ممکنه بعضی از این فیلد های متنی یک رخداد کلیک هم داشته باشند که یه صفحه از بیرون رو بخونه
    حالا مشکل من اینه که وقتی این صفحه لود میشه زیر بعضی از فیلد های متنی می افته
    من میخوام این صفحه که لود میشه روی تمام صفحات باشه
    یعنی میخوام بدونم DsiplayObject هایی که ایجاد میشن چه طوری روی صحنه میشه بهشون دسترسی پیدا کرد.
    که من بتونم به این ادرس بدم که از همه بالاتر باش
     
    نوشته شده توسط niny-goloo در ‏17 اکتبر 2011
  9. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,802
    امتیاز دستاورد:
    36
    چون وقتی یه شی از یه کلاس رو می سازین، stage اصلی توش تعریف نیست.
    به دو روش می شه به صحنه دست پیدا کرد،
    1- یا مووی کلیپی یا sprite از صحنه رو به این کلاس به عنوان یه آرگمان از بیرون اون کلاس به اون پاس می دین و بعد از طریق mc.root.stage به صحنه اصلی دست پیدا می کنین.
    2- یا شی stage رو به عنوان یه آرگمان به اون کلاس پاس می دین و مستقیما به اون دست پیدا می کنین.
    در کل به نظر من گزینه دوم مطلوب تر هست.
    البته سعی کنین برا هر کلاس یه متد به عنوان dispose یا distructor بوجود بیارین و در اون تمامی رویداد های داخلی اون کلاس رو حذف کنین و تمامی اشیای مختلف رو Null کنین. .البته سعی کنین این متغیر stage ساخته شده توش رو null کنین. درسته بیشتر اشاره گر همون C++ هستند ولی واسه روند کنترل حافظه خیلی بهتره... و باعث نظر بیشتر پروژه ها می شه.
    بای...
     
    نوشته شده توسط ++Hadi++ در ‏17 اکتبر 2011
    niny-goloo از این پست تشکر کرده است.
  10. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    ممنون
    تقریبا دارم میفهمم که چی شد.
    این مدل رو ببین

    [​IMG]
    ببینید اول file.as اطلاعات XML رو دریافت میکنه. یه شی از کلاس MainClass.as ایجاد میکنه و با متدهایی که داره تحلیلش میکنه.
    حالا MainClas بر حسب نیاز نمونه های از سه کلاس دیگه ایجاد میکنه. این سه کلاس متن، تصویر و صدا به صحنه اضافه میکنه. داخل کلاس TextClass ممکنه نیاز باشه یه شی از کلاس Hint.as ایجاد بشه. کلاس Hint.as یه باکس میسازه که با کلیک روی اون یه فایل فلش لود و ادد میشه. و اصلی ترین مشکل من اینه که وقتی ادد میشه زیر بعضی از اشای دیگه که با کلاس های دیگه ساخته میشن میره.
    حالا من بایستی که این شی stage رو پاسکاری کنم بین همه اینا؟ و اصلا به این کار نیازی هست؟ یا راه دیگه ای هست؟
     
    نوشته شده توسط niny-goloo در ‏17 اکتبر 2011
  11. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,802
    امتیاز دستاورد:
    36
    تا اونجایی که می دونم لازم نیست. ببینید اگه قرار هست محتویات addChild شده داخل یه displayObject مثل sprite یا movieclip رو arrange کنین یعنی تو همون عقب و جلو ببرین، کافیه به اون دست پیدا کنین . ببینید فرض کنین یه ظرف بزرگ دارین. توش 3 تا ظرف زیر و روی هم گذاشتین. وقتی تا اینجا مشکلی ندارید، خوب نیازی به دست پیدا کردن به اون ظرف بزرگ نیست. حالا وقتی تو ظرف وسط از این 3 ظرف، 4 تا تخم مرغ زیر رو رو هم گذاشتین، و می خواهین که تخم مرغ دوم زیر تخم مرغ اول بیفته، اونم در شرایطی که اولی زیر دومیه، دیگه نیازی به دست پیدا کردن به ظرف بزرگ اولیه نیست. بلکه کافیه به ظرف وسطیه دستور بدین که در محتویاتت، تخم مرغ دوم رو زیر تخم مرغ اول بزار. پس با دست پیدا کردن به stage یا همون ظرف بزرگه، و ست کردن اشیای داخلش، می تونین اون 3 ظرف رو عقب و جلو کنین نه تخم مرغ ها رو . و برای arrange کردن تخم مرغ ها، لازم نیست به اون بزرگه دست پیدا کنین ، بلکه به ظرف وسطیه می گین که تخم مرغ دوم رو زیر تخم مرغ اول بزاره...
     
    نوشته شده توسط ++Hadi++ در ‏17 اکتبر 2011
  12. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    خوب همین دیگه.
    من کلا تو دسترسی ها مشکل دارم
    ببینید تو مثال خودتون. ما یه ظرف بزرگ دارم که همون استیجمون هست. که توش دوتا ظرف دیگه هست که همون کلاس های منه.
    حالا چندتا مثلا تخم مرغ توی این ظروف هستن
    من میخوام یه تخم مرغ بالاتر از همه باشه.
    یعنی این چیزی که الان ایجاد میشه تو بالاترین سطح باشه. و این کلاس هم بایستی تو بالاترین سطح باشه؟ اینا رو چه جوری میشه به این فلش فهموند؟
     
    نوشته شده توسط niny-goloo در ‏17 اکتبر 2011
  13. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    با راهنمایی های شما تونستم انجامش بدم += متشکرم
    ولی اصلا نمیفهمم چرا باید با این کد درست بشه
    اصلا به ذهنمم خطور نمیکرد.
    PHP:

    root.stage.addChild(pageLoader)
     
    مگه root بالاترین سطح displayObject ها نیست؟ پس چرا اول stage رو نوشتم بعد root?
    این سوال اولم
    و دوم اینکه حالا میخوام با یه دکمه ببندمیش
    من اون نمونه ای که توی امضای شما بود رو دیدم.
    روند کار اینجوریه که من یا تابع درست کنم که این loaderرو unload کنه
    حالا من این تابع رو کجا میتونم بنویسم. تو کلاس داخلی که loader رو لود کرده یا توی کلاس اصلیم
    و تا الان که توی کلاس داخلی مینویسم و میام توی صفحه ای که باید لود بشه به دکمه ادرس اون تابع رو بدم میگه که نمیتونه همچین متدی پیدا کنه.
    اگه بازم کمک کنید ممنون میشم
    یه سوال دیگه هم هست که بعد از این سوال میپرسم. :rose:
     
    نوشته شده توسط niny-goloo در ‏17 اکتبر 2011
  14. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,802
    امتیاز دستاورد:
    36
    خیر همه اینا وصل می شند به stage.stage به محیط عمومی کار می گند که همه به اون دست دارند البته به صورت با واسطه یا بدون واسطه.
    و اینکه باید یه تابع تو اون کلاس مستطیلتون بنویسین که لود و آنلود رو انجام بده و به صورت public باشه و بعد از بیرون Main اصلی در شرایط لازم بهش دستور بده تا اون، لود رو انجام بده.
    ببینید، این یه design pattern هست. یعنی Main همه چیز رو مدیریت می کنه و از فعالیت های تخصصی هر قسمت با خیر نیست.فقط چون مدیر هست، تمام دستورات لازم رو به قسمتها می ده و اون قسمتها به نسبت تخصصشون، اون کار رو انجام می دن.
     
    نوشته شده توسط ++Hadi++ در ‏18 اکتبر 2011
    niny-goloo از این پست تشکر کرده است.
  15. niny-goloo

    niny-goloo Member

    ارسال‌ها:
    73
    تشکر شده:
    23
    امتیاز دستاورد:
    6
    دوست عزیز اقا هادی ممنون بابت جوابت
    من قصد دارم که وقتی کارم با یه Loader تموم میشه اونو پاکش کنم
    شما فرمودید که مساوی Null بزارم؟
    برابر با Null گذاشتن بهتره یا اینکه من کلا اونو removeChild کنم؟
    برای متغییر های ارایه ای هم وقتی که Null بزاریم از مقدار فضای رم استفاده شده کم میشه؟
     
    نوشته شده توسط niny-goloo در ‏18 اکتبر 2011
  16. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,802
    امتیاز دستاورد:
    36
    در مورد پاک کردن لودر
    اگه امکان لود تصویر دیگه ای هست که فقط unloadAndStop یا unload کنین.اولیه واسه فلش پلیر 10 به بالاست و صدا رو هم تو swf لود شده حذف می کنه و کلا خیلی دقیق تره. اولیه تو همشون هست ولی صدا رو حذف نمی کنه و تو پاک کردن چیزای دیگه خیلی حرفه ای نیست.
    ولی اگه دیگه لازمش ندارید، اول unloadAndStop یا unload کنین و بعد اونو از جایی که addChild شده ، removeChild کنین و بعد مساوی null کنین.در نهایت بعد از پاک کردن تمام اشیای به درد نخور و به طبع قبلش غیر فعال کردن و خالی کردنشون، System.gc رو اجرا کنین که همون garbageCollection هست و تو سیستمای روز دنیا، با این دستور، پردازنده و تا حدودی رم، از لوس حضور اشیای Null به درد نخور پاک می شه.
    بای...
     
    نوشته شده توسط ++Hadi++ در ‏18 اکتبر 2011

به اشتراک بگذارید