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_Window、SDL_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创建一个窗口的教程。

3102

被折叠的 条评论
为什么被折叠?



