SDL2入门教程(01_hello_SDL)

article/2025/10/11 15:18:48

注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。

Hello SDL: 你的第一个图形窗口

这一篇教程包含最主要也最基础的一步——弹出一个窗口(Window)

//使用 SDL 和 标准 IO
#include <SDL.h>
#include <stdio.h>//定义屏幕尺寸常量
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

因为会用到SDL库所以在代码一开始包含SDL.h,这里使用stdio.h而不是iostream是因为原作者喜欢用C的标准IO(理由是more thread safe),对于这样比较简单的程序,使用你习惯的IO就好。

包含头文件之后,我们定义了存储要生成的窗口的宽(width)和高(height)的常量。

int main( int argc, char* args[] )
{//将要渲染的窗口SDL_Window* window = NULL;//窗口含有的surfaceSDL_Surface* screenSurface = NULL;//初始化SDLif( SDL_Init( SDL_INIT_VIDEO ) < 0 ){printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );}

这就是主函数的开头,在这里有一点很重要——那就是主函数的参数一定是一个int以及char *数组(顺序不能变)且主函数的返回值必须为int。任何其他形式的主函数会导致对主函数未定义的引用(an undefined reference to main),这样的主函数才能让SDL与多个平台兼容。

然后定义了之后我们将要创建的SDL窗口的指针,紧接着我们定义了一个screen SDL surface(不太会翻译)。

SDL surface就是一个2D的图像,它的指针既可以指向文件中的图像,也可以指向屏幕上正在显示的图像。
A SDL surface is just a 2D image. A 2D image can be loaded from a file or it can be the image inside of a window. )在这里它指向屏幕里的窗口中的图像(所以名字叫screenSurface)

定义完窗口和screen surface之后,对SDL进行初始化。若没有对SDL进行初始化,则无法调用任何SDL函数。因为在这篇教程里面我们只需要用SDL的视频子系统(video subsystem)创建一个窗口,我们只给这个初始化函数SDL_INIT_VIDEO作为参数。

当有错误发生时,SDL_Init()函数返回-1。此处对其返回值进行检查的目的是如果初始化失败,可以从控制台中知道到底发生了什么错误,从而避免因错误窗口闪一下就关闭了的情况。

对于从来没有使用过printf()这个函数的人,你只需要知道它表示按照格式打印。它将作为第一个参数的字符串和其后的变量按照格式打印。在此处的程序中,一旦发生错误,那么字符串”SDL could not initialize! SDL_Error:”会和SDL_GetError()这个函数所返回的字符串一起打印到控制台中。那个’%s’表示从后面的参数表中打印相对应的字符串。SDL_GetError()函数总是返回SDL的函数产生的最新的错误信息。

