در این بخش می خواهیم با اساسی ترین مفاهیم بازی سازی با pygame یعنی مختصات پیکسلی، اشیا گوناگون pygame آشنا شویم (این بخش را به هیچ وجه سرسری نخوانید و در خواندن آن نهایت دقت را به کار ببندید). درس هایی که در این بخش یاد می گیریم در ساخت هر نوع بازی وجود دارند. )این بخش برای یادگیری مفاهیم پایه ای بازی سازی است. در قسمت های بعدی برنامه نویسی خواهیم داشت.
سیستم مختصات در اصل برای جای دهی یا پیدا کردن جای شی ای در فضا به کار می رود. این فضا ممکن است دو بعدی یا سه باشد. می توان با تعیین مختصات شی، آن را در فضا قرار داد. به طور کلی دستگاه مختصات راهی برای اختصاص مختصات عددی به نقاط هندسی است. در دو بعد، هر نقطه با یک جفت عدد مطابقت دارد. در سه بعد، هر نقطه با یک عدد سه گانه مطابقت دارد و غیره.
سیستم مختصاتی که در مدرسه و دانشگاه با آن آشنا شدیم برای پیدا کردن یا نشان دادن یک نقطه، از یک زوج مرتب استفاده می کرد. زوج مرتب یعنی دو عدد که ترتیب قرار گرفتن آن ها در کنار هم مهم است. به عدد اول مختصه X و به عدد دوم مختصه Y می گویند. سیستم های مختصات مختلفی وجود دارد (دکارتی، قطبی و غیره). سیستم مختصات دکارتی در قرن 17 توسط یک ریاضیدان فرانسوی به نام رنه دکارت ایجاد شد. می توان مختصات یک نقطه را از یک سیستم به سیستم دیگر تبدیل کرد.
در بازی سازی برای جای دادن تصویر ها، کشیدن اشکال، قرار دادن دکمه ها و متن ها و به طور کلی برای تعیین موقعیت هر چیزی باید از یک سیستم مختصات استفاده کنیم. در این سری آموزشی ما از سیستم مختصات پیکسلی و جعبه ای استفاده می کنیم.
بازی ها از دستگاه مختصات ویژه خود به نام مختصات پیکسلی استفاده می کنند. علاوه بر این دستگاه از مختصات جعبه ای هم استفاده می کنیم.
برنامه Hello World که در جلسه پیش آن را یاد گرفتیم یک پنجره ساده بود. این پنجره از نقاط مربعی کوچکی تشکیل شده است که به آن ها پیکسل می گوییم. هر پیکسل به طو پیش فرض مشکی است اما می تواند رنگ های دیگری هم داشته باشد. برای نشان دادن جای اشیا می توانیم از این پیکسل ها استفاده کنیم. در این حالت یک شکل وقتی که در پنجره قرار می گیرد پیکسل های زیادی را اشغال می کند. پس برای نشان دادن این شکل باید چه کار کنیم؟
راه حلی که برای این مشکل وجود دارد این است که تنها دو پیکسل از بی شمار پیکسلی که تصویر اشغال می کند را استفاده کنیم. این دو پیکسل در گوشه بالا و سمت راست تصویر هستند. به شکل زیر نگاه کنید:
در تصویر بالا، مختصات گوشه سمت چپ بالا جعبه سفید (70,65) است. (به تصویر خوب نگاه کنید) مختصات گوشه سمت چپ بالا پنجره (0,0) است. عدد اول برای X و عدد دوم برای Y است. (این تصویر مربوط به یکی از بازی هایی است که می خواهیم بنویسیم.) تفاوت مختصات پیکسلی با دکارتی این است که، در دستگاه مختصات پیکسلی جهت مثبت محور Y رو به پایین است. به تصویر زیر نگاه کنید تا بهتر متوجه شوید :
پس در این دستگاه اگر در جهت Y حرکت کنیم و اگر پایین بیاییم مقدار Y افزایش می یابد و اگر بالا برویم Y کاهش می یابد.
فرض کنید که به جای یک شی screeen یا همان پنجره که 400 پیکسل طول و 300 پیکسل عرض دارد، یک شی screen دیگری داریم که 8 پیکسل در 8 پیکسل است. اگر این screen کوچک 8x8 را بزرگ کنیم به طوری که هر پیکسل مانند یک مربع در یک جدول به نظر برسد و برای محور X و Y آن اعدادی را درنظر بگیریم، آن گاه یک نمایش خوب از شی screen می تواند چیزی شبیه به تصویر زیر باشد :
با استفاده از سیستم مختصات دکارتی می توانیم جای یک پیکسل خاص را پیدا کنیم. در تصویر بالا هر ستون محور X و هر سطر محور Y دارای یک نشانی خاص می باشد. این نشانی یک عدد صحیح بین 0 تا 7 است. (زیرا هشت تا مربع داریم که از0 تا 8 شماره گذاری شده اند )جای هر پیکسل را می توان با مشخص کردن دو عدد صحیح در محورهای X و Y پیدا کنیم. به عنوان نمونه، در تصویر 8x8 بالا می بینیم که پیکسل ها در نقاط زیر هستند :
(4,0),(2,2),(0,5),(5,6) پیکسل های مشکی
(2,4) پیکسل خاکستری
توجه داشته باشید که عدد اول برای مختصات X و عدد دوم برای مختصات Y است. Pygame معمولا مختصات را به صورت یک تاپل دو تایی از دو عدد صحیح مانند (4,0) نشان می دهد. (اگر علاقه داشتید می توانید برای آشنایی با مختصات دکارتی به نشانی اینترنتی http://invpy. com/chap12 نگاهی بیندازید). همان طور که می بینید کارکردن با مختصات جعبه ای آسان تر است. ولی همیشه نمی توان از آن استفاده کرد.
پس نتیجه می گیریم که برای تعیین مکان یک تصویر یک شی یک شکل و غیره دو روش مختصات پیکسلی و جعبه ای را داریم. با توجه به نیازی که داریم می توانیم از هر کدام از آن ها که خواستیم استفاده کنیم. حتی می توان در یک بازی از هر دو آن ها نیز بهره جست.
در زیر با چند نمونه از اشیا کاربردی pygame آشنا می شویم. با سایر اشیا pygame در طول این سری آموزشی آشنا می شویم. این اشیا بسیار کاربردی هستند و در واقع مفصل هایی هستند که قسمت های مختلف بازی را به هم متصل می کنند. در زیر با سه نمونه از آن ها آشنا می شویم.
اشیا Surface اشیایی هستند که یک تصویر مستطیلی دو بعدی یا 2D را نشان می دهند. از بسیاری جهات صفحه نمایش مانند یک کاغذ خالی است که می توانید روی آن تصویر رسم کنید. . پس پنجره که در قسمت های قبل رسم کردن آن را یاد گرفتیم یک شی است. نام این شی Surface object یا شی سطح است. پیکسل های شی Surface را می توان با صدا زدن توابع رسم Pygame تغییر داد و سپس آن ها را روی صفحه نشان داد. حاشیه دور پنجره که به آن border می گوییم، نوار عنوان و دکمه ها بخشی از شی Surface هستند. شی Surface با فراخوانی pygame. display. set_mode ایجاد می شود. هر چیزی که در شی Surface یا همان پنجره کشیده شده باشد با فراخوانی pygame. display. update، روی پنجره نشان داده می شود. پس شی سطح(Surface) را با pygame. display. set_mode می سازیم و آن را با pygame. display. update در پنجره نمایش می دهیم.
هر تغییری که در پنجره ایجاد کنید در واقع در پس زمینه اتفاق می افتد و در صفحه نمایش واقعی که کاربر آن را مشاهده می کند تا زمانی که متد های update یا flip را فراخوانی نکنیم، نمایش داده نمی شود. متد update صفحه را با تمام تغییراتی که در پس زمینه ایجاد شده دوباره ترسیم می کند. این متد یک پارامتر اختیاری دارد که به ما اجازه می دهد فقط یک جای خاص از صفحه نمایش را به روزرسانی کنیم (متد update این کار را با استفاده از شی Rect که نشان دهنده یک منطقه مستطیل شکل روی صفحه است انجام می دهد). متد flip همیشه کل نمایشگر را تازه می کند (و به همین ترتیب دقیقا همان روش به update () را بدون پارامتر انجام می دهد)
معمولا برنامه چندین چیز مختلف را در یک شی Surface ترسیم می کند. پس از هر تکرار حلقه که همه چیز را در شی Surface رسم کردیم سپس می توانیم آن را در صفحه نمایش ترسیم کنیم. به همه کارهای رسم کردن در هر تکرار حلقه فریم می گوییم و دقیقا مانند تصویر ثبت شده روی یک DVD است. کامپیوتر می تواند فریم ها را خیلی سریع ترسیم کند. معمولا برنامه های ما با 30 فریم در ثانیه اجرا می شوند که "نرخ فریم" نامیده می شود.
pygame برای نشان دادن نواحی مستطیلی دو راه دارد (دقیقا مانند دو روش برای نمایش رنگ ها). روش اول استفاده از چهار عدد صحیح است :
1. مختصات X از گوشه بالا سمت چپ 2. مختصات Y از گوشه بالا سمت چپ 3. عرض مستطیل 4. طول مستطیل
یعنی داریم:
مستطیل با 4 عدد مشخض شده است <= (X,Y,WIDTH,HEIGHT)
راه دوم به عنوان یک شی pygame. Rect است که ما به اختصار آن را اشیا Rect می نامیم. به عنوان نمونه، کد زیر یک شی Rect با یک گوشه بالا سمت چپ در (10, 20) ایجاد می کند که 200 پیکسل عرض و 300 پیکسل طول دارد :
>>> import pygame >>> spamRect = pygame. Rect(10, 20, 200, 300) >>> spamRect == (10, 20, 200, 300) True
نکته مفید در این مورد این است که شی Rect بطور خودکار مختصات را برای سایر ویژگی های مستطیل محاسبه می کند. به عنوان مثال، اگر شما نیاز به مختصات X لبه سمت راست شی pygame. Rect داشته باشیم که در متغیر spamRect ذخیره کرده ایم، می توانید از شی right استفاده کنید مانند زیر:
>>> spamRect. right 210
کد Pygame برای شی Rect به طور خودکار محاسبه می کند که اگر لبه سمت چپ در X مختصات 10 باشد و مستطیل 200 پیکسل عرض دارد، باید لبه سمت راست مختصات X عدد 210 باشد. اگر ویژگی right را مجددا تنظیم کردید سایر ویژگی ها بطور خودکار محاسبه مجدد می شوند:
>>> spam. right = 350 >>> spam. left 150
کلاس Rect متدهای زیر را برای تشخیص برخورد دو شکل دارد (کار کردن با آن ها را در درس های بعدی فرا می گیریم):
نام متد | کار متد |
()pygame. Rect. collidepoint | بررسی می کند آیا در یک مستطیل، مستطیل دیگری وجود دارد یا نه ؟ |
()pygame. Rect. collidepoint | بررسی می کند آیا در مستطیل، نقطه وجود دارد یا نه ؟ |
()pygame. Rect. colliderect | برای بررسی هم پوشانی دو مستطیل به کار می رود |
()pygame. Rect. collidelist | بررسی می کند آیا یک مستطیل،در لیست برخورد ها قرار دارد یا نه ؟ |
()pygame. Rect. collidelistall | بررسی می کند آیا همه مستطیل ها،در لیست برخورد ها قرار دارند یا نه ؟ |
()pygame. Rect. collidedict | بررسی می کند آیا یک مستطیل،در دیکشنری برخورد ها قرار دارد یا نه ؟ |
()pygame. Rect. collidedictall | بررسی می کند آیا همه مستطیل ها،در دیکشنری برخورد ها قرار دارند یا نه ؟ |
کلاس Rect هم چنین متد move را برای حرکت و inflate را برای تغییر اندازه مستطیل فراهم می کند.
شی Clok برای ردیابی زمان مورد استفاده قرار می گیرد. به طور خاص می توان از آن برای تعریف نرخ فریم برای بازی استفاده کرد. تعداد فریم در واحد ثانیه است. این کار با استفاده از Clock. tick انجام می شود. این متد باید فقط یکبار فراخوانی شود. به عنوان نمونه فراخوانی clock. tick (30)، برنامه را با سرعت 30 فریم در ثانیه اجرا می کند.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.