مقدمه ای بر جهان فیزیک:

یکی از موتور های بسیار کاربری و جالب GameMaker: studio، موتور فیزیکی و جهان فیزیک آن است. در جهان فیزیک و یا موتور Box2D، اجسام دارای ویژگی هایی همچون چگالی، اصطکاک، میرایی خطی و... هستند و تقریبا از قوانین فیزیک پیروی می کنند. توسط جاذبه به پایین کشیده می شوند، به راحتی به هم برخورد می کنند و با زاویه مناسب می چرخند. Box2D در ایران هنوز به خوبی جا نیفتاده و افراد کمی کار با جهان فیزیک را بلد هستند. بلکه بازی ساز ها هنوز از Extreme Physics استفاده می کنند. کار با Extreme Physics خیلی سخت تر و دشوار تر از کار با Physics World است. به دلیل اینکه در Extreme Physics همیشه باید از کد ها و یا اکشن ها استفاده کرد. اما در Physics World که مختص GameMaker: Studio است می توان از زبانه های از پیش آماده شده در خود Object و یا Room برای تنظیم سطح برخورد، جاذبه، اصطکاکِ اجسام و... استفاده کرد که کار را بسیار دل چسب تر می کند. با این کار با Physics World آسان تر از Extreme Physics است، اما باز هم دشواری خود را دارد. توابع، متغیر ها و دستورات فراوانی مربوط به این جهان است که برای یاد گرفتن آنها باید وقت بسیار زیادی گذاشت. برای ما ایرانی ها و فارسی زبان ها هم بسیار کار سخت تر شده، زیرا سایت های آموزشی مربوط به Box2D انگلیسی هستند و توان آموزشی ما را بسیار کمتر کرده است.

اگر تعریف از خود نباشد، بیاموز اولین سایتی است که GameMaker را به طور گسترده و در تمام مباحث آموزش می دهد، مخصوصا جهان فیزیک!

حال که با جهان فیزیک آشنا شدید به سراغ آموزش می رویم.

موتور فیزیکی چهار مولفه اصلی دارد که پایه و اساس بازی سازی با Box2D است. این چهار مولفه عبارتند از:

1-جهان فیزیک و اصول فیزیک یا physics world

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

2-ادوات و چفت و بست یا Fixtures

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

3-اتصالات و یا Joints

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

4-نیرو ها و یا Forces

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

در ابتدا باید جهان فیزیک را فعال کنیم تا بتوانیم از توابع مربوطه و قوانین استفاده کنیم.

برای این کار در Game maker.studio یک Room جدید بسازید. به قسمت Physics بروید.

فعال سازی جهان فیزیک

 و گزینه Room is physics World برای فعال کردن جهان تیک بزنید. در قسمت Physics Porld Properties باید دو گزینه را مقدار دهی کنید. Gravity و Pixels To Meters

Gravity مربوط به جاذبه ای است که بر اجسام وارد می شود. در این قسمت می توانید جاذبه ای در سمت محورهای X و Y و بدهید ولی اگر می خواهید بازی واقعی تر بشود فقط Y را مقدار دهی کنید. می توانید هر مقداری بدهید مثلا 20. گزینه Physics Porld Properties مشخص می کند که هر چند متر را برابر چند پیکسل قرار دهد. موتور فیزیکی بر مبنای جهان واقعی اندازه گیری و محاسبه می کند پس باید این گزینه را درست مقدار دهی کنیم. این گزینه را بر روی مقدار پیشفرض قرار دهید یعنی 0.1. (حدود 10 سانتی متر)

حال جهان فیزیک در room ما فعال شده است. اما به این معنا نیست که هر شئ که در room است از قوانین فیزیک پیروی کند. جهان فقط در room فعال است.

برای اینکه یک object را در جهان فیزیک فعال کنیم اول باید یک sprite بسازید. توجه کنید یک object در جهان فیزیک حتما باید یک sprite داشته باشد. یک sprite بسازید و نام آن را spr_Pillar بگذارید. به Edit Sprite بروید و یک ستون ساده بکشید و Origin (خاستگاه) را در مرکز قرار دهید.

کشیدن مستطیل

حال یک object بسازید. نام آن را obj_Pillar بگذارید و spr_Pillar را به آن انتساب دهید. برای فعال کردن آن در جهان فیزیک تیک Uses Physics را فعال کنید. با فعال کردن این گزینه قسمتی به نام Physics Properties به وجود می آید که مربوط به ویژگی های object است.

تنظیم قوانین فیزیک آبجکت

قسمتی دیگر به نام Collision Shape وجود دارد که مربوط به سطح برخود جسم است که دارای سه گزینه است:

