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


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);
*/

参考资料:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值