SDL入门 - 常用功能简明笔记

    技术2024-10-23  2


    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
    Processed: 0.016, SQL: 9