View Full Version : حلقه اصلی بازی
1485159
سه شنبه 10 فروردین 1389, 17:38 عصر
سلام
من دارم یه انجین خیلی ساده طراحی میکنم که در یه قسمتی از اون مشکل دارم:
فرض کنید انجین میخواد صفحه رو بروز کنه، باید چگونه عکل کنه؟
حلقه
{
اگر پیامی هست آنرا پردازش کن
صفحه را بروز کن
}
حلقه
{
اگر پیامی هست آنرا پردازش کن و به ابتدای حقه باز گرد
صفحه را بروز کن
}
ممنون.
1485159
سه شنبه 10 فروردین 1389, 17:52 عصر
درضمن منظور از پیام، پیام هایی هست که ویندوز به برنامه ارسال میکنه هست!
pswin.pooya
سه شنبه 10 فروردین 1389, 23:59 عصر
مورد دوم منظقی تر به نظر میرسه
بهتر به شکل زیر عمل کنی:
1. پردازش پیام ها
2. هوش مصنوعی
3. فیزیک
4. گرافیک
البته فکر کنم اگر جای هوش مصنوعی وفیزیک عوض بشه بهتر باشه. مثلا اول برخورد رخ بده بعدش هوش مصنوعی عمل کنه.
1485159
چهارشنبه 11 فروردین 1389, 08:52 صبح
مورد دوم منظقی تر به نظر میرسه
در مورد دوم بازگشت به ابتدای حلقه چه لزومی داره؟
بهتر به شکل زیر عمل کنی:
1. پردازش پیام ها
2. هوش مصنوعی
3. فیزیک
4. گرافیک
البته انجین من فقط گرافیک داره(فعلا)!:لبخند:
pswin.pooya
چهارشنبه 11 فروردین 1389, 11:55 صبح
برای حلقه اصلی و کنترل پیام باید کاملا معتادانه عمل کنی. مثلا بعضی از پیام ها مثل حرکت ماوس به صورت یه مسلسل (machine gun) تولید پیام می کنن و یه عالمه message داخل صف پیام میریزن (باید از این حرکت جلوگیری کنی) که این امر باعث میشه که یه افت پرفرمانس شدید پیدا کنی.
بازگشت به ابتدای حلقه هم لازم نیستش میتونی دستور GetMessage رو داخل یه حلقه داخلی بندازی.
بهتره به فصل چهارم کتاب Beginning game programming ، ویرایش دوم و یا فصل اول و دوم کتاب Begingin OpenGL Game Programming مراجعه کنید.
1485159
چهارشنبه 11 فروردین 1389, 13:25 عصر
میتونی دستور GetMessage رو داخل یه حلقه داخلی بندازی.
میشه یه مقدار بیشتر توضیح بدی؟
SeganX
شنبه 08 خرداد 1389, 02:42 صبح
سلام دوست من.
ویندوز هیچ پیامی رو زورکی به برنامه نمی فرسته. وقتی که شما پنجره ای می سازید ویندوز صفی از پیامها برای اون میسازه و پیام هایی که میرسه وارد او صف میشه. این شما هستید که پیام ها رو به ترتیب از او صف می خونید، ترجمه می کنید و بعد پاس می دید به یه تابعی که معمولا اسمش wndproc هستش. در این تابع چک می کنید که ببینید پیام رسیده چی هستش.
ویندوز پیام های سلسله وار مثل ماوس و کیبورد رو فیلتر می کنه تا رگبار پیام پیش نیاد. این کار سرعت دسترسی به ماوس و کیبورد رو کم می کنه و علت اینکه تو بازی ها از input devices استفاده می کنند همینه. بنابر این نگران مسلسل پیام ها نباش.
بهتر که بعد از هربار ترجمه و پردازش پیام فورا به ابتدای حلقه برنگردی. چون اونوقت هر بار که پیامی می رسه دیگه بازی آپدیت نمی شه. درسته؟
بهتر اینه که تنها پیام های مهم و بحرانی مثل WM_QUIT رو استثنا قرار بدی.
چیزی مثلا شبیه به این. البته این فقط یک مثال:
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
UpdateTimer();
UpdateInputs();
UpdatePhysics();
UpdateAI();
// Update sounds and graphics
} // while( ...
PeekMessage یک پیام را از صف پیام ها بر می گرداند. پرچم PM_REMOVE سبب می شه که بعداز برداشتن پیام، اون پیام از صف پاک بشه.
TranslateMessage پیام رسیده رو ترجمه می کنه. مثلا کد های رسیده از کیبورد رو بسته به زبان ویندوز ترجمه می کنه و کد کاراکترها رو تصحیح می کنه و ...
DispatchMessage این تابع هم پیام های ترجمه شده رو می فرسته به همون تابع wndproc که توش باید نوع پیامهای رسیده رو برسی کنین و بر حسب او تصمیم بگیرید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.