Xoá phần thừa trong ảnh BMP

Để thực hiện một trò Game thì giao diện phải đẹp. Điều đó đồng nghĩa với việc ta không thể tự lập trình vẽ ra khung cảnh hay nhân vật mà phải sử dụng các chương trình đồ hoạ để tạo hình ảnh và dùng nó để hiển thị. Với các chương trình 3D thì đó là 3DMAX hay MAYA, còn với 2D như chúng ta đang thảo luận thì là Photoshop hay một số chương trình khác. File hình ảnh chúng ta dùng sẽ là định dạng BMP chuẩn của Windows. Tuy nhiên có một vấn đề phát sinh,Đó là hầu hết các hình ảnh trong các trò chơi đều không có hình dạng chữ nhật . Nhưng một ảnh Bitmap lại là một hình chữ nhật vì vậy chúng ta phải có cách nào đó để vẽ được hình dạng thực của nó mà không bị hiện cả hình chữ nhật .
Ghi rõ Nguồn Cộng Đồng Cviet http://forums.congdongcviet.com/showthread.php?p=136136
Ví dụ như với bức ảnh này



Khi vẽ thì họa sẽ sẽ để chừa ra những phần không cần thiết có mầu hồng (255,0,255)
Với phương pháp chroma key ta sẽ loại bỏ màu khoá ( màu thừa của ảnh ) khi ta vẽ ảnh lên thiết bị hiển thị. Ảnh cần hiển thị sẽ có dạng :
Như chúng ta thấy màu hồng không nằm trong các màu của vật thể UFO. Do vậy ta chọn màu hồng là màu khoá của ảnh. Ta loại bỏ phần thừa trong ảnh chính bằng màu khoá này với đoạn mã sau :
Mã:
sdl_sfTemp   = SDL_LoadBMP("sprite_Game.bmp");
sdl_sfSprite = SDL_DisplayFormat(sdl_sfTemp);
SDL_FreeSurface(sdl_sfTemp);   // giai phong tai nguyen sdl_sfTemp
iColorkey = SDL_MapRGB(sdl_sfScreen->format, 255, 0, 255); // mapping mầu làm khóa chính
SDL_SetColorKey(sdl_sfSprite, SDL_SRCCOLORKEY | SDL_RLEACCEL,iColorkey);//đặt mầu làm khóa chính trong ảnh cần Sprite
Hiển thị kết quả lên màn hình
Mã:
//____________ vẽ nền cho chương trình theo từng khối Sprite
		for (int x = 0; x < NUMBER_GRASS_WIDTH; x++) 
		{
			for (int y = 0; y < NUMBER_GRASS_HEIGHT; y++) 
			{
				sdl_rcGrass.x = x * BMP_SPRITE_SIZE;
				sdl_rcGrass.y = y * BMP_SPRITE_SIZE;
				SDL_BlitSurface(sdl_sfGrass, NULL, sdl_sfScreen, &sdl_rcGrass);
			}
		}//đặt vị trí con chạy Sprite lên nền đã vẽ
		SDL_BlitSurface(sdl_sfSprite, NULL, sdl_sfScreen, &sdl_rcSprite);
		SDL_UpdateRect(sdl_sfScreen,0,0,0,0);//update vào Screen
source code được làm cho đơn giản

