درس 8 : مدیریت کردن صفحه کلید

 

فایلها استفاده شده :

font

source

درس 8 : مدیریت کردن صفحه کلید

 

شما قبلا با رویداد SDL_QUIT کار کردید در این درس یاد می گیرید که آیا کلیدی فشرده  شده است یا خیر و اگر فشرده شده چه کلیدی فشرده شده است

    //Generate the message surfaces

    up = TTF_RenderText_Solid( font, "Up was pressed.", textColor );

    down = TTF_RenderText_Solid( font, "Down was pressed.", textColor );

    left = TTF_RenderText_Solid( font, "Left was pressed", textColor );

    right = TTF_RenderText_Solid( font, "Right wa pressed", textColor );

 

بعد از اماده کردن همه ملزومات ما 4 سطح را تعریف می کنیم که حاوی 4 پیغام ما به کار بر است

البته یادتون باشد یک برنامه نویس حرفه ای باید همیشه چک کند که این UPو DOWN و... اینها همه درست ایجاد شده باشند با یک if و چک کردن NULL نبودن سطوح ولی اینجا من اینکار را نکردم

;)

 

        //If there's an event to handle

        if( SDL_PollEvent( &event ) )

        {

            //If a key was pressed

            if( event.type == SDL_KEYDOWN )

            {

 

حال اگر بخواهیم بفهمیم کلیدی فشرده شده است از SDL_KEYDOWN استفاده می کنیم

                //Set the proper text

                switch( event.key.keysym.sym )

                {

                    case SDLK_UP: message = up; break;

                    case SDLK_DOWN: message = down; break;

                    case SDLK_LEFT: message = left; break;

                    case SDLK_RIGHT: message = right; break;   

                }

            }

           

            //If the user has Xed out the window

            else if( event.type == SDL_QUIT )

            {

                //Quit the program

                quit = true;

            }

        }

 

حال باید بفهمیم که چه کلیدی فشار داده شده است SDL_PollEvent اطلاعات را از نوع ساختار SDL_KeyboardEvent به نام key درون event قرار می دهیم و درون keyساختار دیگری به نام keysym وجود دارد و درون keysym ساختار دیگری قرار دارد به نام key قرار دارد که در ان یک SDL_Key قرار دارد (فراموش نکنید که event یک union است)

مثال : اگر دکمه بالا را فشار دهیم SDLK_UP را بر می گرداند

        //If a message needs to be displayed

        if( message != NULL )

        {

            //Apply the images to the screen

            apply_surface( 0, 0, background, screen );

            apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );

           

            //Null the surface pointer

            message = NULL;

        }

              

        //Update the screen

        if( SDL_Flip( screen ) == -1 )

        {

            return 1;   

        }

SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0, 0, 0 ) );

سر اخر پیغام را در وسط  صفحه ست می کند و جمله اخر برای سیاه کردن صفحه است

 

بحث تکمیلی :

 

ساختار SDL_KeyboardEvent مطابق شکل روبرو است

typedef struct{
  Uint8 type;
  Uint8 state;
  SDL_keysym keysym;
} SDL_KeyboardEvent;

type – می تواند SDL_KEYDOWNیا SDL_KEYUP باشد

state- می تواند SDL_PRESSED یا SDL_RELEASED باشد

keysym – ساختار ی که محتوی اطلاعات کلید فشرده شده است

 

در صورتی که تکرار فعال باشد SDL_KEYDOWN باSDL_PRESSED فرقی ندارد

int SDL_EnableKeyRepeat(int delay, int interval);

در صورت صفر کردن delay غیر فعال می شود

 

ساختار SDL_kesym :

typedef struct{
  Uint8 scancode;
  SDLKey sym;
  SDLMod mod;
  Uint16 unicode;
} SDL_keysym;

sym : کلیدی که فشرده شده است

mod : کلید ALT-Control-shift را چک می کند

typedef enum {
  KMOD_NONE  = 0x0000,
  KMOD_LSHIFT= 0x0001,
  KMOD_RSHIFT= 0x0002,
  KMOD_LCTRL = 0x0040,
  KMOD_RCTRL = 0x0080,
  KMOD_LALT  = 0x0100,
  KMOD_RALT  = 0x0200,
  KMOD_LMETA = 0x0400,
  KMOD_RMETA = 0x0800,
  KMOD_NUM   = 0x1000,
  KMOD_CAPS  = 0x2000,
  KMOD_MODE  = 0x4000,
} SDLMod;
نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد