SDL2使用简介

article/2025/10/11 9:59:35

转自我的Gitee项目

SDL2使用简介

  • SDL2使用简介
    • 开发环境搭建
      • Windows
        • Visual Studio
        • Code::Blocks
        • Dev-Cpp
      • CMake(CLion)
      • 问题总结
    • SDL2库使用介绍
      • 初始化
      • 创建窗口
      • 绘制矩形
      • 刷新屏幕
        • 读取输入
          • 直接扫描键盘
          • 读取系统事件
        • 实例
      • 绘制图片

SDL2使用简介

开发环境搭建

Windows

Visual Studio

VS2019+SDL2.0环境准备

Code::Blocks

Code::Blocks如何植入SDL2

Dev-Cpp

Dev-Cpp开发环境配置SDL库

CMake(CLion)

本条需要预先安装CMake

下载SDL2源代码

在源代码目录下输入指令

cmake -S . -B build
cmake --build build --target install

然后在项目的CMakeLists.txt下的add_executable(xxx ...)命令之后加入target_link_libraries(xxx SDL2::SDL2 SDL2::SDL2main)

add_executable(YourProjectName main.cpp)target_link_libraries(YourProjectName SDL2::SDL2 SDL2::SDL2main)

问题总结

Q : undefined reference to “xxxx” ?

A : 请统一使用i686(32位)的头文件和库,目前还没有找到用x86_64(64位)头文件和库的方法

SDL2库使用介绍

首先包含SDL2头(先要搭建好环境)

#include <SDL.h>

#include <SDL2/SDL.h>

然后按格式创建main函数(很关键,不然SDL2找不到)

int main(int argc, char** argv) {return 0;
}

初始化

SDL初始化需要调用SDL_Init(unsigned int flag)函数。该函数接收一个参数用于表示初始化哪些模块,这里直接填入SDL_INIT_EVERYTHING这一flag初始化所有模块。
当初始化成功时函数返回0。因此在main函数中,使用如下代码完成初始化。

int main(int argc, char** argv) {if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {return -1;}return 0;
}

PS:如果在此处报错,那就是环境搭建仍有问题

创建窗口

使用SDL_CreateWindow(const char* title, int x, int y, int w, int h, unsigned int flag)来取得一个SDL_Window*(这是表示一个窗口的变量)未来将通过一系列函数操作这个变量。
其中

  • title: 窗口名。
  • x, y: 窗口位置,用SDL_WINDOWPOS_UNDEFINED来表示不预定位置。
  • w, h: 窗口的长(width)宽(height),这里就直接写800, 600了。
  • flag: 窗口创建的一些flag,这里直接填入SDL_WINDOW_SHOWN。

在程序执行完毕后,使用SDL_DestroyWindow(SDL_Window* window)来销毁一个窗口。

