Ubuntu環境で、とある装置向けのコンソールを実装すべく、最初はGTK3ライブラリなんかでウィンドウ,ボタン,テキストボックスみたいなウィジェット配置プログラムを試してみるも、なーんか作法が煩雑すぎてプログラムがスッキリ作れなくてストレスを感じておりまして・・・

何かこうもう少し自由度の高いGUIライブラリは無いものかと探してたら見付けたのがSDL

https://www.libsdl.org

SDL2の日本語マニュアル がとてもありがたい<(_ _)>

インストールはWindowsなら利用するC/C++用の各開発環境向けのパッケージをダウンロードして、ストレージの適当な所(とは言えストレージドライブのルート(C:\)にライブラリ用のフォルダを作ってソコ)に展開する。プロジェクトには追加のincludeディレクトリとLibraryディレクトリを設定してSDLのlibのパスを通すか、libファイルをプログラムと同じフォルダに置くかすれば使えます。

Ubuntuならaptのインストールコマンドを実行すればいいので簡単(^_^)

sudo apt-get install libsdl2-dev

必要に応じて追加ライブラリも以下のうち使いたいものだけインストールすればいい

sudo apt-get install libsdl2-ttf-dev
sudo apt-get install libsdl2-image-dev
sudo apt-get install libsdl2-net-dev
sudo apt-get install libsdl2-mixer-dev

チナミに私は基本的なグラフィック描画と文字の描画が出来れば良いので、libsdl-ttf-dev だけ追加しました。

SDLは、WindowsもLinuxもMacもスマホもほぼ同じ作法で利用できるため、C/C++のプリプロセッサーディレクティブ等でちょっと工夫すれば、マルチプラットフォームなプログラムが作れてしまう点がとても良いですね。

で、

今回はUbuntuで作ったのですが、実はちょっとSDL2の設定にハマりまして

最初懸命にCMakeLists.txtを試みたのですが、どうしてもfind_package(SLD2 REQUIRED)のCMake構成が通らず、困っていました。ちなみにこの時はCMakeLists.txtは以下のようにしました。

#これだけではうまくいきませんでした
find_package(SDL2 REQUIRED)
find_package(SDL2_ttf REQUIRED)

#うまくいかないんだな
target_link_libraries(${PROJECT_NAME} SDL2::Main SDL2::TTF)

困り果ててcopilotやGoogle先生に訊きまくってようやくたどり着いた「ネ申」が以下リンク

https://github.com/aminosbh/sdl2-cmake-modules

どうやら現行のSDL2は公式にはCMakeにそもそも未対応らしく、ビルドコマンドで直接ライブラリを指定するのが正解らしいのですが、けれどもやーっぱCMakeの便利さから抜けられない私のような方のために、何と親切にSDL2のCMakeモジュールを自作して公開してくれている正に「ネ申」でございましたm(_ _)m

このサイトにある内容に従ってやった事が以下。

〇自分のプロジェクトディレクトリでターミナルを開いて以下コマンド

mkdir cmake
mkdir cmake/sdl2
git clone https://gitlab.com/aminosbh/sdl2-cmake-modules.git cmake/sdl2
rm -rf cmake/sdl2/.git

※git を使う場合は違う設定らしいので詳しくは本家を・・(私は使わないのでわかりませぬ<(_ _)>

〇CMakeLists.txt には以下構文を追加しました。

# SDL2 Module Path Setting
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

# Find SDL2, SDL2_ttf libraries
find_package(SDL2 REQUIRED)
find_package(SDL2_ttf REQUIRED)

# Link SDL2::Main, SDL2::ttf to our project
target_link_libraries(${PROJECT_NAME} SDL2::Main SDL2::TTF)

これで無事SDLライブラリを自分のプロジェクトに設定できました。嬉しい(*’ω’*)

実際にSDLを自分のプログラムで記述する方法は日本語マニュアル 見てやるのが手っ取り早いです。

例えば、以下のような感じでグラフィックスプログラム書けちゃうんですよね。DirectXとかUnityより全然取っ付きやすくて良いですね。

#include"SDL.h"

SDL_Window *hWnd;
SDL_Renderer *hRenderer;

int main()
{
    //SDL初期設定
    if(SDL_Init(SDL_INIT_VIDEO) == 0)
    {
        //Window & Renderer
        if(SDL_CreateWindowAndRenderer(800,600,0,&hWnd,&hRenderer)==0)
        {
            while(1)
            {
                SDL_Event aEvent;

                //描画する色を黒(R:0,G:0,B:0)に設定
                SDL_SetRenderDrawColor(hRenderer,0,0,0,SDL_ALPHA_OPAQUE);
                //レンダラーをクリア
                SDL_RenderClear(hRenderer);

                //==========※ここからグラフィックの描画記述

                //描画する色を緑っぽい色(R:63,G:255,B:63)に設定
                SDL_SetRenderDrawColor(hRenderer,63,255,63,SDL_ALPHA_OPAQUE);
                //x:400,y:100の位置に点(ドット)を描く
                SDL_RenderDrawPoint(hRenderer,400,300);
                //(x:0,y:300)-(x:800,y:300)の座標間に直線を描く
                SDL_RenderDrawLine(hRenderer,0,300,800,300);
                //x:200,y:200の位置にW:400,H:200のサイズで長方形をRendererに描く
                SDL_Rect aRect = {200,200,400,200};
                SDL_RenderDrawRect(hRenderer,&aRect);
            
                //==========※ここまでがグラフィックの描画記述
                
                //描画したレンダラーをウィンドウに反映
                SDL_RenderPresent(hRenderer);

                //プログラム終了確認
                SDL_PollEvent(&aEvent);
                if (aEvent.type == SDL_QUIT)
                {   //終了要求があるのでwhileループ脱出
                    break;
                }
            }
            //Renderer破棄
            SDL_DestroyRenderer(hRenderer);
            //Window破棄
            SDL_DestroyWindow(hWnd);
        }
        //SDL利用終了
        SDL_Quit();
    }
    return 0;
}