SDL入门 - 常用功能简明笔记
常用第三方库:
- SDL2_ttf 用来处理文本显示
- SDL2_mixer 用来处理扩展格式的音乐(譬如MP3等)
- SDL2_image 用来加载带有透明通道的图片等
初始化
#include <SDL.h>
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); // 初始化视频和音频
创建窗口
#include <SDL.h>
#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度
SDL_Window* window = SDL_CreateWindow(
"窗口标题",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, // 分别表示窗口位置的x坐标和y坐标,使用内置常量SDL_WINDOWPOS_UNDEFINED表示窗口显示在默认位置
WINDOW_WIDTH, WINDOW_HEIGHT, // 分别表示窗口的宽度和高度
SDL_WINDOW_SHOWN); // 表示立即显示此窗口
释放资源并退出
#include <SDL.h>
#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度
SDL_Window* window = SDL_CreateWindow("窗口标题", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface* surfaceImage = IMG_Load("图片文件路径");
SDL_Texture* image = SDL_CreateTextureFromSurface(rend, surfaceImage);
// 程序退出前依次释放资源
SDL_DestroyTexture(image);
image = NULL;
SDL_FreeSurface(surfaceImage);
surfaceImage = NULL;
SDL_DestroyRenderer(rend);
rend = NULL;
SDL_DestroyWindow(window);
window = NULL;
// 退出程序
SDL_Quit();
延时
#include <SDL.h>
SDL_Delay(时长); // 时长单位为毫秒
调整图片透明效果
#include <SDL.h>
#include <SDL_image.h>
SDL_Surface* surfaceImage = IMG_Load("图片文件路径");
SDL_Texture* image = SDL_CreateTextureFromSurface(rend, surfaceImage);
SDL_SetTextureBlendMode(image, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(image, α通道值); // α通道值为0-255
常用事件
#include <SDL.h>
SDL_Event event;
while (true)
{
while (SDL_PollEvent(&event))
{
// 当捕获到SDL事件时将事件内容赋值给event变量并处理
if (event.type == SDL_QUIT)
{
// 判断是否为退出事件(一般由关闭窗口触发)
}
if (event.type == SDL_MOUSEMOTION)
{
// 判断是否为鼠标移动事件
int x = event.motion.x; // 获取当前鼠标x坐标
int y = event.motion.y; // 获取当前鼠标y坐标
}
if (event.type == SDL_MOUSEBUTTONDOWN)
{
// 处理鼠标按键事件
if (event.button == SDL_BUTTON_RIGHT)
{
// 处理鼠标右键事件
}
if (event.button == SDL_BUTTON_LEFT)
{
// 处理鼠标左键事件
}
}
if (event.type == SDL_KEYDOWN)
{
// 处理键盘按键事件
int keyCode = event.key.keysym.sym; // 获取当前按键的ASCII码,功能键将获取到较大的异常值
if (event.key.keysym.sym == SDLK_F10)
{
// 判断是否按下了F10
// SDLK_0 ~ SDLK_9 分别代表了数字按键1~9
// SDLK_F1 ~ SDLK_F21 分别代表键盘功能键F1~F21
// SDLK_UP、SDLK_DOWN、SDLK_LEFT、SDLK_RIGHT 分别代表键盘功能键上、下、左、右
// 具体参考头文件中定义的常量
}
}
}
}
清空绘图窗口
#include <SDL.h>
#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度
SDL_Window* window = SDL_CreateWindow("窗口标题", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); // 第三个参数表示启用硬件加速
SDL_RendClear(rend);
显示图片
#include <SDL.h>
#include <SDL_image.h>
#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度
SDL_Window* window = SDL_CreateWindow("窗口标题", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); // 创建窗口的Renderer
SDL_Surface* surfaceImage = IMG_Load("图片文件路径"); // 将图片加载为Surface
SDL_Texture* textureImage = SDL_CreateTextureFromSurface(rend, surfaceImage); // 将图片Surface转换为窗口Renderer的Texture
SDL_Rect rect;
rect.x = 坐标; // 设置矩形左上角顶点的x坐标
rect.y = 坐标; // 设置矩形左上角顶点的y坐标
rect.w = surfaceImage -> w; // 设置矩形宽为图片Surface宽度
rect.h = surfaceImage -> h; // 设置矩形高为图片Surface高度
SDL_RenderClear(rend); // 清空绘图窗口
SDL_RenderCopy(rend, textureImage, NULL, &rect); // 将图片Surface贴到窗口的Renderer上,后两个参数分别为对图片裁剪区的左上角顶点、图片放置位置的左上角顶点,设置为NULL为不裁剪或不移动
SDL_RenderPresent(rend); // 显示窗口Renderer的内容
简单的几何绘制
#include <SDL.h>
#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度
SDL_Window* window = SDL_CreateWindow("窗口标题", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_BLEND); // 只有先设置BlendMode才可以在后续调色中调节Alpha通道
SDL_SetRenderDrawColor(rend, R, G, B, A); // 设置绘制颜色,后四个参数分别为RGBA通道的分量,均为0-255之间
SDL_RenderDrawPoint(rend, x坐标, y坐标); // 在指定坐标处画点
SDL_RenderDrawLine(rend, 起点x坐标, 起点y坐标, 终点x坐标, 终点y坐标); // 在起点和终点之间画直线
SDL_Rect rect;
rect.x = 坐标; // 设置矩形左上角顶点的x坐标
rect.y = 坐标; // 设置矩形左上角顶点的y坐标
rect.w = 宽度; // 设置矩形宽为指定宽度
rect.h = 高度; // 设置矩形高为指定高度
SDL_RenderDrawRect(rend, &rect); // 绘制指定无填充矩形
SDL_RenderFillRect(rend, &rect); // 绘制指定填充矩形
播放音频
#include <SDL.h>
#include <SDL_mixer.h>
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048); // 第一个参数为声音的采样率,第二个参数为格式,第三个参数为声道数,第四个参数为每段声音大小的字节数
Mix_Music* sound = Mix_LoadMUS("音频文件路径"); // 加载指定路径音频文件
Mix_PlayMusic(sound, 1); // 播放音频,第二个参数表示播放次数
显示文本
#include <SDL.h>
#include <SDL_ttf.h>
TTF_Init();
TTF_Font* font = TTF_OpenFont("字体文件路径", 16); // 第二个参数为字号,也就是字体大小;它是基于720DPI进行计算的,在Word中可以进行粗略估计
SDL_Color red = { R, G, B }; // 设置字体颜色,R、G、B分别为三个通道分量值
SDL_Surface* ttf_surface = TTF_RenderText_Solid(font, "文字内容", red); // 第一个参数为字体指针,第二个参数为文字内容,第三个参数为字体颜色
// 依次释放资源
SDL_FreeSurface(ttf_surface);
ttf_surface = NULL;
TTF_CloseFont(font);
font = NULL;
TTF_Quit();
/*
关于中文输出,可以使用Unicode或者UTF-8编码:
SDL_Surface* TTF_RenderUNICODE_Solid(TTF_Font* font, const Uint16* text, SDL_Color fg);
SDL_Surface* TTF_RenderUTF8_Solid(TTF_Font* font, const char* text, SDL_Color fg);
*/
参考资料:
- B站大佬“正月点灯笼”SDL系列教程:https://space.bilibili.com/24014925/video?keyword=SDL
- 博客园-SDL显示文字及中文 :https://www.cnblogs.com/lvdongjie/p/12455462.html