int main(int argc, char** argv) {SDL_Window* window = NULL;if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {return -1;}window = SDL_CreateWindow("Your Window Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);SDL_DestroyWindow(window);return 0;
}

这时候编译运行应该会闪一个黑框,可以在销毁窗口前调用SDL_Delay(2000)来使窗口持续显示(阻塞线程)2000毫秒。

int main(int argc, char** argv) {SDL_Window* window = NULL;if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {return -1;}window = SDL_CreateWindow("Your Window Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);SDL_Delay(2000);SDL_DestroyWindow(window);return 0;
}

绘制矩形

注:SDL的坐标系是以左上角为原点,往右为x正方向,下为y正方向。

下面的代码将在(350, 250)处绘制出一个边长为100像素的红色的正方形。下面将对代码进行讲解。

int main(int argc, char** argv) {SDL_Window* window = NULL;SDL_Renderer* renderer = NULL;struct SDL_Rect rect = { 350, 250, 100, 100 };if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {return -1;}window = SDL_CreateWindow("Your Window Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, 0xff);SDL_RenderFillRect(renderer, &rect);SDL_RenderPresent(renderer);SDL_Delay(2000);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);return 0;
}

画出了一个红色的矩形

使用SDL_CreateRenderer(SDL_Window* window, int index, unsigned int flag)来对这个窗口创建一个渲染器(SDL_Renderer*)。

  • window: 先前创建的window变量
  • index: 标识渲染器的序号,这里只用一个所以是-1
  • flag: 标识渲染器的渲染方式,这里使用GPU渲染所以用SDL_RENDERER_ACCELERATED

类似地,可以使用SDL_DestroyRenderer(SDL_Renderer* renderer)来销毁一个渲染器。

可以用渲染器+图形绘制图形,例如填充一个矩形:SDL_RenderFillRect(SDL_Renderer* renderer, const SDL_Rect* rect)

不过首先要通过SDL_SetRenderDrawColor(SDL_Renderer* renderer, unsigned char r, unsigned char g, unsigned char b, unsigned char a)来设置渲染器颜色。

在画完所有东西以后,调用SDL_RenderPresent(SDL_Renderer* renderer)来提交改动。

刷新屏幕

上面的代码都只是一段顺序执行的代码,画的再多也只能画一张静态的图片,而做游戏,肯定是得让画面动起来的。动起来自然就需要反复对画面进行绘制,因此我们通过while循环来做到这一点。

而每一帧开始绘制之前,需要清除上一帧所绘制的内容。不然会在屏幕上出现拖影。换句话说,先前画的所有东西都会堆在一起。

调用SDL_RenderClear(SDL_Renderer* renderer)来清除屏幕。别忘了在清除前设定好颜色。

//...省略上面的代码...
// 用白色清空屏幕
SDL_SetRenderDrawColor(renderer, 0xff, 0xff, 0xff, 0xff);
SDL_RenderClear(renderer);
//...省略下面的代码...

读取输入

在这之前,需要介绍SDL读取输入的方式。不然程序就没办法通过正常方式关掉了。

SDL读取输入的方式有两种:

  1. 直接扫描当前键盘的状态。
  2. 通过系统事件间接读取输入。
直接扫描键盘

通过调用SDL_GetKeyboardState(int* len)来获取一个数组的指针。通过if判断键盘按键对应该数组的下标的值。举例,如果要判断W键是否被按下:

const unsigned char* keyMap = SDL_GetKeyboardState(NULL);
if (keyMap[SDL_SCANCODE_W]) {printf("W键被按下!!");
}
读取系统事件

函数SDL_PollEvent(SDL_Event* event)在有事件时会返回1,并将事件写入event,否则返回0。因此我们可以用以下方式来读取系统事件。

SDL_Event event;
while (SDL_PollEvent(&event)) {// 处理事件...
}

实例

下面的代码将让上一节中的矩形按WASD键动起来,而且可以单击窗口上的“叉”来关闭这个窗口。

int main(int argc, char** argv) {SDL_Window* window = NULL;SDL_Renderer* renderer = NULL;// 创建矩形struct SDL_Rect rect = { 350, 250, 100, 100 };int running = 1;if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {return -1;}window = SDL_CreateWindow("Your Window Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);while (running) {SDL_Event event;while (SDL_PollEvent(&event)) {if (event.type == SDL_QUIT) {running = 0;}}// 扫描键盘const unsigned char* keyMap = SDL_GetKeyboardState(NULL);// 如果W或S按下,更新矩形的上下位置if (keyMap[SDL_SCANCODE_W]) {rect.y -= 1;} else if (keyMap[SDL_SCANCODE_S]) {rect.y += 1;}// 如果A或D按下,更新矩形的左右位置if (keyMap[SDL_SCANCODE_A]) {rect.x -= 1;} else if (keyMap[SDL_SCANCODE_D]) {rect.x += 1;}// 清除屏幕SDL_SetRenderDrawColor(renderer, 0xff, 0xff, 0xff, 0xff);SDL_RenderClear(renderer);// 绘制矩形SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, 0xff);SDL_RenderFillRect(renderer, &rect);// 更新内容SDL_RenderPresent(renderer);}SDL_DestroyWindow(window);return 0;
}

在这里插入图片描述
在这里插入图片描述

绘制图片

绘制图片需要先读取再使用SDL_RenderCopy()将其作为材质附加到SDL_Renderer上。以下代码展示了如何简单读取图片并渲染出来。

#include <SDL2/SDL.h>
#include <stdio.h>int main(int argc, char *argv[])
{const int SCREEN_WIDTH = 800;const int SCREEN_HEIGHT = 600;SDL_Window   *window        = NULL;SDL_Renderer *renderer      = NULL;if (SDL_Init(SDL_INIT_EVERYTHING) != 0){printf("SDL could not initialize! SDL error: %s\n", SDL_GetError());return -1;}window = SDL_CreateWindow("SDL Guide", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);//读取图片,SDL_LoadBMP中的字符串是图片路径SDL_Surface* surface = SDL_LoadBMP("dummy.bmp");renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);//创建一个Rect设定图片渲染时的位置和大小,这里直接用上面的矩形const struct SDL_Rect rect = {350, 250, 100, 100};//把SDL_Surface转换为SDL_Texture,即材质SDL_Texture* tex = SDL_CreateTextureFromSurface(renderer,surface);//设定背景颜色SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);SDL_RenderClear(renderer);//附加材质SDL_RenderCopy(renderer, tex, NULL, &rect);SDL_RenderPresent(renderer);SDL_Delay(2000);SDL_DestroyRenderer(renderer);SDL_Quit();return 0;
}

效果图
在这里插入图片描述

SDL_Surface接收SDL_LoadBMP读取的图片,再使用SDL_CreateTextureFromSurface转换为材质。
图片素材
图片素材


http://chatgpt.dhexx.cn/article/30ZD1WyU.shtml

相关文章

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;现已发展成为…

ISCC 2022 部分

目录 web冬奥会popfindme爱国敬业好青年-2Easy-SQL让我康康&#xff01;这是一道代码审计题 MISC隐秘的信息真相只有一个单板小将苏翊鸣藏在星空中的诗-1藏在星空中的诗-22022冬奥会降维打击 REVERSEGetTheTableBobs Code web 冬奥会 <?phpshow_source(__FILE__);$Step1F…

ISCC 2022 wp

目录 解题步骤及过程&#xff1a; 练武题WP&#xff1a; Web: 冬奥会&#xff1a; 爱国敬业好青年-2&#xff1a; Pop2022&#xff1a; 这是一道代码审计题&#xff1a; Easy-SQL&#xff1a; Findme&#xff1a; 让我康康!&#xff1a; misc&#xff1a; 2022冬奥…