SDL
URL: https://www.libsdl.org/
ライセンス: LGPL
概要
SDL とは Simple DirectMedia Layer の略で、その名が示すとおりアプリケーションからメディアを簡単にかつ直接的にいじるためのライブラリである。様々なプラットフォームをサポートしており、Linux・Windows・MacOS などの各種プラットフォームで動くソフトウェアを構築することを容易にする。
SDLの機能
SDL が何を簡単にしてくれているかを理解するには、次の例を考えると分かりやすい。マウスで絵を描くようなソフトウェアを作ろうとしたとき、普通に考えれば、ある程度の大きさのビットマップを画面上に表示し、そのビットマップはピクセル単位で色を変えられるようにしたいだろう。ところが、最近の高度なデスクトップ GUI システムでは、ウィンドウを一つ開くだけでも、長々と GUI システムの初期をしたりハンドラを取得したりと色々と関数を呼び出すことが要求されるため、大変面倒なことになる。また、ボタンやメニューを表示するのは一行で書けても、自由に書き換え可能なビットマップを表示するのはそう簡単ではない。これが一昔前なら、画面に表示されるグラフィックはすべてメモリ上のある特定領域から読み出されるという仕組だったので、何かを表示するのは非常に簡単であった。
SDLだと、ウィンドウを開くには初期化とビデオモードの宣言の2行で事足りる。またそのウィンドウは対応するビットマップ領域がすでに確保されているので、アプリケーションからは SDL から渡されたメモリ領域をいじるだけで簡単に絵を描くことができるようになる。
また、Linux・Windows・MacOS それぞれで、ウィンドウの開き方やマウスの座標取得の方法はまったく異なっており、それらに対処するのは面倒な手間が必要だったが、 SDL はプラットフォームの差異を吸収してくれ、同一の呼び出し手順で実現することができるようになっている。
現在 SDL が面倒を見てくれる機能は以下の通り。
- グラフィック
- OpenGL
- 音声
- キーボード・マウス入力
- ジョイスティック入力
- ファイル入出力
- CD-ROMへのアクセス
- スレッドプログラミング
- ウェイト処理
また、追加ライブラリをインストールすれば、ネットワークアクセスや TrueType フォントの処理もサポートされる。
SDLが向いている場合
高度な GUI を必要とせず、ビットマップ主体でそれを描くための枠組が提供されていないような場合には、SDL は便利に使えるだろう。 また、画面表示のすべてを OpenGL で処理するような場合にも、SDL で省力化を図ることができる。
SDL が採用されているプロジェクトは SDL のページから見ることができるが、やはりゲームでの採用事例が一番多い。中でもスーパーファミコンの頃まで全盛だった 2D ゲームの開発において SDL は非常に便利だ。 また、レンダリングに OpenGL を使った 3D ゲームも、SDL を使ったものがよく見られる。
逆に、ボタンやメニューなどの GUI を存分に使いたいとか、曲線や楕円などの図形要素を駆使して絵を描きたいという場合には、 SDL の原始的なピクセル単位での描画では少々辛い。補助ライブラリを導入してなんとかすることも可能ではあるが、そういう要求がある場合には SDL は使わない方がよいだろう。
サンプル
以下のプログラムは、100x100の大きさのウィンドウを開き、左上から順番に白く塗り潰していき、右下まで辿り着いたらウィンドウを閉じて終了する。
#include <SDL/SDL.h>
int main()
{
SDL_Surface *screen;
int x, y;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(100, 100, 32, SDL_SWSURFACE);
for(y = 0; y < screen->h; y++) {
for(x = 0; x < screen->w; x++) {
*(unsigned int *)(screen->pixels + y * screen->pitch + x * 4) = 0xffffff;
SDL_Flip(screen);
}
}
SDL_Quit();
return 0;
}
関連
- Ruby/SDL - Ruby から SDL を使うためのバインディング。
- SDL_gfx - SDL の画面で簡単な図形要素を描くためのライブラリ。直線や楕円などが描ける。アンチエイリアスによりギザギザを除去した綺麗な線が描けたり、アルファブレンディングによる透過処理がサポートされている。
- SDL_image - 様々な形式の画像ファイルの読み込みをサポート。
- SDL_net - 通信機能を追加するライブラリ。どの OS からでも同じ API で通信できる。
- SDL_mixer - 多チャンネル音声出力のためのライブラリ。ゲームで効果音を鳴らすことを主目的に設計されている。
- SDL_ttf - TrueType フォントのレンダラ。FreeType を使った高品質なレンダリングができる。
- EffecTV - SDL をビデオ画面の表示とキー入力処理に用いている。