【音视频SDL2入门】创建第一个窗口
文章目录
- 前言
- 创建窗口的流程
- 需要使用的函数
- 1. 初始化 SDL 库
- 2. 创建 SDL 窗口
- 3. 获取与窗口关联的表面
- SDL_FillRect 函数介绍
- 4. 更新窗口表面
- 5. 延迟一定时间
- 6. 销毁窗口并退出 SDL 库
- 示例代码
- 总结
前言
SDL2(Simple DirectMedia Layer)是一个跨平台的开发库,旨在为多媒体应用程序(如游戏和视频播放软件)提供低级别的访问接口。SDL2 提供了创建窗口、处理输入、播放音频等多种功能,非常适合初学者入门音视频编程。本篇文章将介绍如何使用 SDL2 创建一个简单的窗口,并对相关的流程和函数进行详细讲解。
创建窗口的流程
创建一个 SDL2 窗口的基本流程包括以下几个步骤:
- 初始化 SDL 库。
- 创建一个 SDL 窗口。
- 获取与窗口关联的表面(Surface)。
- 更新窗口表面以显示内容。
- 延迟一定时间,以便窗口保持显示。
- 销毁窗口并退出 SDL 库。
需要使用的函数
1. 初始化 SDL 库
函数原型:
int SDL_Init(Uint32 flags);
作用:
初始化 SDL 库及其子系统。
参数:
flags:初始化标志,可以是以下值的组合:SDL_INIT_TIMER:初始化定时器子系统。SDL_INIT_AUDIO:初始化音频子系统。SDL_INIT_VIDEO:初始化视频子系统。SDL_INIT_JOYSTICK:初始化摇杆子系统。SDL_INIT_HAPTIC:初始化触觉反馈子系统。SDL_INIT_GAMECONTROLLER:初始化游戏控制器子系统。SDL_INIT_EVENTS:初始化事件子系统。SDL_INIT_EVERYTHING:初始化所有的子系统。
返回值:
- 成功返回
0,失败返回-1。
示例代码:
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{return -1;
}
2. 创建 SDL 窗口
函数原型:
SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 flags);
作用:
创建一个窗口并返回窗口的句柄。
参数:
title:窗口的标题。x:窗口的初始 x 坐标。SDL_WINDOWPOS_UNDEFINED:由系统决定窗口位置。
y:窗口的初始 y 坐标。SDL_WINDOWPOS_UNDEFINED:由系统决定窗口位置。
w:窗口的宽度。h:窗口的高度。flags:窗口标志,可以是以下值的组合:SDL_WINDOW_FULLSCREEN:创建一个全屏窗口。SDL_WINDOW_OPENGL:创建一个支持 OpenGL 的窗口。SDL_WINDOW_SHOWN:创建一个可见的窗口。SDL_WINDOW_HIDDEN:创建一个隐藏的窗口。SDL_WINDOW_BORDERLESS:创建一个无边框的窗口。SDL_WINDOW_RESIZABLE:创建一个可调整大小的窗口。SDL_WINDOW_MINIMIZED:创建一个最小化的窗口。SDL_WINDOW_MAXIMIZED:创建一个最大化的窗口。SDL_WINDOW_INPUT_GRABBED:创建一个抓取输入的窗口。SDL_WINDOW_ALLOW_HIGHDPI:创建一个支持高 DPI 的窗口。
返回值:
- 成功返回
SDL_Window的指针,失败返回NULL。
示例代码:
SDL_Window *window = SDL_CreateWindow("My First SDL2 Window", 100, 100, 500, 500, SDL_WINDOW_SHOWN);if (!window)
{printf("Error: %s\n", SDL_GetError());return -1;
}
3. 获取与窗口关联的表面
SDL2 表面(Surface)是一个用于存储图像数据的结构,在使用 SDL2 进行图形编程时非常常见。可以把它简单理解为一个画布或画板,用来绘制和显示图像。
想象一下你在画一幅画:
画布:SDL2 表面就像是你的画布。它是一个空白的地方,你可以在上面画图、写字、添加颜色等。
图像存储:当你把图像加载到程序中,SDL2 会把图像数据存储在一个表面上。这样,你可以对这些图像进行操作,比如缩放、旋转、合并等。
显示内容:你在表面上画好图像之后,可以把它显示在屏幕上,就像把画好的画展示出来一样。
函数原型:
SDL_Surface* SDL_GetWindowSurface(SDL_Window* window);
作用:
获取与指定窗口关联的表面,用于在窗口上绘制内容。
参数:
window:要获取表面的窗口的句柄。
返回值:
- 成功返回
SDL_Surface的指针,失败返回NULL。
示例代码:
SDL_Surface *surface = SDL_GetWindowSurface(window);
SDL_FillRect 函数介绍
在创建和更新窗口的过程中,有时需要对窗口的表面进行填充,例如填充某种颜色。SDL 提供了 SDL_FillRect 函数来实现这一功能。
函数原型
int SDL_FillRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color);
作用
SDL_FillRect 函数用于填充一个矩形区域,可以是整个表面,也可以是指定的部分区域。它通常用于设置背景颜色或在表面上绘制矩形。
参数
dst:目标表面,即要填充的表面。
rect:指向一个 SDL_Rect 结构体的指针,表示要填充的矩形区域。如果为 NULL,则填充整个表面。
x:矩形左上角的 x 坐标。
y:矩形左上角的 y 坐标。
w:矩形的宽度。
h:矩形的高度。
color:要填充的颜色,用 SDL_MapRGB 或 SDL_MapRGBA 函数生成。
返回值
成功返回 0。
失败返回 -1,并设置错误信息。
示例代码
以下示例展示了如何使用 SDL_FillRect 函数将表面填充为白色:
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
此代码的解释如下:
surface:目标表面,即需要填充的表面。
NULL:表示填充整个表面。如果要填充部分区域,可以传递一个 SDL_Rect 结构体的指针。
SDL_MapRGB(surface->format, 255, 255, 255):生成一个颜色值,这里是白色。
4. 更新窗口表面
函数原型:
int SDL_UpdateWindowSurface(SDL_Window* window);
作用:
更新窗口的表面,以显示最新的内容。
参数:
window:要更新表面的窗口的句柄。
返回值:
- 成功返回
0,失败返回-1。
示例代码:
SDL_UpdateWindowSurface(window);
5. 延迟一定时间
函数原型:
void SDL_Delay(Uint32 ms);
作用:
使程序暂停指定的毫秒数。
参数:
ms:要延迟的时间,以毫秒为单位。
示例代码:
SDL_Delay(2000);
6. 销毁窗口并退出 SDL 库
函数原型:
void SDL_DestroyWindow(SDL_Window* window);
void SDL_Quit(void);
作用:
销毁窗口并清理 SDL 所有初始化的子系统。
参数:
window:要销毁的窗口的句柄。
示例代码:
SDL_DestroyWindow(window);
SDL_Quit();
示例代码
综合以上所有步骤,下面是完整的示例代码:
#include <SDL.h>
#include <stdio.h>int main(int argc, char* argv[]) {if (SDL_Init(SDL_INIT_EVERYTHING) == -1){return -1;}SDL_Window *window = SDL_CreateWindow("My First SDL2 Window", 100, 100, 500, 500, SDL_WINDOW_SHOWN);if (!window){printf("Error: %s\n", SDL_GetError());return -1;}SDL_Surface *surface = SDL_GetWindowSurface(window);SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));SDL_UpdateWindowSurface(window);SDL_Delay(2000);SDL_DestroyWindow(window);SDL_Quit();return 0;
}
总结
SDL2 是一个强大的跨平台开发库,通过它可以方便地创建和管理窗口。本文介绍了使用 SDL2 创建一个简单窗口的基本流程和相关函数。希望通过这篇文章,您能对 SDL2 的基础使用有一个初步的了解,为进一步的多媒体编程打下基础。
相关文章:
【音视频SDL2入门】创建第一个窗口
文章目录 前言创建窗口的流程需要使用的函数1. 初始化 SDL 库2. 创建 SDL 窗口3. 获取与窗口关联的表面SDL_FillRect 函数介绍4. 更新窗口表面5. 延迟一定时间6. 销毁窗口并退出 SDL 库示例代码总结 前言 SDL2(Simple DirectMedia Layer)是一个跨平台的…...
《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟
《置身事内:中国政府与经济发展》生活过得好一点,比大多数宏伟更宏伟 兰小欢,复旦大学中国社会主义市场经济研究中心、经济学院副教授,上海国际金融与经济研究院研究员。美国弗吉尼亚大学经济学博士。 上海人民出版社 文章目录 《…...
MongoDB教程(十八):MongoDB MapReduce
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MapRed…...
HTML前端面试题之<iframe>标签
面试题:iframe 标签的作用是什么?有哪些优缺点 ? 讲真,刷这道面试题之前我根本没有接触过iframe,网课没讲过,项目实战没用过,但却在面试题里出现了!好吧,我只能说:前端路漫漫&…...
Docker-Compose实现MySQL之主从复制
1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…...
jetson显卡没有加速,而是在用cpu推理?
jetson的库,特别是使用显卡的库,大多需要单独安装 大概率是重装了pytorch,可以使用jetson官网的pytorch! 下面是官网的链接 PyTorch for Jetson - Announcements - NVIDIA Developer Forums 安装完成之后先使用命令查看是否安…...
Linux下如何安装配置Fail2ban防护工具
Fail2ban是一款在Linux服务器上用于保护系统免受恶意攻击的防护工具。它通过监视系统日志,检测到多次失败的登录尝试或其他恶意行为后,会自动将攻击源的IP地址加入防火墙的黑名单,从而阻止攻击者进一步访问服务器。本文将介绍如何在Linux系统…...
js的深浅拷贝
深浅拷贝是编程中对数据复制的两种不同方式,它们在处理对象和数组等复合数据结构时尤为重要。下面将详细解释这两种拷贝方式。 浅拷贝(Shallow Copy) 浅拷贝创建了原始对象的一个新实例,但这个新实例的属性只是原始对象属性的引…...
实验八: 彩色图像处理
目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …...
Python酷库之旅-第三方库Pandas(048)
目录 一、用法精讲 171、pandas.Series.nlargest方法 171-1、语法 171-2、参数 171-3、功能 171-4、返回值 171-5、说明 171-6、用法 171-6-1、数据准备 171-6-2、代码示例 171-6-3、结果输出 172、pandas.Series.nsmallest方法 172-1、语法 172-2、参数 172-3、…...
springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726
目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…...
自训练和增量训练word2vec模型
1、自己准备训练语料文件 根据自己的业务场景准备训练数据,比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例:准备自己的一个大规模的语…...
华三路由器开启web访问
配置路由器: # 配置Web用户名为admin,认证密码为admin,服务类型为http,用户角色为network-admin。 [Sysname] local-user admin [Sysname-luser-manage-admin] service-type http [Sysname-luser-manage-admin] authorization…...
C++软件开发值得推荐的十大高效软件分析工具
目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工具…...
vue2老项目中node-sass更换dart-sass
更换原因:node-sass经常会出现node版本问题,就很麻烦 卸载项目中的node-sass sass-loader npm uninstall sass-loader sass 安装dart-sas sass-loader 推荐安装sass1.26.2 sass-loader7.3.1 npm install sass-loader7.3.1 sass1.26.2 从新配置vue.…...
源/目的检查开启导致虚拟IP背后的LVS无法正常访问
情况描述 近期发现48网段主机无法访问8.83这个VIP(虚拟IP),环境是 8.83 绑定了两个LVS实例,然后LVS实例转发到后端的nginx 静态资源;整个流程是,客户端发起对VIP的请求,LVS将请求转发到后端实例…...
类和对象(四)
构造函数中的初始化列表 之前在实现构造函数时,主要是在函数体内进行赋值,而构造函数还有另一种初始化方式,通过初始化列表进行初始化。 初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,…...
<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?
前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…...
在Git项目中添加并应用“.gitignore”文件
在Git项目中添加并应用.gitignore文件 创建或修改.gitignore文件: 在项目的根目录下创建一个名为.gitignore的文件。如果已经有此文件,可以直接修改。 在文件中添加您希望Git忽略的文件和目录。例如: # 忽略所有的log文件 *.log# 忽略所有的…...
LeetCode Hot100 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
