PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

SDL SDLの導入について

環境

Windows 10
Visual Studio 2017 Community
SDL 2.0.9

SDLとは

SDL (Simple DirectMedia Layer) は、Graphic, Sound系のAPIを提供するC言語マルチプラットフォーム対応のライブラリ。

公式サイトは下記
Simple DirectMedia Layer - Homepage

Forumを見れば分かるのだが現在も使用しているユーザーはいる。
https://discourse.libsdl.org/


SDLを使用している書籍は下記等がある。
で、意外と導入で躓いたという人もいるかもしれないと感じたのでこの記事を書くに至った。

オンラインゲームを支える技術ではSDL1.2系が使用されている。

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

ゲームプログラミングC++ではSDL2.0.3が使用されている。

ゲームプログラミングC++

ゲームプログラミングC++


SDLの導入

まずは下記よりDownloadを行う。
もしリンクが切れていたらブログトップの公式サイトのリンクからDownloadページにいってください。
Simple DirectMedia Layer - SDL version 2.0.9 (stable)

今回はDevelopment LibrariesのVC++を使用する。


1. コンソールアプリケーションを新規に作成
 適当に空のプロジェクトで良い

2. ダウンロードしたファイルを適当な場所(Solution\External\SDL とか)に解凍

3. SDLのインクルードディレクトリの指定。
 構成プロパティ/C/C++/全般/追加のインクルードディレクト
f:id:PaperSloth:20190122220010p:plain

4. 追加のライブラリディレクトリの指定。
 リンカー/全般/追加のライブラリディレクト
f:id:PaperSloth:20190122220328p:plain

5. 追加の依存ファイルの指定。
 リンカー/入力/追加の依存ファイル
  SDL.libとSDLmain.libを追加
f:id:PaperSloth:20190122220551p:plain

6. DLLをビルド時にコピー
 ビルドイベント/ビルド後のイベント/コマンドライン
  xcopy "(SDLへのパス)\*.dll" "$(OutDir)" /i /s /y を入力
f:id:PaperSloth:20190122220848p:plain

ひとまずここまでで動かすための前準備が完了。

SDLを使用する際の注意点

まず、SDLを使用する際に下記の記述をするとエラーになってしまいます。

#include "SDL.h"

int main()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    // メイン処理
    SDL_Quit();
    return 0;
}

エラーメッセージを見てみると
LNK2019 未解決の外部シンボル _SDL_main が関数 _main_getcmdline で参照されました。
と出てきます。

これはSDL_main.h内でmainでdefineが定義されているからです。

#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
#define main    SDL_main
#endif

また、SDL_main.h内にはメイン関数は次のように定義してくださいと書かれています。

int main(int argc, char *argv[])


そのため、SDLを使用する際には引数付きのメイン関数を定義する必要があります。

void main() // NG!
int main() // NG!
int main(int argc, char* argv[]) // OK
int main(int argc, char** argv) // OK
#include "SDL.h"

int main(int argc, char** argv)
{
    (void)argc;
    (void)argv;
    SDL_Init(SDL_INIT_EVERYTHING);
    // メイン処理
    SDL_Quit();
    return 0;
}

ひとまずWindow, Rendererを作成してみるとこんな感じになります。
f:id:PaperSloth:20190122225202p:plain

DirectXOpenGLに比べるとすごく簡単なので、C++でとりあえずゲームを作ってみようかなという人は挑戦してみてください。