跳转到内容

SDL (简易直接媒体层) - 创建窗口

来自维基教科书,开放书籍,为开放世界

在本节中,我们将演示如何创建和销毁基本的 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 的信息。

华夏公益教科书