某技術書典で購入した本にSDL2を使用するページがあったのと多分今後も使うことになると思うので、メモついでに環境構築手順とかを書き残しておこうと思う。
SDLとは
- Simple DirectMedia Layerの略
- SDL2というのはメジャーバージョンの数字だと思う
- SDL 2.0のライセンスはzlib license(バージョン1.XはLGPLライセンスだったっぽい)
- 音声・入力・グラフィクスあたりの制御をサポートしてくれる
- クロスプラットフォームで複数OSに対応
- Cで書かれたオープンソース
昔触ったときは単純にOpenGLの拡張ライブラリに変わる便利系ライブラリという認識だったけど、一概にそうとも言い切れないっぽい。
調べた感じだとVulkanなんかにも対応しているようなので、やっぱり今後もお世話になる気がした。
詳しくは日本語リファレンスがあるのでそちらを参照するといいかも(http://sdl2referencejp.osdn.jp/)
開発環境
OS | Windows10 |
エディタ | Visual Studio 2019 |
SDL | SDL2-2.0.10 |
環境構築手順
ビルド
- ソースコード配布ページからコードをダウンロード(zip落とした)
- zip解凍してVisualC\SDL.sln開く
- ソリューションのビルド実行
- VisualC\Win32(Debug or Release)フォルダ直下にSDL2.libが生成されているので使用するプロジェクトに突っ込む
- 該当のプロジェクト側で良い感じに設定する
実際のコードは「SDL2 入門」とかで調べると関数の使い方から何をしているかまで細かく書いてあるのでそっちを参照する感じで。
わからなかったところ
SDLmainとは?
各種セットアップが終わった時点で一旦ビルドをかけてみたところ、エントリーポイントの未定義でおこられた。
SDLビルド時に一緒に出力されたSDL2main.libを追加することで対処できた。
原因としてはSDL_main.hでmainをSDLmainという名前に置き換えるマクロが定義されていて、実際のエントリポイント自体は別ファイルに記述されていた。そのエントリポイントの中身でSDL2main.libに定義されている関数が使用されていたりでエラーを吐いていたっぽい。
じゃあSDL2main.libとはなんなのかという話だが、ユーザー側でWinMain関数を定義しなくてもコードが組めるようになるというもの。要はWindowsに依存しないコードを組める便利なもの。(という認識...)
詳細はSDL_windows_main.cファイルというのがsrc/main/windowsフォルダ直下に存在するので是非目を通して欲しい。
サブシステム
SDLはサブシステムという概念が存在していて、上記で紹介した音声や入力、グラフィックなどがそれぞれ該当する
SDL_init関数の引数
基本SDL_INIT_EVERYTHINGですべてのサブシステムを初期化してくれるっぽい。
個別に指定することもできるけど今の所使う場面に出会っていないので、特に調べていない。
SDL_CreateWindow関数
文字通りウィンドウを作成してくれる
引数名 | 概要 |
---|---|
title | ウィンドウのタイトル |
x | ウィンドウの座標(Define) |
y | ウィンドウのY座標(Define) |
w | ウィンドウの横幅(px) |
h | ウィンドウの縦幅(px) |
flags | SDL_WindowFlags |
戻り地 SDL_Window*
SDL_CreateRenderer関数
レンダリングコンテキストを作成してくれる
引数名 | 概要 |
---|---|
window | SDL_CreateWindowで作成した戻り値 |
index | ドライバの指定 -1をセットすることでいい感じにやってくれる |
flags | SDL_RendererFlags |
SDL_RenderClear関数
現在のレンダーターゲットを色で塗りつぶして消去する
SDL_SetRenderDrawColor
で色指定が可能っぽい
SDL_RenderPresent関数
レンダリングの結果を画面に反映する
ダブルバッファとかそういうアレだと思っている