SDL2.0-简介

本文介绍SDL(SimpleDirectMediaLayer)多媒体库的安装、事件处理及示例代码。SDL用于跨平台的游戏开发,处理多媒体如视频渲染、音频播放等。文章详细讲解了Windows环境下SDL的安装步骤,包括头文件、lib和dll的使用。此外,还探讨了SDL如何通过消息循环处理事件,如键盘、鼠标操作,并提供了一个播放自定义事件的Demo。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
    

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. 定义事件类型的宏

      #define SDL_CUSTOM_EVENT (SDL_USEREVENT + 1)

    2. 发送自定义事件

      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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值