SDL2

SDL

function

SDL_Init

int SDL_Init(Uint32 flags);

调用这个函数能初始化SDL的所有子系统,然后我们可以开始使用SDL的图形函数。

flags 说明
SDL_INIT_TIMER timer subsystem (定时器)
SDL_INIT_AUDIO audio subsystem (音频)
SDL_INIT_VIDEO video subsystem; automatically initializes the events subsystem (视频)
SDL_INIT_JOYSTICK 摇杆
SDL_INIT_HAPTIC 触摸屏
SDL_INIT_GAMWCONTROLLER 游戏控制器
SDL_INIT_EVENTS events subsystem (事件)
SDL_INIT_NOPARACHUTE 不捕获关键信号
SDL_INIT_EVERYTHING all of the above subsystems (包含上述所有选项)

返回值:0 成功,非0失败。

SDL_CreateWindow

//设置窗口
SDL_Window *screen = SDL_CreateWindow(const char* title,
                          SDL_WINDOWPOS_UNDEFINED,
                          SDL_WINDOWPOS_UNDEFINED,
                          640, 480,
                          SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL);

用来建立一个640像素宽、480像素高的32位(位/像素)窗口.

此函数替换了老旧的SDL_SetVideoMode允许你创建多个窗口。

  • title:窗口标题

  • x,y窗口坐标

  • w,h窗口大小

  • flags

    flags 说明
    SDL_WINDOW_FULLSCREEN fullscreen window
    SDL_WINDOW_FULLSCREEN_DESKTOP fullscreen window at the current desktop resolution
    SDL_WINDOW_OPENGL window usable with OpenGL context
    SDL_WINDOW_HIDDEN window is not visible
    SDL_WINDOW_BORDERLESS no window decoration
    SDL_WINDOW_RESIZABLE window can be resized
    SDL_WINDOW_MINIMIZED window is minimized
    SDL_WINDOW_MAXIMIZED window is maximized
    SDL_WINDOW_SHOWN show window

SDL_DestroyWindow

SDL_DestroyWindow(SDL_Window* window)

销毁窗口。

SDL_LoadBMP

//加载图像
hello = SDL_LoadBMP( "hello.bmp" );

来加载图片。这个函数需要一个指向位图文件的路径作为参数,并返回一个指向加载好的表面的指针。如果在加载过程中发生了错误,这个函数会返回NULL

SDL_Surface

SDL_BlitSurface

 //将图像应用到窗口上
  SDL_BlitSurface( hello, NULL, screen, NULL );

把加载好的图像应用到窗口上。其中第一个参数是源表面,第三个参数是目的表面,它的功能是将源表面粘贴到目的表面上。 在这个程序里,它是将加载好的图像应用到窗口上。

SDL_FreeSurface

//释放已加载的图像
SDL_FreeSurface( hello );

从内存中移除。你不能仅仅使用delete,你必须使用SDL_FreeSurface()来从内存中移除图像。

SDL_CreateRenderer


SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags);

创建渲染上下文。

  • window:指明在那个窗口里进行渲染

  • index:指定渲染驱动的索引号,一般指定为-1

  • flags:

    flags 说明
    SDL_RENDERER_SOFTWARE the renderer is a software fallback
    SDL_RENDERER_ACCELERATED the renderer uses hardware acceleration
    SDL_RENDERER_PRESENTVSYNC present is synchronized with the refresh rate
    SDL_RENDERER_TARGETTEXTURE the renderer supports rendering to texture

SDL_DestroyRenderer

void SDL_DestroyRenderer(SDL_Renderer* renderer)

消毁渲染上下文释放渲染上下文相关的资源。

SDL_RenderClear

int SDL_RenderClear(SDL_Renderer* renderer)

清空渲染目标,该函数的作用是用指定的颜色清空缓冲区

  • renderer :上面创建的渲染上下文。

SDL_RenderCopy

