[] 目次 []

Simple DirectMedia Layer API を使う

ビデオ

  • ビデオモードの選択と設定 (簡単な方法)

    あなたの好きな bpp と解像度を選んで、 設定するだけです!

Tip #1:
ハードウェアがサポートしている最も高速な bpp を見つけるには SDL_GetVideoInfo() 関数を使います。

Tip #2:
SDL_ListModes() を使うとある特定の bpp でサポートされた解像度のリストを 手に入れることができます。

サンプルコード:
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) {
        fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError());
        exit(1);
    }
}
  • 画面へのピクセル描画

    画面への描画はグラフィックスフレームバッファに 直接書き、画面の更新関数を呼ぶことで行うことができます。

Tip:
たくさん描画することがわかっている場合は、 描画を始める前に(必要があれば)画面をロックし、 更新が必要な領域のリストを持ちながら描画し、 表示を更新する前に再び画面をアンロックするのがベストです。
サンプルコード:

Drawing 任意のフォーマットの画面にピクセルを描画する

#include <SDL_endian.h>	/* エンディアンに依存しない 24bpp モードの時に使われる */

void DrawPixel(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if ( SDL_MUSTLOCK(screen) ) {
        if ( SDL_LockSurface(screen) < 0 ) {
            return;
        }
    }
    switch (screen->format->BytesPerPixel) {
        case 1: { /* 8-bpp と仮定 */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: { /* たぶん 15-bpp か 16-bpp */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: { /* 遅い 24-bpp モード、普通は使われない */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
            if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                bufp[0] = color;
                bufp[1] = color >> 8;
                bufp[2] = color >> 16;
            } else {
                bufp[2] = color;
                bufp[1] = color >> 8;
                bufp[0] = color >> 16;
            }
        }
        break;

        case 4: { /* たぶん 32-bpp */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }
    if ( SDL_MUSTLOCK(screen) ) {
        SDL_UnlockSurface(screen);
    }
    SDL_UpdateRect(screen, x, y, 1, 1);
}
  • 画像のロードと表示

    SDL には 1 枚の画像をロードする便利な関数 SDL_LoadBMP() があります。 画像ロードのためのライブラリは SDL demo アーカイブで 見つけることができます。

    SDL_BlitSurface() を使って画像をグラフィックス フレームバッファに転送(blit)することで、 ひょうじすることができます。 SDL_BlitSurface() は、 画面の変更された部分をアップデートする SDL_UpdateRects() に渡されるべき 転送用矩形領域を、自動的にクリッピングします。

Tip #1:
何回も表示される画像をロードしているのならば、 画面のピクセルフォーマットに変換することで、 転送スピードを上げることができます。 SDL_DisplayFormat() 関数がこの変換を行ってくれます。

Tip #2:
スプライト画像には透明な背景を持っているものが多いです。 SDL_SetColorKey() 関数を使って透明転送(カラーキー転送)を 有効にすることができます。

サンプルコード:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;

    /* BMP ファイルをサーフェスにロードする */
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
        return;
    }

    /* サーフェスを画面に転送する。
	   この時点ではサーフェスはロックしてはいけない。
     */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /* 画面の変更された部分を更新する */
    SDL_UpdateRects(screen, 1, &dest);
}

[] 目次 []