برنامه نویسی - C ++ - کاربرد زبان c در بازی سازی-قسمت دوم- صفحه 1

کاربرد برنامه نویسی ++ C در بازی  رایانه ای - آشنایی با Direct X - قسمت دوم

مترجم : امیر نوری

 

 بخش اول: در مورد تابع PeekMessage و تفاوت هاش با برادر دست و پا گیرش یعنی GetMessage صحبت می کنیم.
درواقع تابع getmessage مشکلی نداره ؛ولی برای ساخت بازی مناسب نیست و همینم دلیل استفاده ما از تابع peekmessage است .


ساختار حلقه GetMessage

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


 

بعد از اینکه ما پنجره را میسازیم داخل حلقه رویدادها میشیم جایی که تابع getmessage را میبینیم سپس getmessage منتظر یک پیام میمونه و به محض دریافت پیام اونو به مرحله بعد یعنی translatemessage میده.این ترتیب کار برای برنامه نویسی ویندوز کاملا منطقیه چون مثلاً تو برنامه ای مثل word برنامه منتظر میمونه تا شما کاری کنید و بعد به اون پاسخ بده ولی تو یک بازی در این زمان انتظار برای پیام ما باید 30 یا 60 تصویر گرافیکی 3 بعدی در ثانیه به روی صفحه بکشیم بدونه هیچ تاخیری. چون ویندوز اگه پیغامی را بفرسته قطعاً اونو 30 بار در ثانیه نمیفرسته.



تابع جدید  PeekMessage


کاری که ما برای حل مشکل تأخیر در برنامه میکنیم؛ استفاده از تابع peekmessage به جای getmessage  است. این تابع در اصل همون کار getmessage را میکنه با این تفاوت که منتظر چیزی نمیشینه. peekmessage  به صف پیام ها نگاه میکنه و میبینه که آیا پیامی منتظر هست یا نه؟ اگه نیست برنامه کار خودشو تا آخر حلقه ادامه میده و به ما اجازه میده که کاری را که میخوایم را بکنیم.نمودار زیر حلقه ما را با peekmessage نشون میده.

 



قبل از اینکه بیشتر جلو بریم اول باید یه نگاهی به تابع peekmessage بندازیم:


 


چهار پارامتر اول مثل getmessage هست ولی پنجمی یعنی  wRemoveMsgجدیده.
این پارامتر میگه که چطوری با پیام آمده رفتار کنه که دو حالت داره:
PM_REMOVE و PM_NOREMOVE

اولی یعنی اینکه پس از پردازش پیام اون پاک بشه و دومی یعنی اینکه پاک نشه . ما از اولی استفاده میکنیم .(البته این پارامتر نکات دیگه هم داره) در زیر برنامه ما بعد از تغییرات و تابع جدید peekmesage است:

 



خوب حالا در مورد کد ...
while   ( TRUE

خوب طبیعتا این یک حلقه نامحدود که بعدا ما برای خارج شدن از بازی از این حلقه خارج میشیم.
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)

چون ما دیگه برای پیام هایی که می آیند؛ صبر نمیکنیم و فقط میگیرم ببینیم چی توش هست ؟ از یک if استفاده میکنیم که اگه peekmessage مقدار true را بده یعنی یک پیام آمده؛ اگه false بده یعنی پیامی نیست .خوب حالا اگه پیغامی نیامده باشه ما به بازی خودمون ادامه میدیم ولی اگه پیامی آمده باشه فقط یه راه رو امتحان میکنیم اونم خارج شدن از برنامست !
if (msg.message == WM_QUIT)

در اینجا چک میکنه که آیا پیام ما WM_QUIT که به معنی اینه که زمان پایان حلقه نامحدود رسیده و با خارج شدنش ؛ ما به ویندوز برمیگردیم.توجه کنید که در تابع getmessage اگر زمان خارج شدن بود همیشه 0 بازگشت میداد و بدین طریق خودش از حلقه خارج میشد ولی اینجا ما خودمون باید اینکارارو بکنیم.

©  Copyright 2010/ Animationdata.com & Partners

 

                             صفحه 1                   صفحه 2              عناوین مطالب

                                      

آمار بازدیدکنندگان

آنلاین: 5
امروز: 660
دیروز: 292
ماه: 1710
سال: 9078
کل: 191237
آخرین بازدید: 22:23