یکی از چهار مولفه جهان فیزیک، اتصالات (Joints) است. در جهان فیزیک، عنواع اتصالات وجود دارد که یکی از آنها اتصال دَوار یا Revolute Joint است.

اتصال دَوار اتصالی است مانند یک زنجیر که از یک میخ آویزان است.

تابع ساخت اتصال دَوار بین دو جسم:

physics_joint_revolute_create(init1,init2,anchor_x,anchor_y,lower_angle_limit,upper_angle_limit,eneble_limit,max_motor_torque,motor_speed,enable_motor,collideInstances)

اتصال دَوّار اتصالی است مانند یک زنجیر که از سقف آویزان است. میخ محل دورانِ زنجیر است.

از این اتصال می توان برای ساخت یک پل از جنس تناب یا زنجیر و یا یک توپ تخریب گر استفاده کنید.

ساخت یک پل زنجیری ساده:

اولین کاری را که باید بکنیم، فعال کردن جهان فیزیک است. یک room بسازید و  به زبانه Physics بروید. تیک Room is physics World را بزنید و Gravity را 20 تنظیم کنید.

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

ابتدا برای این کار به دو sprite نیاز داریم. زنجیر و جایی که زنجیر را به آن وصل کنیم. من sprite زنجیر را برای شما تهیه کردم.

ChainLinkدریافت

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

نام آن را spr_ChainLink قرار دهید.

توجه کنید که خاستگاه (Origin) را در مرکز قرار دهید.

برای تکیه گاه هم می توانید یک مربع بکشید. توجه کنید که مربع 80*60 باشد (80 ارتفاع) .

نام آن را spr_Anchor قرار دهید.

توجه کنید که خاستگاه را در مرکز قرار دهید.

 حال دو object بسازید. تیک Uses Physics را در هر دو بزنید. سطح برخورد (Collision Shape) را در هرر دو روی Box بگذارید و آن را تنظیم کنید. نام یکی از object ها را obj_ChainLink و اسپرایت spr_ChainLink را به آن انتساب دهید. چگالی (Density) را 10 و Firection را 1 بگذارید. میرایی زاویه ای (Angular damping) را هم 0.2 تنظیم کنید و بقیه را هم 0 کنید.

نام آبجکت دیگر را هم obj_Anchor و اسپرایت spr_Anchor را به آن انتساب دهید. همه خصوصیت ها را 0 کنید. چون نمی خواهیم حرکتی کند.

حال باید یک اتصال دوار بین تمام حلقه های زنجیر ایجاد کنیم. برای این کار ابتدا به رویداد Create آبجکت obj_Anchor بروید و در آن کد زیر را بنویسید:

for (i=0;i<20;i++)
{
Chain[i]=instance_create(x+(i*16),y,obj_ChainLink);
}

در این کد ما یک حلقه for ایجاد کرده ایم که تمام زنجیر هایی که لازم داریم (20 زنجیر) را می سازد و هر کدام از زنجیر ها را در آرایه یک بعدی قرار می دهد.

اگر با حلقه for آشنایی ندارید به لینک زیر بروید:

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

physics_joint_revolute_create(self,Chain[0],x+30,y-40,-40,40,true,0,0,false,false);

مقادیر اول و دوم، اجسامی هستند که به هم وصل می شوند که در اینجا خود obj_Anchor و اولین زنجیر به هم متصل باید بشوند. مقادیر سوم و چهارم هم مکانی است که دور آن می چرخند و به آن متصل هستند. در این جا این مکان گوشه بالا سمت راست تکیه گاه است. سه پارامتر دیگر هم بیشینه و کمینه چرخش را مشخص می کنند.(مقدار true بیشینه و کمینه را فعال کرده تا محدودیت چرخشی داشته باشیم) سه پارامتر بعدی هم به ترتیب بیشترین قدرت گشتاور، سرعت گشتاور و اینکه آیا گشتاور فعال باشد یا نه را مشخص می کند(اگر نفهمیدید مهم نیست.) پارامتر آخر هم مشخص می کند که آیا برخورد بین زنجیر و تکیه گاه (اجسامی که به هم متصل شده اند.) بیفتد یا نه.

حال باید بقیه زنجیر ها را به هم وصل کنیم:

for (i=0;i<19;i++)
{
physics_joint_revolute_create(Chain[i],Chain[i+1],Chain[i].x+8,Chain[i].y,-30,30,true,0,0,false,false);
}

در اینجا ما 19 زنجیر دیگر را با استفاده از حلقه به هم متصل کردیم. حال باید آخرین زنجیر را به تکیه گاه آن طرف پل وصل کنیم. برای این کار نیاز به یک object دیگر داریم زیرا اگر برای آن طرف پل هم از همین object استفاده کنیم دوباره زنجیر ها ساخته می شوند و دوباره و دوباره. پس Game maker به ما Error می دهد. آبجکتی با نام obj_Anchor01 بسازید و اسپرایت spr_Anchor را به آن انتساب دهید. گزینه Uses Physics را تیک بزنید و سطح برخورد آن را تنظیم کنید. سپس کد زیر را در obj_Anchor در ادامه کد قبلی بنویسید:

Anchor=instance_create(Chain[i].x+38,y,obj_Anchor);
physics_joint_revolute_create(Chain[i],Anchor,Anchor.x-30,Anchor.y-40,-40,40,true,0,0,false,false);

این کد ابتدا obj_Anchor01 را می سازد و آن را در متغیر Anchor قرار می دهد.

سپس آن را به آخرین زنجبر وصل می کند.

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



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

همان طور که می دانید کار با جهان فیزیک کمی پیچیده است، به همین دلیل سورسی آموزشی برای شما آماده کرده ایم.

کد های استفاده شده در این مطلب، در سورس هم آمده است و می تواند در یادگیری و آزمون و خطا به شما کمک کند.