1-Cirsle (دایره) این گزینه برای شکل های دایره ای کاربرد دارد. توجه کنید از این گزینه نمی توان برای اشکال بیضی شکل استفاده کرد.

2-Box (جعبه) برای اشیا مستطیل شکل و مربع شکل.

3-Shape (شکل چند ضعلی) این گزینه برای شکل هایی مانند متوازی الاضلاع کاربرد دارد. مشکل این گزینه این است که فقط برای اشکال محدب کاربرد دارد و اگر سطح برخورد شما مقعر باشد به شما Error می دهد.

شکل ما مستطیل است پس گزینه Box را انتخاب کنید و برای تنظیم سطح برخورد روی Modify Collision Shape کلیک کنید.

تنظیم سطح برخورد

چون ما origin را روی مرکز قرار داده ایم دیگر نیاز به تنظیم سطح برخورد نیست. اما همیشه به این قسمت سری بزنید و از درست بود سطح بر خورد مطمئن شوید.

خوب حال که شکل آماده استمی توانیم بقیه خصوصیات را هم تنظیم کنیم. شش خصوصیت وجود دارد:

Density (چگالی) : چگالی جسم (نسبت جرم به حجم) را نشان می دهد. می توانید از این گزینه برای سنگین کردن اجسام استفاده کنید.

Restitution (ارتجاع) : مقدار فنریت یک جسم را تعیین می کند. مثلا اگر قابلیت ارتجاع یک جسم را 0 کنیم و قتی به زمین می خورد دیگر بالا نمی آید. توجه کنید که شکل جسم را تغییر نمی دهد.

Collision group (گروه برخورد) : اگر این مقدار یک عدد مثبت باشد فقط با اشیا درون گروه خود برخورد می کند و اگر منفی باشد این معنی را می دهد که اشیا در آن گروه با هم برخورد نمی کنند. اگر 0 باشد باید برای هر object یک رویداد برخورد (Collision Event) تنظیم کرد تا با هم برخورد کنند.

Liner damping (میرایی خطی) :باعث کاهش سرعت جسم در زمان حرکت می شود. می توانید این مورد را استحکاک در هوا هم بنامید.

Angular damping (میرایی زاویه ای) :باعث کاهش مقدار نوسان یک جسم می شود. (کاهش جابه جایی دورانی جسم.)

Friction (اصطکاک) :نیرویی است که در جهت مخالف حرکت جسم به جسم وارد می شود. تفاوت آن با میرایی خطی این است که در میرایی خطی اگر با جسمی هم برخورد نکنیم آخر اصطحکاک بر ما وارد می شود ولی در Friction باید با جسم دیگری برخورد کنیم. (مانند کشیدن لاستیک به زمین)

حال مقدار چگالی را 10، مقدار ارتجاع را 0.2 و اصطحکاک را 0.2 و بقیه را 0 بگذارید.

تنظیم خصوصیات جسم

حال باید زمین بسازیم.

اسپرایتی با نام spr_Erth بسازید. یک مربع 32 در 32 بکشید و خاستگاه را روی مرکز قرار دهید.

تنظیم اسپرایت

آبجکتی با نام obj_Erth بسازید و sprite مربوطه (spr_Erth) را به آن انتساب دهید.

گزینه Uses Physics را فعال کنید. سطح برخورد را روی Box بگذارید و آن را تنظیم کنید.

سطح بر خورد

از آنجایی که زمین ثابت است چگالی را 0 بگذارید. مقدار ارتجاع و بقیه موارد را هم 0 کنید. فقط زمین اصطکاک دارد. آن را 1 بگذارید.

تنظیم آبجکت زمین

حال باید کاری کنیم که obj_Pillar یه obj_Erth برخورد کند. ما برای این کار از گروه برخورد (Collision group) استفاده نمی کنیم چون مدت پردازش بازی را بالا می برد.

پس برای این کار به obj_Pillar بروید و در رویداد برخورد، رویداد برخوردِ obj_Erth را انتخاب کنید. شما می دانید که اگر در رویدادی کدی ننویسیم، آن رویداد به صورت خودکار پاک می شود. برای رفع این مشکل یک comment بسازید و در آن هر چه می خواهید بنویسید.

حال به room بروید و یک ردیف obj_Erth بگذارید. یک obj_Erth دیگر هم بر روی آنها بگذارید (مانند یک نا همواری) . سپس obj_Pillar را در بالای آن زمین برامده بگذارید. برای آزادانه تکان دادن object کلید Alt را بگیزید. مثل تصویر زیر.

اگر همه چیز درست پیش رفته باشد مانند فیلم زیر می شود:


دریافت
مدت زمان: 6 ثانیه

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