int SDL_RenderCopy(SDL_Renderer*   renderer,
               SDL_Texture*    texture,
               const SDL_Rect* srcrect,
               const SDL_Rect* dstrect)
  • srcrect: 指定 Texture 中要渲染的一部分。如果将 Texture全部输出,可以设置它为 NULL。

  • dstrect: 指定输出的空间大小。

SDL_RenderPresent

void SDL_RenderPresent(SDL_Renderer* renderer)

提交渲染,将缓冲区中的内容输出到目标上,也就是 windows 窗口上。

  • renderer:上面创建的渲染上下文

SDL_CreateTexture

SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,
																Uint32 format,
																int access,
																int w,
																int h)
  • format:指明像素格式,可以是YUV,也可以是RGB
  • access:指明Texture的类型,可以是Stream(视频流),也可以是Target一般的类型

SDL_Texture 与SDL_Surface相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。这些描述信息通过OpenGL、D3D 或 Metal等技术操作GPU,从而绘制出与SDL_Surface一样的图形,且效率更高(因为它是GPU硬件计算的)。

SDL_DestroyTexture

void SDL_DestroyTexture(SDL_Texture* texture)

销毁Texture。

SDL_Delay

SDL_Delay(2000);

让窗口停留一会儿。这里,我们让窗口延时2000毫秒(即2秒)。

SDL_OpenAudio

int SDL_OpenAudio(SDL_AudioSpec* desired,SDL_AudioSpec* obtained)

打开音频设备

  • desired: 设置音频参数。
参数 说明
freq 每秒采频率
SDL_AudioFormat 音频数据存储格式
channels 通道数
silence 静音值
samples 采样个数
size 音频缓冲区大小
SDL_AudioCallback 回调函数
userdata 回调函数参数指针
  • obtained: 返回参数。

SDL_CloseAudio

void SDL_CloseAudio(void)

关闭音频设备

SDL_PauseAudio

void SDL_PauseAudio(int pause_on)

pause_on:0暂停播放,1播放.

SDL_MixAudio

void SDL_MixAudio(Uint8*    dst,
               const Uint8* src,
               Uint32       len,
               int          volume)
  • dst: 目的缓冲区
  • src: 源缓冲区
  • len: 音频数据长度
  • volume: 音量大小,0-128 之间的数。SDL_MIX_MAXVOLUME代表最大音量。

SDL_Quit

SDL_Quit(void)

退出关闭SDL,将会删除窗口表面。

SDL_Log

void SDL_Log(const char* fmt,...)

它与C语言中的printf格式相同。

SDL_GetError

SDL_GetError()

SDL_GL_SetAttribute

设置openGL相关属性

SDL_GetWindowSurface

创建surface

SDL_SetRenderDrawColor

int SDL_SetRenderDrawColor(SDL_Renderer* renderer,Uint8 r,Uint8 g,Uint8 b,Uint8 a)

设置颜色,该函数中的参数a指明了颜色的透明度。

SDL_CreateThread

SDL_Thread* SDL_CreateThread(SDL_ThreadFunction fn,const char* name,void* data)
  • fn:线程要运行的函数
  • name:线程名
  • data:函数参数

SDL_WaitThread

void SDL_WaitThread(SDL_Thread* thread,int* status)

等待线程结束。

SDL_CreateMutex

SDL_mutex* SDL_CreateMutex(void)

创建互斥量

SDL_DestroyMutex

void SDL_DestroyMutex(SDL_mutex* mutex)

销毁互斥量。

SDL_LockMutex

void SDL_LockMutex(SDL_mutex* mutex)

加锁

SDL_UnlockMutex

int SDL_UnlockMutex(SDL_mutex* mutex)

解锁

Event

SDL提供几个简单的API:

  • SDL_WindowEvent : Window窗口相关的事件。

  • SDL_KeyboardEvent : 键盘相关的事件。

  • SDL_MouseMotionEvent : 鼠标移动相关的事件。

  • SDL_QuitEvent : 退出事件。

  • SDL_UserEvent : 用户自定义事件。

SDL_PollEvent

将队列头中的事件抛出来。

