跳转到内容

SDL (简单直接媒体层) - 基础

25% developed
来自维基教科书,开放世界中的开放书籍

在本节中,我们将向您展示如何初始化和关闭 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();


在各种操作系统上设置

[编辑 | 编辑源代码]

在 Windows 上入门

[编辑 | 编辑源代码]

SDL (简单直接媒体层)/基础/在 Windows 上入门

在 macOS 上入门

[编辑 | 编辑源代码]

SDL (简单直接媒体层)/基础/在 macOS 上入门

在 Linux 上入门

[编辑 | 编辑源代码]

从 Linux 发行版的官方存储库中安装 SDL 的开发库。

$ gcc sdl.c -o sdl -lSDL2

参数 -lSDL2 表示在使用 gcc 编译 sdl.c 后,使用 -o 参数命名的二进制文件 sdl 将链接到 SDL 2 运行时库。

注意:将二进制文件链接到 SDL 1.2 库需要 -lSDL 参数。

要继续使用终端构建源代码,您可以使用 GNU Make、CMake 或普通的 Makefile。

Code::Blocks

[编辑 | 编辑源代码]


创建窗口

[编辑 | 编辑源代码]

在本节中,我们将演示如何创建和销毁基本的 SDL 窗口。以下代码将创建一个名为“SDL 示例”的窗口,宽度为 800 像素,高度为 600 像素,并在屏幕上显示 3000 毫秒。

#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

/* Sets constants */
#define WIDTH 800
#define HEIGHT 600
#define DELAY 3000

int main (int argc, char **argv)
{
  /* Initialises data */
  SDL_Window *window = NULL;
  
  /*
  * 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;
  }

  /* Creates a SDL window */
  window = SDL_CreateWindow("SDL Example", /* Title of the SDL window */
			    SDL_WINDOWPOS_UNDEFINED, /* Position x of the window */
			    SDL_WINDOWPOS_UNDEFINED, /* Position y of the window */
			    WIDTH, /* Width of the window in pixels */
			    HEIGHT, /* Height of the window in pixels */
			    0); /* Additional flag(s) */

  /* Checks if window has been created; if not, exits program */
  if (window == NULL) {
    fprintf(stderr, "SDL window failed to initialise: %s\n", SDL_GetError());
    return 1;
  }

  /* Pauses all SDL subsystems for a variable amount of milliseconds */
  SDL_Delay(DELAY);

  /* Frees memory */
  SDL_DestroyWindow(window);
  
  /* Shuts down all SDL subsystems */
  SDL_Quit(); 
  
  return 0;
}

您可以从此处下载本节的源代码:GitLab 仓库。所有源代码都存储在 此组 中。

设置数据

[编辑 | 编辑源代码]

为了创建窗口,我们需要指定其高度和宽度。在这种情况下,我们使用宏定义全局常量。我们将宽度设置为 800 像素,高度设置为 600 像素。

#define WIDTH 800
#define HEIGHT 600

在此程序中,我们将不得不暂停 SDL 子系统以使窗口保持打开状态。我们将延迟时间设置为 3000 毫秒。

#define DELAY 3000

在 C 中,最好先初始化变量,以便了解它们是在何时以及如何使用的。在这种情况下,我们初始化一个名为 windowSDL_Window 指针。在 SDL 中,几乎所有对象都以指针的形式初始化。

SDL_Window *window = NULL;

创建窗口

[编辑 | 编辑源代码]

为了创建窗口,我们需要使用 SDL_CreateWindow 函数并设置一些参数。

window = SDL_CreateWindow("SDL Example", /* Title of the SDL window */
			  SDL_WINDOWPOS_UNDEFINED, /* Position x of the window */
			  SDL_WINDOWPOS_UNDEFINED, /* Position y of the window */
			  WIDTH, /* Width of the window in pixels */
			  HEIGHT, /* Height of the window in pixels */
			  0); /* Additional flag(s) */

您可以在 SDL Wiki 中了解有关 SDL_CreateWindow 的更多信息。

使用 SDL_Delay

[编辑 | 编辑源代码]

在示例代码中,我们使用了 SDL_Delay 函数来暂停 SDL 子系统一段时间(以毫秒为单位),并在窗口打开时允许窗口显示在屏幕上。在本例中,暂停时间由 DELAY 宏定义为 3000 毫秒。

SDL_Delay(DELAY);

您可以在 SDL Wiki 中了解更多关于 SDL_Delay 的信息。

销毁窗口

[编辑 | 编辑源代码]

为了关闭窗口并释放内存,我们必须销毁窗口。销毁 window 比创建它要简单得多。

SDL_DestroyWindow(window);

您可以在 SDL Wiki 中了解更多关于 SDL_DestroyWindow 的信息。

华夏公益教科书