شروع کار با SDL:
اولین کاری که باید انجام بدهیم فراخوانی کردن کتابخانه SDL است که بوسیله دستور #include
نکته1: در مورد قوانین نحوی توابع و ساختارهایSDL بگویم که معمولا همه انها با SDL_شروع می شوند مثل ُ SDL_LoadBMP()یا SDL_Surfaceو...
نکته2: شما در این درس با توابع
1. SDL_Init()
2. SDL_Quit()
3. SDL_FreeSurface()
4. SDL_LoadBMP()
5. SDL_DisplayFormat()
6. SDL_BlitSurface()
7. SDL_SetVideoMode()
8. SDL_WM_SetCaption()
9. SDL_Delay()
10. SDL_Flip()
11.SDL_GetError()
و با ساختارهای
1. SDL_Surface
2. SDL_Rect
اشنا خواهید شد
و نکته که دیگر قبل از ادامه کار باید بگویم این است که SDL
انواع خواص خودش را دارد
Uint8 - the equivalent of an unsigned char
Uint16 - a 16 bit (2 byte) unsigned integer
Uint32 - a 32 bit (4 byte) unsigned integer
Uint64 - a 64 bit (8 byte) unsigned integer
Sint8 - the equivalent of a signed char
Sint16 - a 16 bit (2 byte) signed integer
Sint32 - a 32 bit (4 byte) signed integer
Sint64 - a 64 bit (8 byte) signed integer
بعداز این نیاز به اماده کردن SDL برای استفاده از توانایی ان در برنامه است این کار بوسیله تابع SDL_Init() انجام می شودکه در صورت نا موفق بودن اجرا مقدار-1را برمیگرداند
SDLمرکب از 8 سیستم است َAudio,Video,Event Handeling,Cd-Rom,File I/o,JoyStick,Timers,Threading که قبل از ایتباده از هرکدام باید اماده شود بوسیله SDL_Init() :
int
SDL_Init
(Uint32 flags);
Flags:
SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_EVERYTHING
SDL_INIT_NOPARACHUTE
SDL_INIT_EVENTTHREAD
شما میتوانید با عملگر | دو یا چند مد را اماده کنید
ولی ما معمولا از SDL_INIT_EVERYTHING استفاده می کنیم.
پس کد بعدی برنامه
If (SDL_Init (SDL_INIT_EVERYTHING) == -1)
Return 1;
در صورت پیش امدن اشکال تابع ()SDL_GetErrorیک مقدار رشته ای از اخرین خطا بر می گرداند
حالا وقت اشنایی شما با ساختار SDL_Surface است همه چیز در SDLیک سطح است از مانیتور گرفته تا فایلهای که لود می کنید
این ساختار نمایش دهنده قسمتی از حا فظه است که اطلاعات گرافیکی در ان زخیره شده است که اعضای مهم ان عبارت است fotmat که نمایانگر فرمت سطح مثلا 24Bitیا32Bitبودن ان است clip_rectکه از نوع SDL_Rectاست که ساختار مستطیل SDL است حالا ما قصد داریم اشاره گری به صفحه نمایش بدهیم برای این کار باید یک اشاره گر به سطح تعریف کنید
SDL_Surface *screen = NULL;
و سپس صفحه نمایش را با تابع SDL_SetVideoMode به screenآدرس دهی می کنیم البته در درس 1 ما نیاز به دو سطح دیگر برای نگهداری دو عکس Background.bmp وhelloworld.bmp نیز داریم
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
حال ما خود تابع load_image(string filename)راتعریف میکنبم
SDL_Surface *load_image( std::string filename )
{
//Temporary storage for the image that's loaded
SDL_Surface* loadedImage = NULL;
//The optimized image that will be used
SDL_Surface* optimizedImage = NULL;
loadedImage = SDL_LoadBMP( filename.c_str() );
//If nothing went wrong in loading the image
if( loadedImage != NULL )
{
//Create an optimized image
optimizedImage = SDL_DisplayFormat( loadedImage );
//Free the old image
SDL_FreeSurface( loadedImage );
}
//Return the optimized image
return optimizedImage;
}
کار این تابع برگرداندن بک اشاره گر به تصویر بهینه شده است
(optimizedImage)پارامتر Filename مسیر فایل BMPاست loadImage یک سطح موقتی برای نگه داری BMP وoptimizedImage سطحی است که از ان استفاده می شود اول از همه تصویر به وسیله تابعSDL_LoadBMP
لود میشود ولی از ان استفاده نمی کنیم زیرا فایل BMP 24 bit می باشد ولی ما می خواهیم صفحه از نوع 32bit باشد ودر صورت استفاده سرعت کار پایین می اید پس ما فرمت عکس را هم فرمت صفحه نمایش میکنیم به وسیله تابع SDL_DisplayFormat و سپس تابع
SDL_FreeSurface استفاده میشود برای ازاد سازی فضای اشغال شده
شکل کلی 3 تابع :
SDL_Surface *
SDL_LoadBMP
(const char *file);
SDL_Surface *
SDL_DisplayFormat
(SDL_Surface *surface);
void
SDL_FreeSurface
(SDL_Surface *surface);
سپس تابعی دیگر تعریف میکنیم برای چسباندن عکسها به صفحه نمایش
یا هر سطح به سطح دیگر این کار به وسیله تابع SDL_BlitSurface
انجام می شود ولی ما با استفاده از این تابع خود تابع دیگر مینویسیم.
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
//Make a temporary rectangle to hold the offsets
SDL_Rect offset;
//Give the offsets to the rectangle
offset.x = x;
offset.y = y;
//Blit the surface
SDL_BlitSurface( source, NULL, destination, &offset );
}
این تابع 4 پارامتر میگیرد مختصات مبدا, سطح مقصد و سطح منبع
در اول کار ما مختصات را به یک مسطتیل SDL تبدیل میکنیم چون Blitsurfaceفقط SDL_Rect را قبول میکند
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
int main( int argc, char* args[] )
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return 1;
}
//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 1;
}
//Set the window caption
SDL_WM_SetCaption( "Hello World", NULL );
//Load the images
message = load_image( "hello_world.bmp" );
background = load_image( "background.bmp" );
//Apply the background to the screen
apply_surface( 0, 0, background, screen );
//Apply the message to the screen
apply_surface( 180, 140, message, screen );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//Wait 2 seconds
SDL_Delay( 2000 );
//Free the surfaces
SDL_FreeSurface( message );
SDL_FreeSurface( background );
//Quit SDL
SDL_Quit();
return 0;
}
در ابتدا این را بدانید وقتی از SDL استفاده میکنیم همیشه باید
از int main( int argc, char* args[] ) یا int main( int argc, char** args) استفاده کنید در غیر این صورت اشکال میگیرد
تابع SDL_SetVideoMode برای تنظیم صفحه نمابش است
SDL_Surface *
SDL_SetVideoMode
(int width, int height, int bpp, Uint32 flags);
دو پارامتر اول که کاملا معلوم اند پارامتر به معنی Bits PerPixel که من به 32 ست میکنم پارامتر 4م هم مقادیر ثابتی دارد که من همیشه به SDL_SWSURFACEست میکنم که به معنی نگهداری در حافظه سیستم است
مقادیر دیگر هم مثل SDL_HWSURFACEوجود دارد (به Document ها مراجعه
شود )
تابع دیگر
void
SDL_WM_SetCaption
(const char *title, const char *icon);
که تیتر برنامه را مشخص میکند و
Icon
برنامه
SDL_WM_SetCaption(“Hello World”,NULL);
سپس دو عکس را در حافظه لود می کند و انها را به screen می چسباند
سپس با تابع SDL_Flip() صفحه نمایش را نوسازی می کند برای نشان دادن عکس لازم است و سپس SDL_Delay() تاخیر میدهد