SDL学习(三)

本文优化上文所给出的显示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;
}


 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值