Hello SDL World

ここ数日、「C/C++へのLua組込み実践」を読んでいるんですけど、サンプルでSDLが使われています。解説はLua中心とはいえ全く知らない状態では読む気にならないので、ちょっと触ってみる事にしました。環境はOSXです。

screenshot of hello sdl sample

インストールは特に変わった事はなく普通にmake installするだけです。これでlibSDLmain.a libSDL.aがインストールされるのでリンクして使えばいい感じですね。

$ wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz
$ tar zxvf SDL-1.2.14.tar.gz
$ cd SDL-1.2.14
$ ./configure
$ make
$ sudo make install

そして以下がハローワールド的なサンプルです。四角とビットマップを描画しています。冒頭の画像はこのサンプルを実行した時のものになります。Eventループの書き方がやや特徴的な感じがしますが、それ以外は良くある雰囲気のコードですね。

#include "SDL.h"
#include "stdio.h"

int main(int argc,char *argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr,"failed to init SDL.\n");
        exit(1);
    }

    SDL_Surface *screen = SDL_SetVideoMode(520, 350, 32, SDL_SWSURFACE);
    if (!screen) {
	fprintf(stderr,"failed to get screen.\n");
	SDL_Quit();
	exit(1);
    }

    // draw bitmap
    SDL_Surface *img = SDL_LoadBMP("hellosdl.bmp");
    if (img) {
	SDL_Rect dst = {10, 30, 0, 0};
	SDL_BlitSurface(img, NULL, screen, &dst);
	SDL_FreeSurface(img);
    }

    // draw rect
    SDL_Rect rect = {10, 10, 100, 100};
    SDL_FillRect(screen, &rect, 0x0000FF00);

    // update screen
    SDL_UpdateRect(screen, 0, 0, 0, 0);

    // event loop
    while (1) {
	SDL_Event evt = {};	    
	while(SDL_PollEvent(&evt)) {
	    switch (evt.type) {
	    case SDL_QUIT:
		goto EXIT;
		break;
	    }
	}
    }

  EXIT:
    SDL_Quit();
    return 0;
}

ビルドが少し変わっていて、sdl-configコマンドを使って以下のように行うようです。

$ g++ main.cpp `sdl-config --cflags --libs`

あんまり把握してないんですけど、WindowとかEventとかプラットフォームに依存した部分をSDLで書いとけばクロスプラットフォームなコードが書けるらしいよっていう認識です。

ざっくりとしたチュートリアルっぽいドキュメントはコレで、リファレンスはコレ。あんまりドキュメントは整備されていないので、ヘッダを読むのが早いかもしれませんね。

Leave a Reply

Your email address will not be published. Required fields are marked *