当前位置:   article > 正文

SDL2.0-简介_sdl2官网

sdl2官网

SDL,“Simple DirecMedia Layer”,是一套跨平台的多媒体开发库。用于游戏开发中的多媒体处理,比如视频渲染,音频播放,鼠标/键盘控制等。对外提供统一的接口,内部会根据不同的平台调用底层的API。这里我们主要分析播放音频和视频的接口。

1、安装SDL

  • 官网 http://www.libsdl.org/

  • 使用:windows可以直接下载sdl的头文件,libdll。使用时,需要包含头文件和库文件,运行时需要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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 自定义事件

    1. 定义事件类型的宏

      #define SDL_CUSTOM_EVENT (SDL_USEREVENT + 1)

    2. 发送自定义事件

      SDL_Event event;
      event.type = SDL_CUSTOM_EVENT;
      SDL_PushEvent(&event);
      
      • 1
      • 2
      • 3

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

实现:

#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/1018888
推荐阅读
  

闽ICP备14008679号