跳转到内容

SDL (简单直接媒体层) - 入门

来自维基教科书,开放的书籍,面向开放的世界

在本节中,我们将向您展示如何初始化和关闭 SDL 子系统。

#include <stdio.h> /* printf and fprintf */

#ifdef _WIN32
#include <SDL/SDL.h> /* Windows-specific SDL2 library */
#else
#include <SDL2/SDL.h> /* macOS- and GNU/Linux-specific */
#endif
 
int main (int argc, char **argv)
{
  /*
  * Initialises the SDL video subsystem (as well as the events subsystem).
  * Returns 0 on success or a negative error code on failure using SDL_GetError().
  */
  if (SDL_Init(SDL_INIT_VIDEO) != 0)
  {
    fprintf(stderr, "SDL failed to initialise: %s\n", SDL_GetError());
    return 1;
  }
 	
  printf("SDL initialised!");

  /* Shuts down all SDL subsystems */
  SDL_Quit(); 
  
  return 0;
}

您可以从这个 GitLab 仓库 下载本节的源代码。所有源代码都存储在这个 中。

链接 SDL2 库

[编辑 | 编辑源代码]

SDL2 所需的基本函数位于 <SDL/SDL.h> 库或 <SDL2/SDL.h> 库中,具体取决于操作系统,因此上述源代码使用

#ifdef _WIN32
#include <SDL/SDL.h> /* Windows-specific SDL2 library */
#else
#include <SDL2/SDL.h> /* macOS- and GNU/Linux-specific */
#endif

Windows 中的 main 宏

[编辑 | 编辑源代码]

在为 Windows 机器编写代码时,必须包含

int main (int argc, char **argv)

因为 SDL 会覆盖 main 宏。根据 SDL 的 FAQWindows

您应该使用 main() 而不是 WinMain(),即使您正在创建一个 Windows 应用程序,因为 SDL 提供了一个 WinMain() 版本,它在调用您的主代码之前执行一些 SDL 初始化。如果您出于某种原因需要使用 WinMain(),请查看 SDL 源代码中的 src/main/win32/SDL_main.c,以了解您在 WinMain() 函数中需要执行哪些初始化才能使 SDL 正常工作。

初始化 SDL 子系统

[编辑 | 编辑源代码]

使用 SDL 子系统时,您必须始终先初始化它。在下面的 if 语句中,我们使用标志 SDL_INIT_VIDEO 初始化 SDL 视频子系统。如果成功,它将返回 0,否则它将返回一个负的错误代码,并将使用 SDL_GetError 通过 stderr 流打印有关错误的信息。

/*
* Initialises the SDL video subsystem (as well as the events subsystem).
* Returns 0 on success or a negative error code on failure using SDL_GetError().
*/
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
  fprintf(stderr, "SDL failed to initialise: %s\n", SDL_GetError());
  return 1;
}

您可以使用 | 运算符初始化多个子系统

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0)
{
  fprintf(stderr, "SDL failed to initialise: %s\n", SDL_GetError());
  return 1;
}

有关 SDL_Init 函数子系统及其标志的所有信息,请参阅 SDL Wiki 的 SDL_Init 页面

关闭 SDL 子系统

[编辑 | 编辑源代码]

要关闭 SDL 子系统,您必须执行

SDL_Quit();

但是,这只会关闭主要子系统;关闭 TTF 子系统需要一个不同的函数

TTF_Quit();

华夏公益教科书