تازه های سایت

ساخت بازی Peggle Nights – بخش دوم

سلام خدمت دوستان عزیز
در بخش دوم این مقاله قصد داریم نگاهی مختصر و کوتاه به ساختار کتابخونه Box2D بندازیم. در واقع برای شروع نوشتن این بازی نیاز داریم تا با قسمت های مختلف باکس تو دی آشنا بشیم.
همونطور که گفتم یه موتور فیزیکی ( مثل Box2D ) وظیفه اش این که اشیایی که بهش داده میشه رو به بهترین وجه ممکن شبیه سازی کنه. هدف اصلی از ایجاد این کتابخونه هم در واقع ایجاد کتابخونه ای برای ساخت بازی بوده. این کتاب خونه توسط شخصی به نام Erin Cato نوشته شده و در حال حاضر توسط ایشان مدیریت میشه.
جالبه بدونید که باکس تو دی به زبان سیپلاس پلاس نوشته شده و لی در حال حاضر برای زبان های مختلفی پورت شده است.مثلا برای فلش یا برای جاوا. حتی پایتون و سی شارپ و جاوا اسکریپت. مثلا شاید چیزی مثل Google Gravity با این کتابخونه نوشته شده.


برای اینکه بتونیم و بتونید با باکس تو دی کار کنید نیازه که یه سری تعریف رو بدونید که اینجا با هم یه مروری شون می کنیم:
Bodies
Body ها در واقع یه مفهوم اساسی در یه صحنه فیزیکیه. ولی منظور از Body چیزی نیست که توی یه صنه این طرف و اون طرف بره یا با بقیه برخورد کنه. بذارید بیشتر توضیح بدم در واقع منظور از Body مشخصاتی از یک شی است که نه قابل دیدن است نه قابل لمس کردن مثلا چی؟ مثلا:

  • جرم
  • سرعت
  • مکان
  • زاویه
  • و…

حتی اگه تمام اطلاعات بالا رو بدونیم باز هم نمیشه تعیین کرد که Object ما چه شکلیه. یا وقتی به یه شی خورد چه طوری عمل میکنه. برای مشخص کردن سایز و اندازه و شکل یه شی من مجبورم از مفهومی به نام Fixture ها هم استفاده کنم که بعدن توضیح داده خواهند شد.
خوب ما سه نوع Body داریم

  1. Static
  2. Dynamic
  3. Kinematic

نوع های اول و دوم که واقعا واضحه چیا هستند. و در مورد نوع سوم که بعدا بیشتر خواهیم یافت. نوع اول اشیایی رو تعیین میکنه که هیچ حرکتی ندارند. مثلا توی یه بازی زمین ما یه شی Static هستش. نوع سومم که اشیایی هستند که حرکت میکنن.
خوب بذارید کار رو با  ساختن یه Body شروع کنیم.
ساختن یک Body 
معمولا تمام کلاس هایی که در Box2D هست با b2 شروع میشه.

برای اینکه تعاریف یه شی رو داشته باشیم باید از کلاس b2BodyDef استفاده کنیم.

b2BodyDef myBodyDef;
myBodyDef.type = b2_dynamicBody;
myBodyDef.position.Set(0, 20);
myBodyDef.angle = 0;

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

خوب شاید براتون جالب باشه که چرا ما جرمی به این شی نسبت ندادیم. این ویژگی با استفاده از Fixture ها به یک شی اضافه خواهد شد. خوب بحث Body رو همین جا نگهش دارید تا با یه مفهوم مهم دیگه آشنا بشیم و اونم دنیا است !

World 

برای این که بتونیم با باکس تو دی کار کنیم نیاز داریم یه دنیا داشته باشیم. این دنیای ما یه بردار جاذبه خواهد داشت و کلیه اشیا به این دنیا اضافه میشند و شبیه سازی در این دنیا انجام میشه. نکته مهم اینه که وظیفه مدیریت حافظه اشیای ساخته شده بر عهده همین دنیای بد بخته :p . برای تعریف دنیا یه کلاسی داریم به نام b2World که به صورت زیر ازش استفاده میکنیم:

    b2Vec2 gravity(0, -9.8);
    bool doSleep = true;
    b2World* myWorld = new b2World(gravity, doSleep);

بردار های دو بعدی توی Box2D با استفاده از کلاس b2Vec2 بیان میشند. مثلا اینجا برای اینکه اینجا یه دنیا داشته باشیم باید یه بردار شتاب براش بسازیم که تعیین کنه شتاب این دنیا چه طوریه . که شتاب این دنیا دقیقا مثل یه دنیای واقعی یه.نکته ای که باید دقت کرد اینه که شتاب تنها رو اشیایی که Dynamic هستند تاثیر داره و نه اشیای ثابت. پارامتر دوم هم برای بهبود کاراییه. با ست کردن اون شما اجازه میدید اشیایی که هیچ حرکتی فعلا ندارند به وضعیت sleep برند. امکان داره با برخورد یه شی دیگه بهشون از این حالت در بیان.

خوب همونطور که گفتم ساختن اشیا توی باکس تو دی به این صورته که باید دنیای ما از اونا باخبر باشه. پس اگه بخوایم مثلا یه Body از اون تعاریفی که توی b2BodyDef داشتیم بسازیم باید از توابعی که در کلاس b2World هست استفاده کنیم:

b2Body* dynamicBody = m_world->CreateBody(&myBodyDef);

با اجرای خط بالا دنیای ما دارای یک Body خواهد شد که همانطور که گفتم قابل نمایش و استفاده نیست تا زمانی که به آن مشخصات دیگه ای اضافه بشه.

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

موفق باشید.

۱,۶۵۹ total views, 1 views today

Print Friendly
Facebook0Google+0Twitter0LinkedIn0

درباره‌ی سعید دادخواه

یه برنامه نویس !

یک نظر

  1. فکر کنم در این خط اشتباهی رخ داده(شاید هم من اشتباه میکنم)!!
    b2Body* dynamicBody = m_world->CreateBody(&myBodyDef);
    بجای m_world فکر کنم باید نوشته بشه myWorld

جوابی بنویسید

ایمیل شما نشر نخواهد شد.خانه های ضروری نشانه گذاری شده است. *

*


8 × دو =