فایل های استفاده شده :
درس 5: Color Keying (حذف کردن رنگهای مشخص در هنگام چسباندن)
ساختار SDL_Surface دارای عضوی به نام color key است
Color key رنگ مشخصی است که ما در هنگام چسباندن نمی خواهیم حضور یابد
این پس زمینه بچسبانید
ولی شما نمی خواهید اون رنگ ابی کم رنگ مزاحمتان شود
برای اینکار شما می توانید این رنگ ابی را به عنوان color key معرفی کنید
یک مقدمه در مورد رنگها :
همه رنگها از سه رنگ اصلی قرمزوسبزو آبی تشکیل شده اند (Red Green Blue)[RGB]
هر رنگ از یک بایت تشکیل شده است پس جمعا 256*256*256 رنگ با این مدل می توان ساخت
یعنی : 16777216 رنگ می توان با این مدل ساخت.
مثلا رنگ 0 , 0 , 0 معرف رنگ سیاه است یعنی هیچ رنگی از هیچ کدام موجود نیست
یا رنگ 255,0,0 معرف قرمز مطلق
یا رنگ 0,255,0 معرف سبز مطلق
یا رنگ 0,0,255 معرف ابی مطلق
یا رنگ 255,255,255 معرف سفید
و رنگ 0,255,255 معرف همین ابی کم رنگ است
شما در مبنای HEX یعنی مبنی 16 هم می توانید بنویسید اعداد پایه HEX شامل :
1 2 3 4 5 6 7 8 9 A B C D E F
هست (ماشین حساب ویندوز یا لینوکس را ببینبد)
این رنگ ابی 0,0,FF است
معمولا color key را در هنگام بارگزاری فایل ست می کنند
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 );
این همان تابع image_load است که ما می خواهیم تغییر دهیم
//If the image was optimized just fine
if( optimizedImage != NULL )
{
//Map the color key
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );
حالا هر می خواهیم color key را مشخص کنیم
تابع SDL_MapRGB 4 پارامتر می گیرد و رنگ مورد نظر را بر می گرداند پارامتر اول فرمت رنگ مثلا 32 bit که ما اینجا از فرمت optimizedImage استفاده می کنیم و سپس سه رنگ را می دهیم
//Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent
SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );
}
حالا وقت انجام Color keying است SDL_SetColorKey سه پارامتر می گیرد سطح مورد نظر . تنظیمات و رنگ
//Return the optimized image
return optimizedImage;
}
سر اخر optimizeImage دستکاری شده را به ما می دهد
//Apply the surfaces to the screen
apply_surface( 0, 0, background, screen );
apply_surface( 240, 190, foo, screen );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
حال شکل مورد نظر به صورت زیر است