SDL2に入門してみる(環境構築編)
ゲームエンジン関連の騒動もあり、せっかくなので普段のゲームエンジンから離れてC++でゲームを作ってみようと思いSDL2を使ってみました。
この記事では、WindowsとmacOSでのSDL2の開発環境を構築する手順を解説します。
SDL2とは
SDL2は、描画周りやキーボード/コントローラー入力などの低レベルな機能へのアクセスを提供してくれるライブラリです。WindowsやLinuxだけでなく、iOS,Androidなど幅広いプラットフォームに対応しています。
C++の環境構築
SDL2を試す為にVSCodeでCmakeを動かせる環境を用意します。すでに他の開発環境がある場合は飛ばして大丈夫です。
MinGW-w64のインストール(Windowsのみ)
Windowsには初めからGNUツールチェーンが入っていないので、MinGW-w64を入れてgccなどを使えるようにします。
GithubのReleaseページを開いてください。
いくつかファイルがあると思います。ファイル名はオプションを指していて、意味は以下のようになっています。
名前 | 意味 | おすすめ |
---|---|---|
i686/x86_64 | CPUのアーキテクチャ(ビット数) | |
mcf/posix/win32 | スレッドモデル | |
dwarf/sjlj/seh | 例外処理のシステム | |
ucrt/msvcrt | ランタイムライブラリ |
違いが分からければとりあえずx86_64-X.X.X-release-posix-seh-ucrt-rt_vX-revX.7z
をダウンロードしておけば大丈夫です。
ダウンロードしたファイルを7zipで解凍したら、適当なディレクトリ(Cドライブ直下など)に置きます。そして、置いたディレクトリ内のbin
ディレクトリへのパス(Cドライブ直下ならC:\mingw64\bin
)をユーザー環境変数のPath
に追加します。
CMakeのインストール
Cmakeはコンパイラに依存しないビルド自動化ツールです。事前に記述したCmakeLists.txt
の通りにビルドプロセスを実行してくれます。
chocolateyやbrewなどのパッケージマネージャーでインストールでインストールするのが手っ取り早いです。
# インストーラー側に引数を渡してPATHを通してもらう(https://github.com/chocolatey-community/chocolatey-packages/issues/987)
$ sudo choco install cmake --installargs '"ADD_CMAKE_TO_PATH=User"'
$ brew install cmake
Windowsでのsudoについて
chocolateyではパッケージのインストールに管理者権限が必要です。
gsudoを入れておけばunix系osのsudo感覚で管理者権限でコマンドを実行できます。
スタートメニューを右クリックし、ターミナル(管理者)からシェルを起動
$ choco install gsudo
VSCodeのインストール
VSCodeが入ってなければサイトからインストーラーをダウンロードしてください。
拡張機能のインストール
VSCodeにC++とCMake拡張機能を入れていきます。
設定が汚れるのが気になる場合はプロファイルを切っておくことをおすすめします。
拡張機能の検索からC/C++ Extension Packを探してインストールしましょう。
動かしてみる
この時点ですでに素のC++なら実行できるはずです。試しにHello World!してみましょう。
まずはmain.cpp
というファイルを作り、簡単なログ出力を書いていきます。
#include <iostream>
int main(int, char**)
{
std::cout << "Hello World!" << std::endl;
}
次にCMakeLists.txt
というCMakeでのビルドのコンフィグファイルを作り、以下のように記述します。
cmake_minimum_required(VERSION 3.26) # この設定のCMakeの最低バージョン
project(HelloWorld) # プロジェクトの名前の設定
add_executable(${PROJECT_NAME} main.cpp) # main.cppをHelloWorld.exeにビルド
ここまでできたらコマンドパレットから> CMake: Run Without Debugging
で実行してみましょう。
cpp_games\HelloWorld\build via △ v3.27.7
❯ ."C:/Users/myuser/Documents/cpp_games/HelloWorld/build/HelloWorld.exe"
Hello World!
このようにログ出力ができれば成功です。
SDLのビルド・インストール
今回はWindowsとmacOSを想定してビルドとインストールをしていきます。
macOS
macOSの場合はbrewでインストールしてしまうのが一番早いです。
$ brew install sdl2
brewを使わない場合は、Windowsとほぼ同じ方法でインストールできます。
その場合はビルドシステムの生成のコマンドで-G MinGW Makefiles
が必要なくなります。
Windows
Windowsの場合はSDLのgitリポジトリを落としてきて、CMakeでビルドとインストールをしていきます。
まずはSDLのリポジトリをクローンし、ディレクトリに移動します。
git clone git@github.com:libsdl-org/SDL.git
cd SDL
次にビルドしたいバージョンのブランチ・タグに移動します。
main
ブランチではSDL3の開発が進んでいるようですが、リリースはされていないので今回はSDL2のバージョンで現在最新のrelease-2.28.4
に移動します。
git switch --detach tags/release-2.28.4
ここからビルドをしていきます。
まずはcmakeでビルドシステムの生成をします。
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
リポジトリのディレクトリ内にbuildディレクトリができているはずなので移動し、ビルドシステムから実際にビルドしてみます。
cd build
cmake --build . --config Release --parallel
ビルドが完了したら、以下のコマンドでインストールしましょう。
sudo cmake --install . --config Release
動くか試す
ここまで来たらあとは実際に動くか試すだけです。
VSCodeに戻り、main.cpp
とCMakeLists.txt
を以下のように記述します。
#include "SDL.h"
int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow(
"Hello SDL",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_OPENGL);
SDL_bool quit_flag = SDL_FALSE;
SDL_Event event;
while (!quit_flag)
{
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
quit_flag = SDL_TRUE;
break;
}
}
}
SDL_Quit();
return 0;
}
cmake_minimum_required(VERSION 3.26)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 17)
find_package(SDL2 CONFIG REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL2_LIBRARIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
if (WIN32)
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:SDL2::SDL2>" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
VERBATIM
)
endif ()
これを実行することで、ウィンドウが表示され、×ボタンを押すことでプログラムが終了するはずです。
おわりに
長くなってしまいましたが、これでSDL(とC++)の一番の関門である環境構築ができました。
最後のコードの説明などはまた別の記事にまとめていこうと思います。
Discussion