SDL_GetError()是一个非常有用的函数。只要你需要知道哪里出错了,它总能让你及时知道任何SDL函数中发生的错误。

    else{//创建 windowwindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );if( window == NULL ){printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );}

如果SDL成功初始化,我们就能使用SDL_CreatWindow()函数来创建窗口。第一个参数设置窗口的标题或窗口的这一部分:

作者原图

接下来的两个参数定义了窗口生成处的x和y的坐标。因为我们暂时不用关心它创建在哪里,所以就直接使用SDL_WINDOWPOS_UNDEFINED这个预定义的常量来初始化x和y坐标。

接下来的两个参数定义了窗口的宽度和高度。最后那个参数是创建标签(creation flag)。以SDL_WINDOW_SHOWN作为此参数时,表示窗口一创建即为可见的(非隐藏窗口?)

如果有任何错误,SDL_CreateWindow()返回NULL。如果没有窗口产生,我们会想在控制台里知道原因的,所以使用了printf()SDL_GetError()来打印相应的错误。

        else{//获取 window surfacescreenSurface = SDL_GetWindowSurface( window );//用白色填充surfaceSDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );//更新surfaceSDL_UpdateWindowSurface( window );//延迟两秒SDL_Delay( 2000 );}}

如果窗口创建成功,如果能获取到窗口的surface,我们就能在surface上作图。而SDL_GetWindowSurface()就是干这个的。

为了使这篇教程尽量简单,我们所要对这个窗口做的就只是使用SDL_FillRect()函数来填充整个窗口。不用太在意这里的这个函数,本篇教程的目的只是创建一个窗口而已。

这里说一下关于渲染的很重要的事,在screen surface上更改或画上一些东西并不意味着你会看到更改后的surface。只有更新(update)窗口后,它才会展示你更改之后的surface。操作完成后使用SDL_UpdateWindowSurface()这个函数就行了。

如果只做创建窗口,填充,更新的步骤,那我们会看到一个窗口极快地闪了一下就关闭了。为了使窗口持续更长的时间,我们使用SDL_Delay()。它会让窗口持续(delay)相应数量的毫秒。1毫秒=1/1000秒。在上面的代码中,我们使用的参数会让窗口保持2000个 1/10000秒也就是保持2秒。

需要注意的是当SDL正处于持续时间中(delaying),它无法从键盘或是鼠标接受输入。所以当你跑这段代码时出现程序未响应请不要慌张。另外,我们还没有学如何响应键盘和鼠标事件。

    //销毁 windowSDL_DestroyWindow( window );//退出 SDL subsystemsSDL_Quit();return 0;
}

在窗口保持两秒之后,这里的代码会销毁这个窗口并释放其内存。这也会使指向这个window的SDL_Surface失效。当所有的的析构工作完成后,我们退出了SDL并返回0来终止这段程序。

下载此教程中涉及的源代码,原作者链接:戳我

注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。


http://chatgpt.dhexx.cn/article/xfDIvPuM.shtml

相关文章

SDL2源代码分析2:窗口(SDL_Window)

SDL源代码分析系列文章列表&#xff1a; SDL2源代码分析1&#xff1a;初始化&#xff08;SDL_Init()&#xff09; SDL2源代码分析2&#xff1a;窗口&#xff08;SDL_Window&#xff09; SDL2源代码分析3&#xff1a;渲染器&#xff08;SDL_Renderer&#xff09; SDL2源代码…

SDL2使用简介

转自我的Gitee项目 SDL2使用简介 SDL2使用简介开发环境搭建WindowsVisual StudioCode::BlocksDev-Cpp CMake(CLion)问题总结 SDL2库使用介绍初始化创建窗口绘制矩形刷新屏幕读取输入直接扫描键盘读取系统事件 实例 绘制图片 SDL2使用简介 开发环境搭建 Windows Visual Stud…

SDL2 简明教程(二):创建一个空的窗口

系列文章目录 SDL2 简明教程&#xff08;一&#xff09;&#xff1a;使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程&#xff08;二&#xff09;&#xff1a;创建一个空的窗口 文章目录 系列文章目录创建空窗口总结 创建空窗口 在上一篇文章中&#xff0c;我们了解…

强大无比的嵌入式多媒体开发神器:SDL2

SDL 是什么&#xff1f; SDL&#xff08;Simple DirectMedia Layer&#xff09;是一套开源的跨平台多媒体开发库&#xff0c;使用 C 语言写成。 它提供了绘制图像、播放声音、获取键盘输入等相关的 API&#xff0c;大大降低多媒体应用开发难度的同时&#xff0c;也让开发者只要…

SDL2 简明教程(五):OpenGL 绘制

系列文章目录 SDL2 简明教程&#xff08;一&#xff09;&#xff1a;使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程&#xff08;二&#xff09;&#xff1a;创建一个空的窗口 SDL2 简明教程&#xff08;三&#xff09;&#xff1a;显示图片 SDL2 简明教程&#xf…

SDL —— SDL2及API简介

SDL2框架 SDL&#xff08; Simple DirectMedia Layer&#xff09; 是一套开放源代码的跨平台多媒体开发库&#xff0c; 使用 C 语 言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数&#xff0c; 让开发者只要用相同或是相似的 代码就可以开发出跨多个平台&#xff08; L…

SDL2学习笔记(一):SDL2初步

一、Windows系统下的安装 MinGW ①安装MinGW并配置好环境变量&#xff1b; ②官网下载SDL for MinGW&#xff1b; ③将解压文件中的 .\i686-w64-mingw32\include\SDL2 复制到 .\MinGW\include &#xff1b; //有的设备需要用x86_64-w64-mingw32中的文件&#xff0c;下同 ④将解…

ISCC2021—ISCC客服一号冲冲冲(二)

ISCC客服一号冲冲冲&#xff08;二&#xff09; 呦&#xff0c;又见面了&#xff0c;狗子 打开链接&#xff0c;发现登录接口似乎是个图片截了一块啊&#xff0c;把图片下载下来&#xff0c;lsp隐写发现源代码&#xff0c;同时php弱比较登录页面 &#xff08;都看到这里啦&a…

ISCC2021——web部分

练武 ISCC客服冲冲冲&#xff08;一&#xff09; 该题目需要左边的客服票数高于右边的 我会的就两种方法&#xff0c;毕竟是废物嘛&#xff0c;允许 1、 把左右按钮换一下 然后就 2、在控制台输入 回车&#xff0c;走你 你涨啊&#xff0c;涨啊&#xff0c;接着涨啊…没吃…

ISCC,Misc:隐秘的信息

解码得到解压密码 解压出一张图&#xff0c;低位时头部显示有一串字符被 f f f f f 包裹&#xff0c;将可疑的字符单独拿出来 由于单个字符可能是由二进制错位导致的 fffffa4a9a1a1bd9 9b7a1a9ba34b127a 0b8abbc20b7a2b7a 2b524b43e9f8007f fffc7e3fe00fff00 71fffffffffffff…

ISCC理论题小解

B 域、工作组和家庭组表示在网络中组织计算机的不同方法。它们之间的主要区别是对网络中的计算机和其他资源的管理方式。 网络中运行 Windows 的计算机必须属于某个工作组或某个域。家庭网络中运行 Windows 的计算机也可以属于某个家庭组&#xff0c;但这不是必需的。 家庭网络…

ISCC web4

ISCC web4 打开网页看到&#xff1a; 代码审计。。。。。。。。。 一开始以为是sha256解密&#xff0c;结果半天搞不出来 后来才知道parse_url函数存在变量覆盖漏洞 因为要存在action参数&#xff0c;传入actionauth key也要传入key0 由于key是要被sha256加密的 传入一个has…

ISCC2022 擂台misc

文章目录 666扫&#xff01;弱雪真扫黑暗森林PNGstego这是压缩包吗&#xff1f;小 数 学习了 P.S&#xff1a;抬杠就是你对 666 考查知识点:伪加密、猜谜的steghide弱口令爆破、流量分析、gif帧、键盘密码、AES 下载下来是一个压缩包&#xff0c;但是图片显示需要密码&#xf…

ISCC-2022 部分wp

目录 Web冬奥会解题步骤详细描述解题收获 Easy_sql解题步骤详细描述解题收获 Pop2022解题步骤详细描述解题收获 findme解题步骤详细描述 爱国敬业好青年-2解题步骤详细描述解题收获 这是一道代码审计题 Misc单板小将苏翊鸣解题步骤详细描述解题收获 2022冬奥会解题步骤详细描述…

ISCC——部分题wp

练武场 WEB&#xff1a; ISCC客服冲冲冲&#xff08;一&#xff09; 知识点&#xff1a; js解密 解题思路&#xff1a; 1.打开后出现投票的页面 2.查看源码 发现可疑的function.js 3.function.js&#xff0c;js加密 var _0xodqjsjiami.com.v6,_0x3e40[_0xodq,\x77\x35\x4c\x…

ISCC ISCC客服一号冲冲冲(二)

这个题其实是转自Bugku的Login4 (CBC字节翻转攻击) 题目有提示密码就是web1 的flag 然后登入 这里有回显&#xff0c;然后我们换一下 下面cookie里的iv和cipher看着就像CBC加密的方式 利用的就是CBC解密的特点&#xff1a;前16个密文字符用来解密接下来的一组16个密文&#…

ISCC 2021 SSTI

文章目录 FUZZ测试&#xff1a;了解一下SSTI常用的语句格式&#xff1a;说一下构造思路&#xff1a;构造题外话&#xff1a;&#xff08;反转结果字符串&#xff09; 再ISCC中遇到了一道SSTI的题目&#xff0c;拿来练练手&#xff0c;题目难度的化&#xff0c;相对于普遍的过滤…

[ISCC 2021]部分wp

文章目录 海市蜃楼-1Retrieve the passcode我的折扣是多少小明的表情包Hack the Victim美人计李华的红包小明的宠物兔ISCC客服冲冲冲&#xff08;一&#xff09;这是啥Web01登录tornadowhich is the true isccISCC客服一号冲冲冲&#xff08;二&#xff09;Explore Rubylovely …

ISCC-WP

练武wp: MISC 2022冬奥会 图片在kali中&#xff0c;没有显示缩略图&#xff0c;其宽高很可能被修改过 修改图片的长之后&#xff0c;下面出些一些&#x编码&#xff0c;这是html实体编码。进行unicode解码得到 冰敦敦的小伙伴经常被人冷落&#xff0c;你知道他的原型是什…

ISCC认证的申请条件是什么?

ISCC国际可持续发展和碳认证介绍 ISCC - International Sustainability & Carbon Certification 国际可持续发展和碳认证&#xff0c;是满足欧盟《可再生能源指令》&#xff08;2009/28/ECRED&#xff09;的第一个标准&#xff0c;于2010年开始实施&#xff0c;现已发展成为…