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 所需的基本函数位于 <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 机器编写代码时,需要包含
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 子系统时,您必须始终先对其进行初始化。在以下 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_Quit();
但是,这只会关闭主子系统;关闭 TTF 子系统需要使用不同的函数
TTF_Quit();
SDL (简单直接媒体层)/基础/在 Windows 上入门
此页面或部分是未完成的草稿或大纲。 您可以帮助 完成工作,或者您可以在 项目室 中寻求帮助。 |
从 Linux 发行版的官方存储库中安装 SDL 的开发库。
$ gcc sdl.c -o sdl -lSDL2
参数 -lSDL2
表示在使用 gcc
编译 sdl.c
后,使用 -o
参数命名的二进制文件 sdl
将链接到 SDL 2 运行时库。
注意:将二进制文件链接到 SDL 1.2 库需要 -lSDL
参数。
要继续使用终端构建源代码,您可以使用 GNU Make、CMake 或普通的 Makefile。
在本节中,我们将演示如何创建和销毁基本的 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 中,最好先初始化变量,以便了解它们是在何时以及如何使用的。在这种情况下,我们初始化一个名为 window
的 SDL_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
宏定义为 3000 毫秒。
SDL_Delay(DELAY);
您可以在 SDL Wiki 中了解更多关于 SDL_Delay
的信息。
为了关闭窗口并释放内存,我们必须销毁窗口。销毁 window
比创建它要简单得多。
SDL_DestroyWindow(window);
您可以在 SDL Wiki 中了解更多关于 SDL_DestroyWindow
的信息。