上节我们学习了窗口的创建和用SDL _FillRect绘制了一个红红的窗口,今天我们学习的是用图片来绘制窗口,代码没啥改变,多了几个函数,先我们来一步一步讲解,先看看加载图片部分,有两种加载函数,一种是SDL自带的函数,一种是扩展库SDL_image.h提供的,让我们先看看自带的函数吧:
int LoadSurface()
{
//加载图片 (BMP格式)
Surface = SDL_LoadBMP("hello.bmp");
if (Surface == NULL)
return -1;
return 0;
}
这个加载函数SDL_LoadBMP比较简单,只接受一个类型为const char *即c风格字符串的参数,用来指明加载图片的路径,加载成功的话返回一个非空的SDL_Surface类型的指针,这个函数……就是有点单一,只能加载BMP格式的位图,接下来我们看看另一个函数,使用的话稍微麻烦一点:int LoadSurface()
{
//加载图片
Surface = IMG_Load("lhs.png");
if (Surface == NULL)
return -1;
return 0;
}
大家可以看到没啥区别,只是换了一个函数名而已,是吧?当然不是喽,在此之前,你需要包含头文件:
#include <SDL2/SDL_image.h>
初始化:
//初始化IMG IMG_Init(IMG_INIT_PNG);初始化的标识:
typedef enum
{
IMG_INIT_JPG = 0x00000001,
IMG_INIT_PNG = 0x00000002,
IMG_INIT_TIF = 0x00000004,
IMG_INIT_WEBP = 0x00000008
} IMG_InitFlags;由比可以看出SDL_image支持大部分主流的图片格式。使用时注意一下就可以了,还有个附带的退出函数,跟SDL_Quit差不多
IMG_Quit();
加载之后我们怎么办?上一节我们没有说如何用Surface来绘图,这节我们来看看吧:
int main(int args, char *argv[])
{
//初始化
if (Init() != 0)
return -1;
//加载图片
if (LoadSurface() != 0)
return -2;
//粘贴表面
SDL_BlitScaled(Surface, NULL, WindowScreen, NULL);
//更新窗口
SDL_UpdateWindowSurface(Window);
SDL_Delay(2000);
Destroy();
return 0;
}Blit函数,Blit我翻译它过来就是粘贴,由两个填好的参数可以看出,这里有俩个表面,一个是我们刚刚加载的Surface一个是WindowScreen,窗口的表面,综上,这个函数是将一个表面粘贴到另一个表面上用的,还有两个填了NULL的参数,我们下节再说,这里是本节的两种加载方式的代码
SDL_LoadBMP
IMG_Load
好了。看看运行的结果:
补,路径常识
看,这是我们本课的源代码文件所在的文件夹
里面还有一个源代码文件,可以看到这里没有图片文件,如果我想加载上一级目录下的"lhs.png"怎么办?看代码
int LoadSurface()
{
//加载图片
Surface = IMG_Load("../lhs.png");
if (Surface == NULL)
return -1;
return 0;
}
可以看到路径为"../lhs.png",前面的 "../"表示上级目录,可以用来访问上级文件夹,还有一个类似的就是 "./" 表示当前目录code