跳转到内容

X 窗口编程/SDL

来自维基教科书,开放的书籍,为开放的世界
多个 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++PerlPython (通过 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(简单的富文本格式渲染)。

C 代码示例

[编辑 | 编辑源代码]
// 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 - 一个免费的跨平台图形界面
华夏公益教科书