01_使用SDL2创建一个窗口

01_使用SDL2创建一个窗口

SDL2维基文档地址:SDL2_WIKI

现在正是开始SDL2的C语言教程,我写的教程是基于SDL2维基文档提供的C++教程:A collection of detailed tutorials for game programming using SDL 2.0 with C++

程序以及相关文档保存在百度网盘:SDL2文件

基于我的理解转换的C语言教程,如果出现哪些错误,请大佬多加指正,谢谢!!

让我们开始我们的教程。

SDL2创建一个窗口

首先我们先创建一个SDL2的窗口,这是SDL2显示的基础。

我们先要使用SDL2做出的东西都要在窗口上面进行显示,这是一切程序的基础。

完整代码:


#include <SDL2/SDL.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    // 初始化SDL2
    if(SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        printf("SDL_Init Error: %s\n", SDL_GetError());
        return 1;
    }

    // 创建窗口
    SDL_Window *win = SDL_CreateWindow("SDL2 Window", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if(win == NULL)
    {
        printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // 延时3秒
    SDL_Delay(3000);

    // 销毁窗口
    SDL_DestroyWindow(win);

    // 退出SDL2
    SDL_Quit();

    return 0;
}


接下来我们来解释使用的函数。

01:初始化

使用SDL2前,首先得进行SDL2的初始化。下面是初始化函数,用于初始化SDL2d的各个子系统:

extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);

参数:

  • flags:一个或多个子系统的 位掩码(bitmask),用按位或(|)组合。常见子系统包括:
    • SDL_INIT_VIDEO:视频子系统(窗口、渲染器、事件等)。
    • SDL_INIT_AUDIO:音频子系统。
    • SDL_INIT_TIMER:定时器子系统。
    • SDL_INIT_JOYSTICK:游戏手柄子系统。
    • SDL_INIT_HAPTIC:力反馈(如震动)子系统。
    • SDL_INIT_GAMECONTROLLER:高级游戏控制器支持。
    • SDL_INIT_EVENTS:事件处理子系统(通常隐含在其他子系统中)。
    • SDL_INIT_EVERYTHING:初始化所有子系统。

返回值:

  • 成功:返回 0
  • 失败:返回负值,可通过 SDL_GetError() 获取错误信息。

我们在这里只需要创建一个窗口,所以使用:SDL_INIT_VIDEO

// 初始化SDL2
    if(SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        printf("SDL_Init Error: %s\n", SDL_GetError());
        return 1;
    }

如果返回0则成功,如果返回非0则失败,退出程序!

02:创建窗口

创建窗口函数原型:

extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title,
                                                      int x, int y, int w,
                                                      int h, Uint32 flags);

参数:

参数说明
title窗口标题栏显示的文本(UTF-8编码)。
x, y窗口初始位置:
- SDL_WINDOWPOS_CENTERED: 屏幕居中
- SDL_WINDOWPOS_UNDEFINED: 系统决定位置
w, h窗口的宽度和高度(像素)。
flags窗口属性标志(可组合使用):

常用标志:

标志说明
SDL_WINDOW_SHOWN创建后立即显示窗口(默认)。
SDL_WINDOW_FULLSCREEN全屏窗口(独占模式)。
SDL_WINDOW_FULLSCREEN_DESKTOP全屏窗口(桌面分辨率,无边框)。
SDL_WINDOW_OPENGL兼容OpenGL上下文。
SDL_WINDOW_RESIZABLE允许用户调整窗口大小。
SDL_WINDOW_BORDERLESS无边框窗口。
SDL_WINDOW_HIDDEN初始隐藏窗口(后续可调用SDL_ShowWindow显示)。
SDL_WINDOW_MAXIMIZED初始最大化窗口。
SDL_WINDOW_MINIMIZED初始最小化窗口。
SDL_WINDOW_INPUT_FOCUS窗口初始获得输入焦点。

返回值:

  • 成功:返回指向 SDL_Window 的指针。
  • 失败:返回 NULL,通过 SDL_GetError() 获取错误信息。

我们创建一个标题为 “SDL2 Window” ,大小为640*480的窗口,位置处于 x=100, y=100,标志位默认就行。

SDL_Window *win = SDL_CreateWindow("SDL2 Window", 100, 100, 640, 480,SDL_WINDOW_SHOWN);
if(win == NULL)
    {
        printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

03:延时等待

延时函数原型:

extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms);

参数:

  • Uint32 ms:毫秒。

我们这里延时个3秒就行了,如果没有延时函数,那么窗口只会在桌面上一闪而逝,那肯定是不行的。

 SDL_Delay(3000);

04:销毁窗口

函数原型:

extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window);

作用:

  • 销毁由 SDL_CreateWindow 创建的窗口。
  • 释放相关的图形资源(如 OpenGL 上下文、渲染器等)。
  • 不会释放指针本身,但 不再安全使用,应手动置空。

参数:

  • SDL_Window * window:一个指向SDL2窗口指针。

注意事项:

项目说明
重复调用对同一个窗口指针调用两次会导致 未定义行为
自动销毁在调用 SDL_Quit() 时,不会自动销毁窗口,必须手动调用。
渲染器如果你用 SDL_CreateRenderer 创建了渲染器,必须先销毁渲染器,再销毁窗口:

当程序退出时,最终都需要调用SDL_Destorywindow()函数释放你创建的窗口,否则会造成内存泄漏!

05:退出程序

函数原型:

extern DECLSPEC void SDLCALL SDL_Quit(void);

作用:

  • 程序结束前 只调用一次。
  • 退出SDL2程序
  • SDL_Init 成对出现。
  • 不会 自动销毁你手动创建的 SDL_WindowSDL_Renderer 等。

每当你的SDL2程序退出前,必须调用,告诉系统要退出。

 SDL_Quit();

05:编译程序

选中main.c文件,右键从集成终端打开
在这里插入图片描述

在终端中相应输入:

gcc -g -o show main.o -Lsrc/include -Lsrc/lib -lmingw32 -lSDL2main -lSDL2

gcc -g -c main.c -Isrc/include -lsrc/lib -lmingw32 -lSDL2main -lSDL2

.\show.exe

然后可以看见桌面上打开一个窗口,3秒后消失
在这里插入图片描述

总结

以上,就是如何使用SDL2创建一个窗口的教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聊也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值