在C++游戏开发中,SDL2是一个跨平台的多媒体库,能够帮助我们快速处理窗口创建、图形渲染、输入事件等核心功能。使用SDL2搭建基础的窗口和渲染体系是入门游戏开发的第一步,整个过程主要分为库环境配置、SDL2初始化、窗口创建、渲染器初始化、渲染循环几个部分。

SDL2环境配置
首先需要在开发环境中配置SDL2库,以Windows平台的Visual Studio为例,步骤如下:
- 从SDL2官方渠道下载开发库,解压后得到include和lib文件夹
- 在Visual Studio项目属性中,将include文件夹路径添加到附加包含目录
- 将lib文件夹中的对应平台库文件添加到附加库目录,并在附加依赖项中添加SDL2.lib和SDL2main.lib
- 把SDL2.dll文件放到项目生成的可执行文件同目录下
SDL2初始化
使用SDL2的任何功能前都需要先初始化对应的子系统,创建窗口和渲染需要初始化视频子系统,初始化成功返回0,失败返回负数。
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char* argv[]) {
// 初始化SDL视频子系统
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "SDL初始化失败,错误原因:" << SDL_GetError() << std::endl;
return -1;
}
// 后续窗口和渲染代码会写在这里
return 0;
}
创建SDL2窗口
初始化完成后就可以调用SDL_CreateWindow函数创建窗口,该函数需要传入窗口标题、初始位置、宽高、窗口标志等参数,创建成功返回窗口指针,失败返回nullptr。
窗口标志常用参数说明:
| 标志参数 | 含义 |
|---|---|
| SDL_WINDOW_SHOWN | 窗口创建后直接显示 |
| SDL_WINDOW_RESIZABLE | 窗口可调整大小 |
| SDL_WINDOW_FULLSCREEN | 窗口全屏显示 |
创建渲染器并渲染内容
窗口创建完成后需要创建渲染器,渲染器负责将绘制的内容输出到窗口上。之后需要进入渲染循环,不断清空屏幕、绘制内容、更新显示,直到用户关闭窗口。
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char* argv[]) {
// 初始化SDL视频子系统
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "SDL初始化失败,错误原因:" << SDL_GetError() << std::endl;
return -1;
}
// 创建窗口,标题为SDL2 Window,位置居中,宽800高600,创建后直接显示
SDL_Window* window = SDL_CreateWindow(
"SDL2 Window",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
800,
600,
SDL_WINDOW_SHOWN
);
if (window == nullptr) {
std::cout << "窗口创建失败,错误原因:" << SDL_GetError() << std::endl;
SDL_Quit();
return -1;
}
// 创建渲染器,使用硬件加速,默认设备
SDL_Renderer* renderer = SDL_CreateRenderer(
window,
-1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
);
if (renderer == nullptr) {
std::cout << "渲染器创建失败,错误原因:" << SDL_GetError() << std::endl;
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
bool isRunning = true;
SDL_Event event;
// 渲染循环
while (isRunning) {
// 处理事件
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
isRunning = false;
}
}
// 设置清空屏幕的颜色为深蓝色
SDL_SetRenderDrawColor(renderer, 0, 0, 40, 255);
SDL_RenderClear(renderer);
// 设置绘制颜色为红色
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
// 绘制一个矩形,位置(300,200),宽200高200
SDL_Rect rect = {300, 200, 200, 200};
SDL_RenderFillRect(renderer, &rect);
// 更新渲染显示
SDL_RenderPresent(renderer);
}
// 释放资源
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
资源释放注意事项
程序退出前需要按照创建顺序反向释放资源,先销毁渲染器,再销毁窗口,最后调用SDL_Quit函数关闭SDL子系统,避免内存泄漏。如果创建过程中某一步失败,也需要释放已经创建的资源再退出程序。