さて、ビットマップを画面に表示する方法を上でやりましたが、ビットマップファイルで作ったキャラクタチップなどの背景を透明にしたいとき、どれか好きな一色を透明にすることができます。
#include <SDL/SDL.h>
int main(int argc, char* argv[]){
SDL_Surface* image;
SDL_Surface* image2;
SDL_Rect rect, scr_rect;
SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
/* 画像読み込み */
image = SDL_LoadBMP("sample.bmp");
/* 白い色を透過色にする */
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 255, 255));
image2 = SDL_DisplayFormat(image);
/* 画像の矩形情報設定 */
rect.x = 0;
rect.y = 0;
rect.w = image2->w;
rect.h = image2->h;
/* 画像配置位置情報の設定 */
scr_rect.x = 0;
scr_rect.y = 0;
/* サーフェスの複写 */
SDL_BlitSurface(image2, &rect, SDL_GetVideoSurface(), &scr_rect);
/* サーフェスフリップ */
SDL_Flip(SDL_GetVideoSurface());
SDL_Delay(3000);
SDL_FreeSurface(image2);
SDL_FreeSurface(image);
SDL_Quit();
return 0;
}
image2を新たに追加しました。imageが透明化前、image2が透明化後になります。
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
color key、つまり透過色のセットをします。
surfaceは透過色をセットするサーフェス。
flagはSDL_SRCCOLORKEY、か、SDL_RLEACCELを合わせてセットします。
keyは透過色情報をセットします。SDL_MapRGB()の返り値の色情報となります。
Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b);
色を返します。
fmtはピクセルフォーマット情報で、扱うSDL_SurfaceのformatをセットすればOK。
r,g,bはそれぞれ赤、緑、青の明るさになり、0から255までの数字を入れます。
SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);
SDL_Surfaceのディスプレイフォーマットを変更します。今回の例ではSDL_SetColorKey()でセットした透過色を反映させるために使用します。
引数のsurfaceは変更するサーフェスで、返り値が変更されたサーフェスになります。