SDL2.0の紹介

  • (by K, 2020.09.03)

(0)

  • SDL (Simple DirectMedia Layer) は、様々な環境でも共通の書き方でグラフィックやサウンド再生を可能にする、C言語で書かれたライブラリです。Windows、macOS、Linux、iOS、Androidを公式にサポートしています。
  • 一度覚えれば、他の環境でも同じように使えるので、やってみて損はないと思います。
  • SDLを使うと、自作言語にグラフィック命令を追加することができるでしょう。言語の見栄えは大幅に向上すると思います。そしてSDLを使うのはそんなに難しいことではないので、とてもおすすめです。

(1)

  • まず自分の開発環境にどうやってSDLをインストールするかについては、私も網羅的にはわかっていないので、各自解決してください。
    • Android上のTermuxで、SDLを使えるようにする方法については、 termux001の(4)に書きました。
    • WindowsやMacOSは、https://www.libsdl.org/download-2.0.php に行って、「Development Libraries」からダウンロードすればいいのかな?
    • WindowsのMinGWでやるときは、リンクするライブラリの順番を「-lmingw32 libSDL2main.a libSDL2.dll.a」にしたらうまくいきました。

(2)

  • (2-1)ウィンドウを開くまで
    #include <SDL2/SDL.h>
    int main()
    {
        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) < 0) {
            初期化失敗エラー
        }
        SDL_Window *win = SDL_CreateWindow("title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 240, 0);
        SDL_Delay(30 * 1000);
        return 0;
    }
    • これだけでウィンドウが出てきて、30秒後にウィンドウが閉じられます。本当はdelayしなくてもいいのですが、そうすると一瞬でウィンドウが閉じられてしまって何が何だかわからないと思うので・・・。
    • 上記例だとウィンドウのタイトルは title で、サイズは320x240ピクセルになります。
    • だから自分の望むものにしたければ、どこをどう変えればいいのかわかるでしょう。
  • (2-2)ウィンドウに画像を出す
    #include <SDL2/SDL.h>
    int main()
    {
        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) < 0) {
            // 初期化失敗エラー. 何かメッセージを表示させて終了させてください.
        }
        SDL_Window   *win  = SDL_CreateWindow("title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 240, 0);
        SDL_Renderer *rndr = SDL_CreateRenderer(win, -1, 0);
        SDL_Texture  *txtr = SDL_CreateTexture(rndr, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 240);
    
        uint32_t *q;
        int linebyte;
        SDL_LockTexture(txtr, 0, (void **) &q, &linebyte); // これでqとlinebyteを取得.
    
        q[123 + 234 * linebyte / 4] = 0x123456; // ここで好きなだけ描画する.
    
        SDL_UnlockTexture(txtr);
        SDL_RenderCopy(rndr, txtr, 0, 0);
        SDL_RenderPresent(rndr);
    
        SDL_Delay(30 * 1000);
        return 0;
    }
    • ウィンドウに画像を書き込むためには、SDL_LockTexture()で書き込み先を取得して、それで自由に好きなだけ書き込んで、一通り終わったらSDL_UnlockTexture()して、SDL_RenderCopy()してSDL_RenderPresent()すると実画面に反映されます。
    • q[123 + 234 * linebyte / 4] = 0x123456; の意味するところは、座標(123, 234)のピクセルの色を#123456にするということです(#rrggbbです)。
    • ということで、SDLで動画の1フレームを書くとしたら、SDL_LockTexture()で始まって、SDL_RenderPresent()で終わることになります。
    • これだけ覚えれば、とりあえず自由に絵は描けるわけです。
  • (2-3)ウィンドウを閉じる
    // もしrndrやtxtrをCreateしていたなら、まずそれをいったん片付ける.
    SDL_DestroyTexture(txtr);
    SDL_DestroyRenderer(rndr);
    
    // ウィンドウを閉じる.
    SDL_DestroyWindow(win);
    • これだけで閉じられます。閉じてしまえばまた開きなおすこともできます。
    • 閉じずにどんどん開くこともできます。その場合、ウィンドウの数だけwinができるので、きちんと管理してください。
  • (2-4)ウィンドウが閉じられたら終了する
    SDL_Event ev;
    while (SDL_PollEvent(&ev) != 0) {
        if (ev.type == SDL_QUIT) {
            // 最後のウィンドウが閉じられたので、終了処理に入る.
        }
        // もしほかのイベントにも反応できるようにしたければ、ここに書き足す.
    }
    • こんな感じの処理をDelayの代わりに書けば、30秒後ではなく、ウィンドウを閉じたら終了するようにできます。

(3)

  • ウィンドウに対するキー入力、ウィンドウに対するマウス入力
  • (工事中)

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-03 (木) 15:12:13 (18d)