本文共 3243 字,大约阅读时间需要 10 分钟。
SDL
,“Simple DirecMedia Layer
”,是一套跨平台的多媒体开发库。用于游戏开发中的多媒体处理,比如视频渲染,音频播放,鼠标/键盘控制等。对外提供统一的接口,内部会根据不同的平台调用底层的API
。这里我们主要分析播放音频和视频的接口。
官网 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
SDL
通过消息循环处理各种事件。
SDL_PollEvent
取出消息。返回值:0-没有消息,1-有消息
SDL_Event
消息事件,其中type
指定具体的事件类型。一些事件类型定义如下
//SDL_event.h中SDL_QUIT 退出,点右上角的xSDL_KEYDOWN 键盘相关SDL_KEYUPSDL_MOUSEMOTION 鼠标相关SDL_MOUSEBUTTONDOWNSDL_MOUSEBUTTONUPSDL_MOUSEWHEEL...
自定义事件
定义事件类型的宏
#define SDL_CUSTOM_EVENT (SDL_USEREVENT + 1)
发送自定义事件
SDL_Event event;event.type = SDL_CUSTOM_EVENT;SDL_PushEvent(&event);
头文件
#ifndef _SDL_HEADER_H__#define _SDL_HEADER_H__#ifdef __cplusplusextern "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#include #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;}
转载地址:http://ftmxb.baihongyu.com/