Mã nguồn PHP:
#include <sdl/sdl.h>#pragma comment(lib,"sdl.lib")#define WINDOW_SCREEN_WIDTH 640#define WINDOW_SCREEN_HEIGHT 480#define BMP_SPRITE_SIZE 32//là kích thước của ảnh grass cũng = kích thước của Sprite#define NUMBER_GRASS_WIDTH WINDOW_SCREEN_WIDTH/BMP_SPRITE_SIZE//số Ảnh grass_window.bmp xếp theo chiều rộng#define NUMBER_GRASS_HEIGHT WINDOW_SCREEN_HEIGHT/BMP_SPRITE_SIZE// xếp theo chiều caoint main(int argc, char* argv[]){ SDL_Surface *sdl_sfScreen, *sdl_sfTemp, *sdl_sfSprite, *sdl_sfGrass; SDL_Rect sdl_rcSprite, sdl_rcGrass; SDL_Event sdl_Eevent; Uint8 *uiKeystate; int iColorkey; bool bGameover; sdl_rcSprite.x = 0;// vi tri ban dau cua Sprite sdl_rcSprite.y = 0;// _______________________________ SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption(" Sprite Move SDL ", " Sprite Move SDL "); sdl_sfScreen = SDL_SetVideoMode(WINDOW_SCREEN_WIDTH, WINDOW_SCREEN_HEIGHT, 0, 0); sdl_sfTemp = SDL_LoadBMP("sprite_Game.bmp"); sdl_sfSprite = SDL_DisplayFormat(sdl_sfTemp); SDL_FreeSurface(sdl_sfTemp); // giai phong tai nguyen sdl_sfTemp iColorkey = SDL_MapRGB(sdl_sfScreen->format, 255, 0, 255); // mapping mầu làm khóa chính SDL_SetColorKey(sdl_sfSprite, SDL_SRCCOLORKEY | SDL_RLEACCEL, iColorkey);//đặt mầu làm khóa chính trong ảnh cần Sprite sdl_sfTemp = SDL_LoadBMP("grass_window.bmp");/ạp ảnh nền lên biến tạm sdl_sfGrass = SDL_DisplayFormat(sdl_sfTemp);//chuyển sang chế độ display SDL_FreeSurface(sdl_sfTemp);//xóa bộ nhớ biến tạm bGameover = false;// game kết thúc hay chưa ? while ( bGameover == false ) { if (SDL_PollEvent(&sdl_Eevent)) //vòng lặp đón nhân sự kiện sử dụng SDLEvent { switch (sdl_Eevent.type) { case SDL_QUIT:/ếu nhấn vào phím close trên cửa sổ hoặc Alt + F4 .... bGameover = true;//đặt biến nhận biết kết thúc game = 1 --> kết thúc game break; case SDL_KEYDOWN:/ếu có sự kiện bấm phím switch (sdl_Eevent.key.keysym.sym) { case SDLK_ESCAPE:/ếu bấm ESC case SDLK_q:/ếu bấm phím Q bGameover = true; break; } break; } } uiKeystate = SDL_GetKeyState(NULL);//lấy phím được bấm if (uiKeystate[SDLK_LEFT] ) /ếu sang trái { sdl_rcSprite.x -= 2;//giảm tọa độ x } if (uiKeystate[SDLK_RIGHT] ) { sdl_rcSprite.x += 2;//tăng tọa độ x } if (uiKeystate[SDLK_UP] ) { sdl_rcSprite.y -= 2; // giảm tọa độ y } if (uiKeystate[SDLK_DOWN] ) { sdl_rcSprite.y += 2;//tăng tọa độ y } if ( sdl_rcSprite.x < 0 ) // { sdl_rcSprite.x = 0;//dưới 0 thì đứng yên } else if ( sdl_rcSprite.x > WINDOW_SCREEN_WIDTH-BMP_SPRITE_SIZE ) //khi hoành độ < điểm cận trên của hình ảnh theo trục ox { sdl_rcSprite.x = WINDOW_SCREEN_WIDTH-BMP_SPRITE_SIZE; } if ( sdl_rcSprite.y < 0 ) { sdl_rcSprite.y = 0; } else if ( sdl_rcSprite.y > WINDOW_SCREEN_HEIGHT-BMP_SPRITE_SIZE ) //khi tung độ < điểm cận trên của hình ảnh theo truc oy { sdl_rcSprite.y = WINDOW_SCREEN_HEIGHT-BMP_SPRITE_SIZE; }//____________ vẽ nền cho chương trình theo từng khối Sprite for (int x = 0; x < NUMBER_GRASS_WIDTH; x++) { for (int y = 0; y < NUMBER_GRASS_HEIGHT; y++) { sdl_rcGrass.x = x * BMP_SPRITE_SIZE; sdl_rcGrass.y = y * BMP_SPRITE_SIZE; SDL_BlitSurface(sdl_sfGrass, NULL, sdl_sfScreen, &sdl_rcGrass); } }//đặt vị trí con chạy Sprite lên nền đã vẽ SDL_BlitSurface(sdl_sfSprite, NULL, sdl_sfScreen, &sdl_rcSprite); SDL_UpdateRect(sdl_sfScreen,0,0,0,0);//update vào Screen } SDL_FreeSurface(sdl_sfSprite);//giải phóng SDL_FreeSurface(sdl_sfGrass); SDL_Quit();//thoát sdl return 0;}  
để biên dịch anh em cần down SDL SDK về

tham khảo : http://gamedevgeek.com/tutorials/mov...ites-with-sdl/