SDL
,“Simple DirecMedia Layer
”,是一套跨平台的多媒体开发库。用于游戏开发中的多媒体处理,比如视频渲染,音频播放,鼠标/键盘控制等。对外提供统一的接口,内部会根据不同的平台调用底层的API
。这里我们主要分析播放音频和视频的接口。
1、安装SDL
-
官网
http://www.libsdl.org/
-
使用:windows可以直接下载sdl的头文件,
lib
和dll
。使用时,需要包含头文件和库文件,运行时需要dll文件。linux平台可以自己编译 -
下载windows VC的开发包,解压后内容如下
├─docs //一些文档 │ ├─include //头文件 │ └─lib //lib和dll ├─x64 │ SDL2.dll │ SDL2.lib │ SDL2main.lib │ SDL2test.lib │ └─x86 SDL2.dll SDL2.lib SDL2main.lib SDL2test.lib
2、事件处理
SDL
通过消息循环处理各种事件。
-
SDL_PollEvent
取出消息。返回值:0-没有消息,1-有消息 -
SDL_Event
消息事件,其中type
指定具体的事件类型。一些事件类型定义如下//SDL_event.h中 SDL_QUIT 退出,点右上角的x SDL_KEYDOWN 键盘相关 SDL_KEYUP SDL_MOUSEMOTION 鼠标相关 SDL_MOUSEBUTTONDOWN SDL_MOUSEBUTTONUP SDL_MOUSEWHEEL ...
-
自定义事件
-
定义事件类型的宏
#define SDL_CUSTOM_EVENT (SDL_USEREVENT + 1)
-
发送自定义事件
SDL_Event event; event.type = SDL_CUSTOM_EVENT; SDL_PushEvent(&event);
-
3、Demo
头文件
#ifndef _SDL_HEADER_H__
#define _SDL_HEADER_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include "SDL.h"
#include "SDL_main.h"
#include "SDL_types.h"
#ifdef __cplusplus
}
#endif
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
#endif
实现:
#include "SDLHeader.h"
#include <iostream>
#include <thread>
#define SDL_CUSTOM_EVENT (SDL_USEREVENT+1)
int main(int argc, char* argv[])
{
bool quit = false;
SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
SDL_Init(SDL_INIT_VIDEO); //init sdl
window = SDL_CreateWindow( //init window
"First Window",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
);
if (!window)
return -1;
renderer = SDL_CreateRenderer(window, -1, 0); //init renderer
if (!renderer)
return -1;
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); //设置渲染器颜色
SDL_RenderClear(renderer); //清理renderer
SDL_RenderPresent(renderer); //绘制renderer
//启动线程,创建自定义的事件
std::thread th([]() {
SDL_Delay(3000);
SDL_Event event;
event.type = SDL_CUSTOM_EVENT;
SDL_PushEvent(&event);
return 0;
});
SDL_Event windowsEvent;
while (!quit)
{
while (SDL_PollEvent(&windowsEvent))
{
switch (windowsEvent.type)
{
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
std::cout << "key down event" << std::endl;
break;
case SDL_KEYUP:
std::cout << "key up event" << std::endl;
break;
case SDL_MOUSEBUTTONUP:
std::cout << "mouse button up event" << std::endl;
break;
default:
std::cout << "event type=" << windowsEvent.type << " come" << std::endl;
break;
}
}
}
if (th.joinable())
th.join();
SDL_DestroyRenderer(renderer); //销毁renderer
SDL_DestroyWindow(window); //销毁windows
SDL_Quit(); //退出
return 0;
}