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)上。这样的好处就是用户见到的都是画好的画,而不是正在一笔一笔往上贴的画。