2020/01/18

SDL2に入門してみた(C, Nim)

SDL2とは

SDL2とは、C言語で書かれたクロスプラットフォームなマルチメディアライブラリで、グラフィックの描画・サウンドの再生などを扱うことができるようになります。C言語で書かれておりますが、他の言語にも移植されています。
今回はC言語とNimでSDL2を使ってみようかと思いますが、その前にC言語のSDl2ライブラリが必要なので予めインストールが必要です。Nimのほうはそのライブラリのラッパーとなります。私の場合はManjaro Linuxを使っておりますので、sdl2はもともと入っておりました。したがって、残りのgfx、ttf、mixer、net、imageを追加でインストールしました。sdl2_gfxは図形などを描く際に、sdl2_mixerは音声を扱う際に、sdl2_imageは画像を扱う際に、sdl2_netはネットワークのサポート、sdl2_ttfはTrueTypeフォントのサポート、に必要なものです。
NimでSDL2を使う場合、実はsdl2とsdl2nimの2種類があります。
前者が公式のものとなっていますが、私は後者の方を使っています。なぜ2種類になっているのかはsdl2nimの作成者のREADMEに書かれていますので、GitHubのリポジトリをご覧ください。nimbleでプロジェクトを作成し、プロジェクト.nimbleファイルにrequires sdl2 = "2.0.10.0"と記述するか、nimble install sdl2nimとすればインストールし、使うことができます。
現在C言語のほうはステップ1〜7に別けてGitHubのcというディレクトリに置いています。
ステップ1では、SDL2の初期化

#include 
#include 

int main() {
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("Error initializing SDL: %s\n", SDL_GetError());
        return 1;
    }

    printf("Success initializing SDL.\n");
    SDL_Quit();

    return 0;
}
ここで重要なのはSDL_Quit()でのクリーンアップを忘れないことです。以下のファイルでも必ずクリーンアップをします。以下のファイルのコードは前出のGitHubのほうを参考にしてください。
ステップ2では、Windowの作成
ステップ3では、画像の表示
ステップ4・5では、アニメーション
ステップ6では、キーボード操作
ステップ7では、マウス操作
といった具合になっています。
Nimのほうでは、現在ステップ3までは動作確認し、GitHubに置いています。しかしステップ4で躓きました。コンパイルエラーは出ず、Windowも表示されるものの、肝心の画像が表示されない。
現在ソースコードを読みながら奮闘中です。うまく動作したら公開します。
ひょっとしたら、ステップ1から完全に書き直すことになるかもしれませんが、できればC言語のコードに近い状態のものを公開できればな、と考えています。
sdl2nimのexamplesを見てみると、まず大枠としてAppというものを作成し、その枠内でごにょごにょしていくという感じになっていました。そのやり方に従ったほうが良いかもしれません。いやきっとそのほうがよいのだろう……

追記(2020/1/20)

Nimのほうで躓いていたところは、私のイージーミスでした。
とりあえず、きちゃないコードではありますが、Nimのほうもステップ7まで作り終えました。動作も確認済みです。
Nimのほうで大枠のAppを作成して…というやり方はC++でSDLを書く時のやり方のようなので、C++の方も勉強しようかと考え中です。