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 - 一個免費的跨平臺圖形介面