X 窗口编程/SDL
简单直接媒体层 (SDL) 是一个用 C 语言编写的跨平台多媒体库,它在各种平台的图形、声音和输入 API 之上创建了一个抽象层,允许开发人员编写一次计算机游戏或其他多媒体应用程序,并在包括 GNU/Linux、Microsoft Windows 和 MacOS X 在内的许多操作系统上运行。它管理视频、事件、数字音频、CD-ROM、声音、线程、共享对象加载、网络和计时器。
Sam Lantinga 创建了这个库,在 1998 年初为 Loki Software 工作时首次发布。他是在将 Windows 应用程序移植到 Macintosh 时想到这个想法的。然后,他使用 SDL 将 Doom 移植到 BeOS。出现了几个其他可以与 SDL 一起使用的免费库,例如 SMPEG 和 OpenAL。
SDL 库几乎与所有编程语言都有绑定,从流行的(C++、Perl、Python (通过 pygame)、Pascal 等)到鲜为人知的(例如 Euphoria 或 Pliant)。这以及它是开源并根据 LGPL 许可的事实使 SDL 成为许多多媒体应用程序的常见选择。
SDL 本身非常简单;它仅仅充当一个轻量级的跨平台包装器,提供对 2D 像素操作、声音、文件访问、事件处理、计时、线程等的支持。 OpenGL 通常与 SDL 一起使用以提供快速的 3D 渲染。它通常被认为是一个跨平台的 DirectX,尽管它缺少一些更高级的功能。相反,SDL 有大量的第三方扩展,这些扩展使执行更高级的功能变得容易。
该库分为几个子系统,即视频(处理表面函数和 OpenGL)、音频、CD-ROM、操纵杆和计时器子系统。除了这种基本的低级支持之外,还有一些依赖于 SDL 的库可以提供一些额外的功能。这些包括 SDL_image(提供了一种轻松加载当今最常见图像格式的方法)、SDL_mixer(复杂音频功能,主要用于声音混合)、SDL_net(网络支持)、SDL_ttf(TrueType 字体渲染支持)、SDL_gfx(一些额外的图形函数,例如图像调整大小和旋转)和 SDL_rtf(简单的富文本格式渲染)。
// Headers
#include "SDL.h"
// Main function
int main( int argc, char* argv[] )
{
// Initialize SDL
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
return 1;
// Delay 2 seconds
SDL_Delay( 2000 );
// Quit SDL
SDL_Quit();
// Return
return 0;
}
一个非常基本的 SDL 程序。它加载 SDL 子系统,暂停 2 秒,关闭 SDL,然后退出程序。
这里有更多高级示例
#include <SDL.h>
#define DIM 400.0
int main() {
SDL_Surface *screen = SDL_SetVideoMode(DIM, DIM, 0, 0);
SDL_Surface *surface = SDL_CreateRGBSurface(SDL_SWSURFACE, DIM, DIM, 24, 0xFF, 0xFF00, 0xFF0000, 0);
double fact = 2;
double cx = -0.74364500005891;
double cy = 0.13182700000109;
while (fact > 1e-18) {
double xa = cx - fact;
double ya = cy - fact;
int y;
for (y = 0; y < DIM; y++) {
Uint8 *pixline = surface->pixels + y*surface->pitch;
double y0 = ya + y/DIM*2*fact;
int x;
for (x = 0; x < DIM; x++) {
double x0 = xa + x/DIM*2*fact;
double xn = 0, yn = 0, tmpxn;
int i;
for (i = 0; i<512; i++) {
tmpxn = xn*xn - yn*yn + x0;
yn = 2*xn*yn + y0;
xn = tmpxn;
if (xn*xn + yn*yn > 4)
break; // approximate infinity
}
if (i == 512) {
// in Mandelbrot set
pixline[x*3] = pixline[x*3+1] = pixline[x*3+2] = 0;
} else {
// not in Mandelbrot set; use escape iteration value to set color (grades of blue then white)
pixline[x*3] = pixline[x*3+1] = i < 256 ? 0 : i - 256;
pixline[x*3+2] = i < 256 ? i : 255;
}
}
}
SDL_BlitSurface(surface, NULL, screen, NULL);
SDL_Flip(screen);
fact /= 2;
}
SDL_Quit();
return(0);
}
这很容易在 Linux 下使用“gcc `sdl-config --cflags --libs` -O3 mandelbrot.c && ./a.out”编译和运行,在 Windows 下也是如此,但您必须使用 MinGW 来编译它。
- SMPEG - SDL MPEG 播放器库
- Guichan 和 ParaGUI - 小部件集
- GGI - 一个免费的跨平台图形界面