跳轉到內容

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 - 一個免費的跨平臺圖形介面
華夏公益教科書