📜  C C++中的SDL库和示例(1)

📅  最后修改于: 2023-12-03 15:13:44.439000             🧑  作者: Mango

SDL库介绍

SDL库是Simple DirectMedia Layer的缩写,它是一个跨平台的图形、音频、输入、事件以及线程库。SDL库提供了底层硬件访问和高层软件抽象的结合,相对于其他图形库来说它更加直接和轻量级。该库被广泛应用在游戏、模拟器、媒体播放器等多个领域。当前SDL库有两个版本:SDL1和SDL2。SDL2更新了很多API,并且加入了新的特性,如全屏、多窗口等。

SDL库的特点
  • 跨平台
  • 直接、轻量级
  • 提供音频、图形、输入、事件等多种接口
  • 支持全屏、多窗口等特性
  • 经过了多年的发展和测试,非常稳定
SDL库的优势

在下面几个方面,SDL库有着不同于其他库的优势:

  • 简单易学:相对于其他库来说,SDL库的API更加直接、不那么复杂,可以大大降低初学者的学习难度。
  • 跨平台:SDL库可以运行在Windows、Linux、MAC等多个平台上,让开发者无需特别担心跨平台的问题。
  • 高性能:SDL库经过了长时间的优化和测试,使用时可以获得更高的性能。
  • 大量示例代码:几乎所有常见的SDL库功能都有相应的示例代码,这可以方便开发者快速上手开发。
SDL库的安装

SDL1的安装

下载地址:https://www.libsdl.org/release/SDL-1.2.15.tar.gz

安装步骤:

  1. 解压源码包:tar zxvf SDL-1.2.15.tar.gz
  2. 进入解压后的目录:cd SDL-1.2.15
  3. 配置编译参数:./configure
  4. 编译源码:make
  5. 安装SDL库:sudo make install

SDL2的安装

下载地址:https://www.libsdl.org/release/SDL2-2.0.14.tar.gz

安装步骤:

  1. 解压源码包:tar zxvf SDL2-2.0.14.tar.gz
  2. 进入解压后的目录:cd SDL2-2.0.14
  3. 配置编译参数:./configure
  4. 编译源码:make
  5. 安装SDL库:sudo make install

注意:在Windows平台上,可以直接下载对应的SDL库的预编译版本并安装。

SDL库基础示例

下面就让我们来看一些SDL库的基础示例。

初始化SDL库
#include <stdio.h>
#include <SDL.h>

int main(int argc, char* argv[]) {
    // 初始化SDL库
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("SDL_Init Error: %s", SDL_GetError());
        return 1;
    }

    // 释放所有资源并退出SDL库
    SDL_Quit();

    return 0;
}
创建窗口并渲染颜色
#include <stdio.h>
#include <SDL.h>

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("SDL_Init Error: %s", SDL_GetError());
        return 1;
    }

    // 创建SDL的窗口对象
    SDL_Window* window = SDL_CreateWindow("SDL Example",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        640, 480, SDL_WINDOW_SHOWN);
    if (window == NULL) {
        printf("SDL_CreateWindow Error: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // 创建SDL的渲染器对象
    SDL_Renderer* renderer =
        SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (renderer == NULL) {
        printf("SDL_CreateRenderer Error: %s", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    // 设置背景颜色
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

    // 清空窗口
    SDL_RenderClear(renderer);

    // 刷新窗口
    SDL_RenderPresent(renderer);

    // 等待3秒
    SDL_Delay(3000);

    // 释放资源
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}
处理键盘事件
#include <stdio.h>
#include <SDL.h>

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("SDL_Init Error: %s", SDL_GetError());
        return 1;
    }

    SDL_Window* window = SDL_CreateWindow("SDL Example",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        640, 480, SDL_WINDOW_SHOWN);
    if (window == NULL) {
        printf("SDL_CreateWindow Error: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    SDL_Renderer* renderer =
        SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (renderer == NULL) {
        printf("SDL_CreateRenderer Error: %s", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);

    int running = 1;
    SDL_Event event;
    while (running) {
        while (SDL_PollEvent(&event) != 0) {
            // 用户关闭窗口事件
            if (event.type == SDL_QUIT) {
                running = 0;
            }

            // 键盘按下事件
            if (event.type == SDL_KEYDOWN) {
                if (event.key.keysym.sym == SDLK_ESCAPE) {
                    running = 0;
                }
            }
        }
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}
总结

本文介绍了SDL库的基础知识和示例代码,SDL库可以协助程序员开发直接、轻量级,且跨平台、高性能的应用程序。熟练掌握SDL库可以让你的开发更加容易且效率更高,快来尝试使用吧!