本文优化上文所给出的显示bmp图片的程序,并且通过添加新的库文件,使得SDL支持更多的图片格式。
(1) 添加SDL_image库
下载地址:http://www.libsdl.org/projects/SDL_image/
添加方法与SDL学习(一)中介绍的相同,这里不再重复。
(2) 测试
测试代码如下所示:
#include "SDL.h" #include "SDL_image.h" #include <string> // The attributes of the screen const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN_BPP = 32; // The surfaces that will be used SDL_Surface *message = NULL; SDL_Surface *background = NULL; SDL_Surface *screen = NULL; 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; // Load the image //loadedImage = SDL_LoadBMP(filename.c_str()); // 该函数只支持bmp图片格式 loadedImage = IMG_Load(filename.c_str()); // 该函数支持BMP, PNM, XPM, LBM, PCX, GIF, JPEG, TGA, PNG格式的图片 if (loadedImage != NULL) { // Create an optimized image optimizedImage = SDL_DisplayFormat(loadedImage); // 该函数将图片格式转换为与screen相同的格式 // 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) { // 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); } int main(int argc, char *argv[]) { // 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 an error in setting up the screen if (screen == NULL) { return 1; } // Set the window caption SDL_WM_SetCaption("Hello World", NULL); // Load images message = load_image("F:/program/SDL/examples/Init/Debug/lyf.jpg"); background = load_image("F:/program/SDL/examples/Init/Debug/background.bmp"); // Apply the background to the screen apply_surface(0, 0, background, screen); //apply_surface(320, 0, background, screen); //apply_surface(0, 240, background, screen); //apply_surface(320, 240, 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 return 0; }