SDL_WaitEvent

当队列中有事件时,抛出事件,否则处于阻塞状态,释放cpu。

SDL_WaitEventTimeout

与SDL_WaitEvent的区别就是当到达超时时间后,退出阻塞状态。

SDL_PeekEvent

从队列中取出事件,但该事件不从队列中删除。

SDL_PushEvent

向队列中插入事件。

Draw

SDL_RenderDrawPoint

int SDL_RenderDrawPoint(SDL_Renderer* renderer,int x,int y)	

画点

SDL_RenderDrawPoints

int SDL_RenderDrawPoints(SDL_Renderer* enderer,const SDL_Point* points,int count)
  • points:点数组
  • conunt:点的个数

SDL_RenderDrawLine

int SDL_RenderDrawLine(SDL_Renderer* renderer,
                   int           x1,
                   int           y1,
                   int           x2,
                   int           y2)

画线

SDL_RenderDrawLines

int SDL_RenderDrawLines(SDL_Renderer* renderer,const SDL_Point* points,int count)

该函数会将使用两个相邻的点之间进行连线。最终画出你想画的图形。如画三角形,多边形或圆形。

SDL_RenderDrawRect

int SDL_RenderDrawRect(SDL_Renderer* renderer,const SDL_Rect* rect)
  • rect:要绘制的一块区域,它包括x,y,w,h这几个元素。

SDL_RenderFillRect

int SDL_RenderFillRect(SDL_Renderer* renderer,const SDL_Rect* rect)

使用指定的颜色填充矩形。

SDL_RenderFillRects

int SDL_RenderFillRects(SDL_Renderer* renderer,const SDL_Rect* rects,int count)
  • rects:指定的矩形数组
  • count:指定矩形个数

example

audio

音频例子:

#include <stdio.h>
#include <SDL.h>

#define BLOCK_SIZE 4096000

static Uint8 *audio_buf = NULL;
static Uint8 *audio_pos = NULL;
static size_t buffer_len = 0;

//callback function for audio devcie
void read_audio_data(void *udata, Uint8 *stream, int len){

    if(buffer_len == 0){
        return;
    }

    SDL_memset(stream, 0, len);

    len = (len < buffer_len) ? len : buffer_len;
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);

    audio_pos += len;
    buffer_len -= len;
}


int main(int argc, char *argv[])
{
    int ret = -1;

    FILE *audio_fd = NULL;

    SDL_AudioSpec spec;

    char *path = "./test.pcm";

    //SDL initialize
    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)){
        fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
        return ret;
    }

    //open pcm file
    audio_fd = fopen(path, "r");
    if(!audio_fd){
        fprintf(stderr, "Failed to open pcm file!\n");
        goto __FAIL;
    }

//SDL_AudioSpec
    spec.freq = 44100;;
    spec.format = AUDIO_S16SYS;
    spec.channels = 2;
    spec.silence = 0;
    spec.samples = 1024;;
    spec.callback = read_audio_data;;
    spec.userdata = NULL;

    //open audio devcie
    if(SDL_OpenAudio(&spec, NULL)){
        fprintf(stderr, "Failed to open audio device, %s\n", SDL_GetError());
        goto __FAIL;
    }

    //play audio
    SDL_PauseAudio(0);

    do{
        //read data from pcm file
        buffer_len = fread(audio_buf, 1, BLOCK_SIZE, audio_fd);
        fprintf(stderr, "block size is %zu\n", buffer_len);

        audio_pos = audio_buf;

        //the main thread wait for a moment
        while(audio_pos < (audio_buf + buffer_len)) {
            SDL_Delay(1);
        }

    }while(buffer_len !=0);

    //close audio device
    SDL_CloseAudio();

    ret = 0;

__FAIL:
    //release some resources
    if(audio_buf){
        free(audio_buf);
    }

    if(audio_fd){
        fclose(audio_fd);
    }
    
    //quit SDL
    SDL_Quit();

    return ret;
}
posted @   alvinlyb  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示