درس 4 : برنامه های مبتنی بر رویداد ( حادثه )

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

source code

عکس

 

 

درس 4 : برنامه های مبتنی بر رویداد ( حادثه )

 

یک رویداد اتفاقی است که رخ می دهد مثل فشار دادن دکمه p صفحه کلید تکان دادن Mouse تغییر اندازه پنجره برنامه  کلیک کردن بر روی دکمه X یا ضربدر پنجره و ...

 

در این درس یاد می گیرید که چگونه رخداد یک رزیداد را بررسی کنید و مثال ما همان زدن X است

 

//The headers

#include "SDL/SDL.h"

#include "SDL/SDL_image.h"

#include

 

//Screen attributes

const int SCREEN_WIDTH = 640;

const int SCREEN_HEIGHT = 480;

const int SCREEN_BPP = 32;

 

//The surfaces

SDL_Surface *image = NULL;

SDL_Surface *screen = NULL;

 

در اول کار مثل قبل هدر و ثابت ها و سطوح را تعریف می کنیم

//The event structure that will be used

SDL_Event event;

حال یک چیز جدید ساختار SDL_Event به ما در نگهداری رویداد ها کمک می کند در اصل SDL_Event یک union است به شکل زیر :

 

typedef union{
  Uint8 type;
  SDL_ActiveEvent active;
  SDL_KeyboardEvent key;
  SDL_MouseMotionEvent motion;
  SDL_MouseButtonEvent button;
  SDL_JoyAxisEvent jaxis;
  SDL_JoyBallEvent jball;
  SDL_JoyHatEvent jhat;
  SDL_JoyButtonEvent jbutton;
  SDL_ResizeEvent resize;
  SDL_ExposeEvent expose;
  SDL_QuitEvent quit;
  SDL_UserEvent user;
  SDL_SywWMEvent syswm;
} SDL_Event;
 

 

SDL_Surface *load_image( std::string filename )

{

    //The image that's loaded

    SDL_Surface* loadedImage = NULL;

   

    //The optimized image that will be used

    SDL_Surface* optimizedImage = NULL;

   

    //Load the image

    loadedImage = IMG_Load( filename.c_str() );

   

    //If the image loaded

    if( loadedImage != NULL )

    {

        //Create an optimized image

        optimizedImage = SDL_DisplayFormat( loadedImage );

       

        //Free the old image

        SDL_FreeSurface( loadedImage );

    }

   

    //Return the optimized image

    return optimizedImage;

}

 

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )

{

    //Temporary rectangle to hold the offsets

    SDL_Rect offset;

   

    //Get the offsets

    offset.x = x;

    offset.y = y;

   

    //Blit the surface

    SDL_BlitSurface( source, NULL, destination, &offset );

}

این توابع همچنان مثل درس های قبل است و تغییر نکرده اند

bool init()

{

    //Initialize all SDL subsystems

    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )

    {

        return false;   

    }

   

    //Set up the screen

    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

   

    //If there was in error in setting up the screen

    if( screen == NULL )

    {

        return false;   

    }

   

    //Set the window caption

    SDL_WM_SetCaption( "Event test", NULL );

   

    //If everything initialized fine

    return true;

}

این تابع هم برای اماده سازی است تغییر تیتر شروع SDL و چک کردن برای Error .

bool load_files()

{

    //Load the image

    image = load_image( "x.png" );

   

    //If there was an error in loading the image

    if( image == NULL )

    {

        return false;   

    }

   

    //If everything loaded fine

    return true;   

}

 

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

void clean_up()

{

    //Free the image

    SDL_FreeSurface( image );

   

    //Quit SDL

    SDL_Quit();   

}

واین تابع اخر هم کار خالی کردن حافظه و خروج از SDL را انجام می دهد

int main( int argc, char* args[] )

{

    //Make sure the program waits for a quit

    bool quit = false;

در تابع main ما یک متغییر تعریف کردیم به نام quit که در صورت TRUE شدن از برنامه خارج شود

//Initialize

if( init() == false )

{

     return 1;   

}

 

 //Load the files

if( load_files() == false )

{

return 1;   

}

 

در اینجا توابع را فراخوانی می کنیم

    //Apply the surface to the screen

    apply_surface( 0, 0, image, screen );

   

    //Update the screen

    if( SDL_Flip( screen ) == -1 )

    {

        return 1;   

    }

سپس عکس را نمایش می دهیم

    //While the user hasn't quit

    while( quit == false )

    {

این حلقه اصلی برنامه است تا وقتی که برنامه مقدار quit را true نکرده باشد ادامه میابد.

        //While there's an event to handle

        while( SDL_PollEvent( &event ) )

        {

 

در SDL همانند Windows وقتی چند رویداد دخ میدهد این رویداد ها درون یک صف قرار می گیرند و هر کی اول تو صف ایستاد اول هم پردازش می شود حال ما چطور می توانیم این ها را از تو صف در اوریم ؟

جواب : استفاده از تابع SDL_PollEvent() است و یک ساختار SDL_Event

 

ما یک ساختار را به صورت ارجاع به SDL_PollEvent  می فرستیم واین تابع هم ان را دستکاری می کند

و تا موقعی که کسی درون صف باشد SDL_PollEvent مقدار غیر صفر بر میگرداند

            //If the user has Xed out the window

            if( event.type == SDL_QUIT )

            {

                //Quit the program

                quit = true;

            }   

        }

    }

وقتی کاربر دکمه X را بزند از حلقه بیرون می اید

 

    //Free the surface and quit SDL

    clean_up();

       

    return 0;   

}

در اینجا هم برنامه پایان میابد

 

بحث تکمیلی :

SDL_Event را می توان بعد از SDL_Surface مهمترین ساختار SDL دانست.

این ها مثال هایی از type هستند

Event type        Event Structure

SDL_ACTIVEEVENT            SDL_ActiveEvent

SDL_KEYDOWN/UP            SDL_KeyboardEvent

SDL_MOUSEMOTION         SDL_MouseMotionEvent

SDL_MOUSEBUTTONDOWN/UP   SDL_MouseButtonEvent

SDL_JOYAXISMOTION       SDL_JoyAxisEvent

SDL_JOYBALLMOTION      SDL_JoyBallEvent

SDL_JOYHATMOTION        SDL_JoyHatEvent

SDL_JOYBUTTONDOWN/UP         SDL_JoyButtonEvent

SDL_QUIT      SDL_QuitEvent

SDL_SYSWMEVENT            SDL_SysWMEvent

SDL_VIDEORESIZE  SDL_ResizeEvent

SDL_VIDEOEXPOSE            SDL_ExposeEvent

SDL_USEREVENT     SDL_UserEvent

 

SDL_Event دو استفاده دارد

1.خواندن رویداد ها از صف (به وسیله SDL_PollEvent)

2.قرار دادن رویدادهای مصنوعی در صف(به وسیله SDL_PushEvent)

مثال :

SDL_Event test_event;
while(SDL_PollEvent(&test_event)) {
  switch(test_event.type) {
    case SDL_MOUSEMOTION:
      printf("We got a motion event.
");
      printf("Current mouse position is: (%d, %d)
", test_event.motion.x, test_event.motion.y);
      break;
    default:
      printf("Unhandled Event!
");
      break;
  }
}
printf("Event queue empty.
");

 

 

در درسهای بعدی در مورد برنامه نویسی Mouse به شما خواهم گفت تا چند درس دیگر.

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد