درس چهارم

در جاوا تری دی Java 3D

درس چهارم:

 

 

خب بریم که برنامه قبلی رو یه سر و سامونی بهش بدیم.

یادتونه اولی باری که یه مکعب رنگی (ColorCube) ساختیم اونو به یه BranchGroup اضافه کردیم و آخر سر اون BranchGroup رو به SimpleUniverse اضافه کردیم ؟؟؟ یادتونه؟؟؟ خب اون برناه خیلی ساده بود و ما فقط یه شکل تو دنیای سه بعدیمون داشتیم ، وقتی تعداد اشکالمون زیاد بشه به جای اینکه همه شکل ها رو به یه BranchGroup اضافه کنیم یه کار دیگه می کنیم:

اول: یه BranchGroup اصلی می سازیم

دوم: به ازای هر شکلی که ایجاد می کنیم یه BranchGroup فرعی ایجاد می کنیم و شکلمون رو به این BranchGroup فرعی اضافه می کنیم

سوم: به جای اینکه با خود اشکال کار کنیم با BranchGroup های فرعی کار می کنیم و اونا (BranchGroup های فرعی) رو به BranchGroup اصلی اضافه می کنیم (این کار همون گراف بندیست که حرفشو قبلاً زدیم)

چهارم: سر آخر هم اون BranchGroup اصلی رو به SimpleUniverse امون اضافه می کنیم

توجه: می تونیم به جای اینکه BranchGroup های فرعی بسازیم ، اشکالمون رو مستقیماً به BranchGroup اصلی اضافه کنیم ولی من توصیه می کنم که این کار رو نکنید و از روش بالا برای مدیریت اشکالتون استفاده کنید چون این روش ( ایجاد BranchGroup های فرعی) یه مزایایی داره که در ادامه خودتون می بینید.

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

اول یه کلاس به نام WithSwing2 ایجاد می کنیم و کدی رو که دفعه قبل زده بودیم این دفعه هم می زنیم ( می تونید کپی ،پیست هم کنید ولی من این کار رو توصیه نمی کنم) ، به متغیر های عمومی تون یه متغیر دیگه هم اضافه کنید ( همون BranchGroup اصلی مون که اینجا بهش می گیم rootGroup):

تا اینجاش که 99 درصدش شبیه برنامه قبلی بود ، حالا اون rootGroup رو هم new می کنیم و متد addShapes رو هم فراخوانی می کنیم ، این متد رو هم چند لحظه دیگه می نویسیم:

و حالا متد addShapes رو می نویسیم، توی این متد سه تا مکعب رنگی ، یکی بزرگ ، یکی متوسط و یه دونه کوچولو ایجاد می کنیم ،و به ازای هر کدوم از این مکعب ها یه BranchGroup ایجاد می کنیم ،در نهایت هم مکعب ها رو به همون ترتیبی که ایجاد کردیم به rootGroup اضافه می کنیم (منتهی به جای اینکه خود مکعب ها رو به rootGroup اضافه کنیم ، اون BranchGroup هایی رو که ساختیم به rootGroup اضافه می کنیم ) (توجه کنید که ترتیب اضافه کردن به rootGroup مهمه که بعداً متوجه این قضیه میشید ):

خب حالا بر می گردیم به نقطه ای که این متد رو فراخوانی کردیم و اضافه کاری ها رو انجام می دیم( rootGroup رو به universe اضافه می کنیم):

الآن کل کدتون باید این شکلی باشه:

الآن اگه این کد رو اجرا کنید خروجی باید به صورت زیر باشه:

تصویر بالا مربوط به سه تا مکعبه !!!!!!!!!! که بزرگه پشت سره متوسطه است و متوسطه پشت سره کوچیکه ولی چون ما از رو به رو می بینیمشون فکر می کنیم داریم یه مستطیل می بینیم :)

حال بیایید اون دکمه رو که عمری بی کار افتاده اون گوشه رو عملیاتی کنیم ، برای همین کد زیر رو به برنامه اضافه می کنیم( دقیقاً بعد از جایی که این دکمه رو add کردیم) :

مثلاً با این کدمون می خواهیم بگیم که اگه rootGroup چند تا فرزند داشت ، ابتدایی ترین فرزندش رو حذف کن ،یعنی اگه دفعه اول این دکمه رو فشار بدیم باید مکعب بزرگه حذف شه چون اون ابتدایی ترین فرزند rootGroup است!!!! (یادتونه گفتم ترتیب اضافه کردن مهمه؟؟) و همین طور اگه دفعه دوم این دکمه رو فشار بدیم مکعب متوسطه حذف میشه و الی آخر....

ولی خب اگه برنامه رو اجرا کنید و دکمه رو بزنید یه لیست بلند بالایی از Exception میاد جلو روتون و اعصابتون رو میریزه به هم!!!!:) :) :) ولی برای چی یه همچین اتفاقی میافته؟؟؟

چون حالت پیش فرض BranchGroup اینه که بچه هاش به صورت Read_Only بهش اضافه میشن و ثانیاً وقتی یه BranchGroup رو به BranchGroup دیگه اضافه می کنیم حالت پیش فرضش اینه که به صورت جدا ناپذیر به اون BranchGroup اضافه میشه ، برای رفع این مشکل باید یه مقدار دیگه کد بزنیم:

اول : کاری می کنیم که بچه های rootGroup دیگه Read_Only نباشن،برای اینکار خط زیر رو به برنامه اضافه می کنیم(دقیقاً بعد از جایی که rootGroup رو new کردیم):

دوم: به BranchGroup های فرعی ای که برای هر یک از اشکالمون می سازیم این ویژگی رو اضافه می کنیم که جدا پذیر باشند،یعنی متد addShapes رو به صورت زیر تغییر میدیم:

حالا اگه برنامه رو اجرا کنید و اون دکمه رو بزنید ، می بینید که مکعب ها حذف میشن!!

مثل همیشه کد کامل این برنامه رو می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/CODE/WithSwing2.java

نقطه سر خط.