当前位置:   article > 正文

【音视频SDL2入门】创建第一个窗口

【音视频SDL2入门】创建第一个窗口


前言

SDL2(Simple DirectMedia Layer)是一个跨平台的开发库,旨在为多媒体应用程序(如游戏和视频播放软件)提供低级别的访问接口。SDL2 提供了创建窗口、处理输入、播放音频等多种功能,非常适合初学者入门音视频编程。本篇文章将介绍如何使用 SDL2 创建一个简单的窗口,并对相关的流程和函数进行详细讲解。


创建窗口的流程

创建一个 SDL2 窗口的基本流程包括以下几个步骤:

  1. 初始化 SDL 库。
  2. 创建一个 SDL 窗口。
  3. 获取与窗口关联的表面(Surface)。
  4. 更新窗口表面以显示内容。
  5. 延迟一定时间,以便窗口保持显示。
  6. 销毁窗口并退出 SDL 库。

需要使用的函数

1. 初始化 SDL 库

函数原型

int SDL_Init(Uint32 flags);
  • 1

作用
初始化 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;
}
  • 1
  • 2
  • 3
  • 4

2. 创建 SDL 窗口

函数原型

SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 flags);
  • 1

作用
创建一个窗口并返回窗口的句柄。

参数

  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3. 获取与窗口关联的表面

SDL2 表面(Surface)是一个用于存储图像数据的结构,在使用 SDL2 进行图形编程时非常常见。可以把它简单理解为一个画布或画板,用来绘制和显示图像。

想象一下你在画一幅画:

画布:SDL2 表面就像是你的画布。它是一个空白的地方,你可以在上面画图、写字、添加颜色等。
图像存储:当你把图像加载到程序中,SDL2 会把图像数据存储在一个表面上。这样,你可以对这些图像进行操作,比如缩放、旋转、合并等。
显示内容:你在表面上画好图像之后,可以把它显示在屏幕上,就像把画好的画展示出来一样。

函数原型

SDL_Surface* SDL_GetWindowSurface(SDL_Window* window);
  • 1

作用
获取与指定窗口关联的表面,用于在窗口上绘制内容。

参数

  • window:要获取表面的窗口的句柄。

返回值

  • 成功返回 SDL_Surface 的指针,失败返回 NULL

示例代码

SDL_Surface *surface = SDL_GetWindowSurface(window);
  • 1

SDL_FillRect 函数介绍

在创建和更新窗口的过程中,有时需要对窗口的表面进行填充,例如填充某种颜色。SDL 提供了 SDL_FillRect 函数来实现这一功能。

函数原型

int SDL_FillRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color);
  • 1

作用
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));
  • 1

此代码的解释如下:

surface:目标表面,即需要填充的表面。
NULL:表示填充整个表面。如果要填充部分区域,可以传递一个 SDL_Rect 结构体的指针。
SDL_MapRGB(surface->format, 255, 255, 255):生成一个颜色值,这里是白色。

4. 更新窗口表面

函数原型

int SDL_UpdateWindowSurface(SDL_Window* window);
  • 1

作用
更新窗口的表面,以显示最新的内容。

参数

  • window:要更新表面的窗口的句柄。

返回值

  • 成功返回 0,失败返回 -1

示例代码

SDL_UpdateWindowSurface(window);
  • 1

5. 延迟一定时间

函数原型

void SDL_Delay(Uint32 ms);
  • 1

作用
使程序暂停指定的毫秒数。

参数

  • ms:要延迟的时间,以毫秒为单位。

示例代码

SDL_Delay(2000);
  • 1

6. 销毁窗口并退出 SDL 库

函数原型

void SDL_DestroyWindow(SDL_Window* window);
void SDL_Quit(void);
  • 1
  • 2

作用
销毁窗口并清理 SDL 所有初始化的子系统。

参数

  • window:要销毁的窗口的句柄。

示例代码

SDL_DestroyWindow(window);
SDL_Quit();
  • 1
  • 2

示例代码

综合以上所有步骤,下面是完整的示例代码:

#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

总结

SDL2 是一个强大的跨平台开发库,通过它可以方便地创建和管理窗口。本文介绍了使用 SDL2 创建一个简单窗口的基本流程和相关函数。希望通过这篇文章,您能对 SDL2 的基础使用有一个初步的了解,为进一步的多媒体编程打下基础。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/910007
推荐阅读
相关标签
  

闽ICP备14008679号