SDL2学习笔记02:在屏幕上显示图片

lazyfoo的第二节教程,教你怎么显示一张图片。需要用的图片可以在源网页里下。

//初始化
bool init();

//载入媒体资源
bool loadMedia();

//释放资源,关闭SDL
void close();

首先是要用模块化思想,把起同一功能的代码封装到一个函数里,这样方便调用及调试,整个程序也更条理清晰。

//定义窗口
SDL_Window* gWindow = NULL;
	
//定义窗口所包含的表层
SDL_Surface* gScreenSurface = NULL;

//定义载入图片用的表层
SDL_Surface* gHelloWorld = NULL;

这里为了方便几个变量都声明成了全局变量,在写比较大的程序时不建议这么做。
SDL里的表层surface可以堪称一块儿包含了需要渲染的图像的全部像素信息的数据块儿,他用的是软件渲染,即CPU渲染。硬件渲染(GPU渲染)比较复杂,以后再研究。
指针类型记得初始化为NULL,初学者有时候会忘了这一步。

//初始化函数的实现
bool init()
{
	//初始化标识
	bool success = true;

	//初始化SDL
	if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
	{
		printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
		success = false;
	}
	else
	{
		//创建窗口
		gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
		if( gWindow == NULL )
		{
			printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
			success = false;
		}
		else
		{
			//获取窗口的表层
			gScreenSurface = SDL_GetWindowSurface( gWindow );
		}
	}

	return success;
}

我们不能直接在窗口上画画,但可以在表层上画画。为了在窗口上画画,我们需要用SDL_GetWindowSurface()获取到窗口的表层,在表层上画完后再进行渲染。

//载入媒体资源
bool loadMedia()
{
	//定义成功标识
	bool success = true;

	//载入位图
	gHelloWorld = SDL_LoadBMP( "hello_world.bmp" );
	if( gHelloWorld == NULL )
	{
		printf( "Unable to load image %s! SDL Error: %s\n", "02_getting_an_image_on_the_screen/hello_world.bmp", SDL_GetError() );
		success = false;
	}

	return success;
}

SDL_LoadBMP()可以把一张BMP位图载入到表层里,这里用的路径是相对路径,对于VS2017来讲就是vcproj所在的那个路径。
不同IDE对于这个路径的定义可能不同,老不成功多百度吧。

void close()
{
	//释放表层
	SDL_FreeSurface( gHelloWorld );
	gHelloWorld = NULL;

	//销毁窗口
	SDL_DestroyWindow( gWindow );
	gWindow = NULL;

	//退出SDL子系统
	SDL_Quit();
}

养成好习惯,释放完内存后把指针设置为NULL

int main( int argc, char* args[] )
{
	//初始化
	if( !init() )
	{
		printf( "Failed to initialize!\n" );
	}
	else
	{
		//载入媒体
		if( !loadMedia() )
		{
			printf( "Failed to load media!\n" );
		}
		else
		{
			//使用图片
			SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
			
			//更新表层
			SDL_UpdateWindowSurface( gWindow );

			//延迟2秒
			SDL_Delay( 2000 );
		}
	}

	//释放内存,退出SDL
	close();

	return 0;
}

SDL_BlitSurface()负责把一个表层的内容拷贝传输到另一个表层上。
也可以把gHelloWorld直接贴到gWindow上,但有时候一张图片可能需要在一个场景里画好几次,所以加了一个中间surface。
SDL等很多渲染系统都用了双层渲染技术。先在后渲染器(surface)上画完画,再渲染到前渲染器(window)上。这样的好处就是用户见到的都是画好的画,而不是正在一笔一笔往上贴的画。

你可能感兴趣的:(SDL2学习笔记)