​SDL2使用-第一课 初始化和创建窗口

2025-10-08 02:17:07

1、本课,我们来讲解初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色:

在SDL2上比SDL1.2多出了一个SDL_Window结构体,意味着我们可以创建多个窗口。。。当然 不是在C4droid上,在C4droid上我们只能创建一个窗口。。。感觉被阉割了。。非使用C4droid的读者在使用SDL2前请参考SDL_GUI吧的教程自行配置SDL2.0,没有合适IDE的推荐codeblocks。。。 在使用SDL2前先包含头文件。。在C4droid上使用时,头文件必须在入口源代码文件(编译时打开的源代码文件)中包含,保证C4droid打开SDL插件。

#include <SDL2/SDL.h>

#include "log.h"

包含头文件后即可使用SDL2定义的函数,log.h是本人写的一个小函数库,定义了一个函数plog,用法和printf相同;一个PLOG宏,可以输出调试信息。 接下来我们要声明两个结构体作为绘图的主体,窗口(SDL_Window)和一个表面(SDL_Surface):

// 窗口 

SDL_Window *Window = NULL;

 // 窗口表面 

SDL_Surface *WindowScreen = NULL;

接下来我们定义一个初始化函数:

//初始化函数 

int Init(){    

SDL_Init(SDL_INIT_VIDEO);

函数SDL_Init用来初始化SDL2,这里我们使用了SDL_INIT_VIDEO作为初始化的可选参数,在本课代码中只需要初始化视频功能就好,初始化后我们来创建窗口并且检查创建成功没有:

// 创建窗口 

Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN);    if (Window == NULL)    {

        PLOG; 

        return -1;    

}

SDL_CreateWindow函数用来创建窗口,第一个参数是窗口的标题,第二、三个参数指明了窗口的位置信息,在电脑的程序上用来指明窗口出现的位置, 在C4droid上就不需要了,它不管设置多少都没用,第四、五个参数是窗口的大小(长、宽),最后一个参数是窗口的 状态,SDL_WINDOW_SHOWN,表示显示窗口;不过我更喜欢SDL_WINDOW_BORDERLESS,这样。。SDL2创建的窗口就没有那些标题和窗口的最大化之类的按键了 ;最后一个参数是可选参数,详细请参考SDL WIKI的名为SDL_WindowFlags枚举类型,接下来我们将表面绑定到窗口上:

   // 获取Window的表面    

WindowScreen = SDL_GetWindowSurface(Window);    

if (WindowScreen == NULL)   

 {

        PLOG;        

return -2;

    }    return 0;

 }

SDL_GetWindowSurface函数可以获取窗口的表面并且返回SDL_Surface指针,值得注意的是这个函数有一定的局限性, 在窗口使用渲染器(以后会说)后就无法使用它获取窗口的表面。初始化结束了,接下来就是退出函数

//清理函数 

void Destroy(){    

SDL_FreeSurface(WindowScreen);

    SDL_DestroyWindow(Window);

    SDL_Quit(); 

}

SDL2创建的结构体指针的内存无法自动释放,是需要用函数释放的,每种结构体有其特定的释放函数,如SDL_Window用SDL_DestroyWindow释放,SDL_Surface用SDL_FreeSurface释放,名字之所以有些不同是继承自SDL1.2,然后就是退出SDL2,用函数SDL_Quit退出;之后就到了主函数,函数参数必须使用完全版本的main函数,值得注意的是,main函数必须首先调用,因为它不是正真的main函数!它只是一个被替换的宏(见SDL_main.h:83:#define main SDL_main)

int main(int args, char *argv[]) 

{    

if (Init() != 0)        

return -1;    

//填充窗口    

SDL_FillRect(WindowScreen, NULL, SDL_MapRGB(WindowScreen->format, 0xFF, 0x00, 0x00));

函数SDL_FillRect是一个用来操作SDL_Surface的函数,它的作用是在表面上填充一个矩形区域,第一个参数是填充的目标表面,第二个是填充的矩形区域,接受一个SDL_Rect参数,如今设置为NULL,则默认全部填充,第三个参数是填充矩形用的颜色,但是我们看到在这里用了一个SDL_MapRGB来指定颜色,这是因为我们不知道WindowScreen使用的颜色格式,第一个参数获取了WindowScreen的颜色格式,然后通过后面的3个参数混合一种颜色,SDL_MapRGB会将这颜色转换成输入的颜色格式并返回,关于混合色用的是色彩三原色红、绿、蓝来混合,每种颜色取值为0x0~0xFF也就是一个字节,这里我们用了全红0xFF,绿蓝都取0,这样混合的颜色为大红色,效果稍后看截图:

SDL_UpdateWindowSurface(Window);    

SDL_Delay(2000);

    Destroy();

    return 0;

 }

这一段用了两个函数,SDL_UpdateWindowSurface将我们在之前绑定了窗口表面的WindowScreen上的操作应用到窗口上,SDL_Delay的作用是暂停屏幕,相当于暂停,接下来看运行结果截图:

​SDL2使用-第一课 初始化和创建窗口

2、看看其他参数改变后运行效果图:

Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS); SDL_MapRGB(WindowScreen->format, 0x00, 0xFF, 0x00)

​SDL2使用-第一课 初始化和创建窗口

3、Window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 240, 400, SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS); SDL_MapRGB(WindowScreen->format, 0x00, 0xFF, 0xFF)

​SDL2使用-第一课 初始化和创建窗口

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