C++ SDL2 入门
新的编程工具使用,总是需要环境搭建
IDE + 库
SDL2_mixer-devel-2.6.3-mingw.zip
SDL2 Hello World版本
#include <SDL.h>
#include <iostream>
#include <SDL_ttf.h>
int main(int argc, char* argv[])
{
// 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "无法初始化SDL: " << SDL_GetError() << std::endl;
return 1;
}
// 创建窗口
SDL_Window* window = SDL_CreateWindow("Hello SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "无法创建窗口: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
std::cerr << "无法创建渲染器: " << SDL_GetError() << std::endl;
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
if (TTF_Init() == -1) {
std::cerr << "无法初始化TTF库: " << TTF_GetError() << std::endl;
SDL_Quit();
return 1;
}
TTF_Font* font = TTF_OpenFont("Pacifico.ttf", 36);
if (!font) {
std::cerr << "无法加载字体: " << TTF_GetError() << std::endl;
TTF_Quit();
SDL_Quit();
return 1;
}
// 渲染一些文本
SDL_Surface* surface = SDL_GetWindowSurface(window);
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
SDL_Color textColor = {255, 255, 255};
SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello, SDL!", textColor);
SDL_Rect textRect = {200, 200, textSurface->w, textSurface->h};
SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
SDL_RenderCopy(renderer, textTexture, NULL, &textRect);
SDL_RenderPresent(renderer);
// 处理事件循环
bool quit = false;
SDL_Event event;
while (!quit) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
}
// 清理资源
TTF_CloseFont(font);
TTF_Quit();
SDL_DestroyTexture(textTexture);
SDL_FreeSurface(textSurface);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
hello world详细解释
#include <SDL.h>
#include <iostream>
这两行是包含头文件的指令。第一行包含了SDL2的头文件,它是用于与SDL2库交互的必要头文件。第二行包含了C++标准库的头文件iostream,它用于在控制台输出错误信息。
int main(int argc, char* argv[]) {
这是C++程序的入口点。main 函数是程序运行的起始点。int argc 和 char* argv[] 用于传递命令行参数。
// 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "无法初始化SDL: " << SDL_GetError() << std::endl;
return 1;
}
这一部分初始化了SDL2库。SDL_Init(SDL_INIT_VIDEO) 函数初始化SDL2的视频子系统。如果初始化失败,会输出错误信息并返回1表示程序出错。
// 创建窗口
SDL_Window* window = SDL_CreateWindow("Hello SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "无法创建窗口: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
这一部分创建了一个窗口。SDL_CreateWindow 函数用于创建一个窗口,并指定窗口的标题、位置和大小。如果创建失败,会输出错误信息,然后清理SDL2并返回1。
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
std::cerr << "无法创建渲染器: " << SDL_GetError() << std::endl;
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
这一部分创建了一个渲染器,用于在窗口上绘制图形。SDL_CreateRenderer 函数将渲染器与窗口关联起来。如果创建失败,会输出错误信息,然后清理窗口和SDL2,并返回1。
// 渲染一些文本
SDL_Surface* surface = SDL_GetWindowSurface(window);
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255, 255, 255));
这部分代码获取窗口表面并用白色填充整个窗口,以准备绘制文本。
SDL_Color textColor = {0, 0, 0};
SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello, SDL!", textColor);
SDL_Rect textRect = {200, 200, textSurface->w, textSurface->h};
这一部分定义了文本的颜色,并创建了一个包含文本的表面(textSurface)。你需要先定义一个字体(font),这里并没有包含在示例中。
SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
SDL_RenderCopy(renderer, textTexture, NULL, &textRect);
SDL_RenderPresent(renderer);
这一部分将文本表面转换为纹理,并使用渲染器将文本绘制到窗口上,最后调用SDL_RenderPresent函数来更新窗口显示。
// 处理事件循环
bool quit = false;
SDL_Event event;
while (!quit) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
}
这一部分处理SDL2的事件循环。它会一直运行,直到收到退出事件(如关闭窗口按钮)。
// 清理资源
SDL_DestroyTexture(textTexture);
SDL_FreeSurface(textSurface);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
最后,这部分清理了所有分配的资源,包括纹理、表面、渲染器、窗口,并调用SDL_Quit来关闭SDL2库。最后,返回0表示程序成功结束。
上面的代码bug
仔细看我们并没有定义font?
解决方法:
首先,你需要在代码中包含SDL2_ttf头文件:
#include <SDL_ttf.h>
然后,在主函数的开头,初始化TTF库:
if (TTF_Init() == -1) { std::cerr << "无法初始化TTF库: " << TTF_GetError() << std::endl; SDL_Quit(); return 1; }
接下来,你需要加载一个TrueType字体文件,例如:
TTF_Font* font = TTF_OpenFont("path/to/your/font.ttf", 36); if (!font) { std::cerr << "无法加载字体: " << TTF_GetError() << std::endl; TTF_Quit(); SDL_Quit(); return 1; }
请确保将 "path/to/your/font.ttf" 替换为你自己字体文件的路径。
最后,在绘制文本部分,使用这个字体来渲染文本:
SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello, SDL!", textColor);
这样,你就可以使用指定的字体来渲染文本了。请不要忘记在程序结束时清理字体资源:
TTF_CloseFont(font);
TTF_Quit();
例子工程代码:
- hello world SDL2-helloworld.zip
- 加在图片 SDL2_imageSDL2-pictures.zip
- 播放mp3 SDL2_mixer SDL2-mixer.zip
- snake game