سلام!

این جلسه می خواهیم event های مربوط به keyboard را مورد بررسی قرار دهیم.

اگر event اتفاق افتاده مربوط به فشردن یک دکمه از کیبورد باشد، آن گاه مقدار event.type برابر با SDL_KEYDOWN خواهد بود. در این صورت در event.key.keysym.sym دکمه ی فشرده شده قرار خواهد گرفت. به عنوان مثال می خواهیم ببینیم که آیا کاربر دکمه ی escape را فشار داده است یا نه؛

if ( event.type == SDL_KEYDOWN )
    if ( event.key.keysym.sym == SDLK_ESC )
        cout << "Escaped!" << endl;

لیست کامل مقادیر ممکن برای event.key.keysym.sym را می توانید در این جا مشاهده کنید.

اگر event ای که اتفاق افتاده است، رها کردن یک دکمه از کیبورد باید، آن گاه مقدار event.type برابر با SDL_KEYUP خواهد بود. اگر این اتّفاق بیافتد، باز هم کلید رها شده در event.key.keysym.sym موجود است. به عنوان مثال به کد زیر توجّه کنید.

if ( event.type == SDL_KEYUP )
    if ( event.key.keysym.sym == SDLK_ESC )
        cout << "Esc key is up now!" << endl;

تا این جا فشرده شدن و رهاسازی دکمه های کیبورد را handle کردیم. حالا می خواهیم ببینیم که آیا هنگامی که این کلید ها فشرده می شوند، کلید های modifier (مثل ctrl، shift و...) هم پایین هستند یا نه.

برای این کار باید از مقدار موجود در event.key.keysym.mod استفاده کنیم. طرز استفاده از آن را در کد زیر می بینید.

if ( event.type == SDL_KEYDOWN ){
    if ( event.key.keysym.mod != 0 ){
        if ( event.key.keysym.mod & KMOD_CTRL )    cout << "Control is down!" << endl;
   }
}

لیست کامل تمامی مقدار های ممکن برای modifier ها و SDL_Keysym را می توانید در این جا مشاهده کنید.

برای تمرین، برنامه ای بنویسید که:

۱. هرگاه کلیدی فشرده یا رها شد، اسم آن را به همراه اتّفاقی که برای آن افتاده چاپ کند (برای این کار از تابع SDL_GetKeyName استفاده کنید.).

۲. همراه با اسم کلید مورد نظر، modifier موجود را چاپ کند (تنها کلیدهای ctrl و alt و shift را چک کنید.).

۳. وقتی که کاربر ماوس را تکان داد، بگوید که آیا modifier یا کلیدی هم فشرده شده است یا نه (دقّت داشته باشید که هنگامی که event.type مربوط به کیبورد نباشد، دیگر نمی توانید از مقدار موجود در event.key.keysym.mod استفاده کنید.). راهنمایی: یک آرایه درست کنید و وضعیت هر کلید را در آن ذخیره کنید.