SDL2の紹介

Preview:

Citation preview

SDL2 の紹介

nyaocat

自己紹介

本名  : 楠田 真矢

Twitter : @nyaocatサイト : http://nyaocat.jp/

会社員プログラマ。 C++ と Lua と bash が得意。

最近の仕事は Scala と Javascript 。

C++ ポケットリファレンス著者の一人。

SDL2 の紹介

nyaocat

4本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

5本日の内容

SDL で描画に OpenGL を使う

ファイル以外からデータ読み込み

応用 既存のウィンドウ上で SDL

6本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

7SDL2 とは

オープンソースで

クロスプラットフォームな

マルチメディアライブラリ

8SDL2  オープンソース

ライセンス形態は

zlib ライセンス

かなり条件の緩いライセンス

利用したソフトの配布に謝辞や著作権の表示は不要

ソース頒布時に著作権とライセンスの表記が必要

9SDL2  クロスプラットフォーム

公式に6プラットフォームをサポート

Windows

Mac OS X

Linux

iOS

Android

ブラウザ

これだけでなく、他のプラットフォームにも対応

10

デバイス入力

音出力

画面出力

に対応

SDL2  マルチメディア

11SDL2 が吸収する他の差異

イベント機構

ダイアログ

マルチスレッド

共有ライブラリ読み込み

ファイルシステム

電源状態

12SDL2  活用事例

要するにゲームが作れる多くのゲームが開発されている。

賞を取ったゲームも SDL で開発されてたりする。

動画再生ソフトや Android シミュレー

タリッチな UI が不要なソフトなどでも好まれる。

携帯機での標準 GUI ライブラリとして別環境への移植もそこそこ容易なようだ。

13本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

14SDL2 の特徴

C 言語で開発

C++ からも直に扱える。

多数の他言語バインディングが開発されている。

対応環境の多さ前バージョンの SDL も含むと相当数に上る。

機能がシンプル悪く言えば低機能。

ほぼ各プラットフォーム間の差異の吸収のみ。

15SDL2 を拡張するライブラリ

素の SDL のみで開発を行うのは手間だが、

SDL_image   SDL_mixer

SDL_ttf     SDL_gfx   など

SDL の簡素すぎる機能を拡張し、

そこそこ扱いやすくしてくれるライブラリが存在する。

16本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

17SDL2 と類似ライブラリの比較

似た目的のライブラリも多数!

18SDL2 と類似ライブラリの比較

Siv3DC++ 。 DirectX 。 Windows オンリー。

短いコードで記述できる。日本製。

DX ライブラリC++ 。 DirectX 。

Windows と PS4 と PS Vita 。

API は C 言語的。日本製。

19SDL2 と類似ライブラリの比較

CinderC++ 。 Windows, iOS, OS X 。

短いコードで記述できる。

SFMLC++ 。 OpenGL 。

Windows, Linux, Mac OS X 。

多くのプログラミング言語に対応。

20SDL2 と類似ライブラリの比較

openFrameworks Windows 、 Mac OSX 、 Linux 、

iOS 、 Android 。かなり有名。 C++ 。

Irrlicht EngineC++ 。

海外では人気らしい。

21SDL2 と類似ライブラリの比較

ゲーム用途としては、 SDL2 は

別に多機能でも記述が楽でも無い。

GLUT 、 GLFW の方がライブラリとしては近い。

OpenGL の API が直接叩けたりなど。

SDL は、

長い歴史があること、ユーザ数が多いこと、

本体がシンプルで拡張も容易である点が利点。

22おまけ :SDL1.2 との違い

iOS 、 Android サポート

複数ウィンドウ生成に対応

ハードウェアアクセラレーション描画

垂直同期対応

基本図形描画対応

ディスプレイ解像度フルスクリーン

テキスト入力

23本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

24インストール

Windows(VC++, Mingw), Mac(Xcode)公式サイトから

Development Libraries をダウンロード!

*nix 系環境パッケージマネージャから

libsdl2-dev などの名称でダウンロード!

25本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

26初期化

if (SDL_Init(SDL_INIT_VIDEO) != 0) {std::cerr << SDL_GetError() << std::endl;std::exit(1);

}

SDL_Quit();

初期化

終了

27サブシステム初期化

if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0) {std::cerr << SDL_GetError() << std::endl;

}

SDL_QuitSubSystem(SDL_INIT_JOYSTICK);

サブシステム初期化

サブシステム終了

SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK;

初期化確認

28本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

29ウィンドウ・レンダラ

SDL_Window* const window = SDL_CreateWindow("Window Title",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_WIDTH, WINDOW_HEIGHT,SDL_WINDOW_FULLSCREEN_DESKTOP);

SDL_Renderer* const renderer = SDL_CreateRenderer( window, 0, SDL_RENDERER_PRESENTVSYNC);

ウィンドウ初期化

レンダラ作成

30画面描画

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);

SDL_RenderDrawLine(renderer,10, 10, 400, 400);

SDL_RenderPresent(window);

描画色設定

線を描画

ウィンドウに描画を反映

SDL_RenderClear(renderer);

画面クリア

31本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

32キー入力取得

Uint8 const* keys const = SDL_GetKeyboardState(nullptr)if (keys[SDL_SCANCODE_ESCAPE]) { std::exit(0);}

押されてるキーの取得

33本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢

34本日の内容

SDL で描画に OpenGL を使う

ファイル以外からデータ読み込み

応用 既存のウィンドウ上で SDL

35SDL で描画に OpenGL を使う

SDL_Window* const window = SDL_CreateWindow("Window Title",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_WIDTH, WINDOW_HEIGHT,SDL_WINDOW_OPENGL);

SDL_GLContext const context = SDL_GL_CreateContext(window);

SDL_GL_SwapWindow(window);

ウィンドウ初期化

OpenGL コンテキストの作成

ウィンドウに描画を反映

36OpenGL を動的に読み込む

if(SDL_GL_LoadLibrary(nullptr) != 0) { std::cerr << SDL_GetError() << std::endl; std::exit(1);}

auto const glActiveTexureARB = reinterpret_cast<void (APIENTRY *)(unsigned int)>( SDL_GL_GetProcAddress("glActiveTextureARB"));

SDL_GL_UnloadLibrary();

OpenGL ライブラリの読み込み

関数を得る

OpenGL ライブラリの解放

37SDL の描画機能と OpenGL の併用

OpenGL ドライバでレンダラを作成することで可能

int render_index = -1;int const num = SDL_GetNumRenderDrivers();for(int i = 0; i < num; ++i) {

SDL_RendererInfo info;if(SDL_GetRenderDriverInfo(i, &info) != 0)

{if(std::strcmp(info.name, "opengl") != 0) {

render_index = i;}

}}if(render_index < 0) std::exit(1);SDL_Renderer* const renderer =

SDL_CreateRenderer(window, render_index, 0);

38本日の内容

SDL で描画に OpenGL を使う

ファイル以外からデータ読み込み

応用 既存のウィンドウ上で SDL

39既存のウィンドウ上で SDL

ウィンドウハンドルを用いて可能

SDL_Window* SDL_CreateWindowFrom(const void* data);

40本日の内容

SDL で描画に OpenGL を使う

ファイル以外からデータ読み込み

応用 既存のウィンドウ上で SDL

41ファイル以外から読み込み

struct SDL_RWops { Sint64 (*size) (SDL_RWops* context); Sint64 (*seek) (SDL_RWops* context, Sint64 offset, int whence); size_t (*read) (SDL_RWops* context, void *ptr, size_t size, size_t maxnum); size_t (*write) (SDL_RWops* context, const void *ptr, size_t size, size_t num); int (*close) (SDL_RWops* context); Uint32 type; union { struct { void *data1; void *data2; } unknown; } hidden;};

42メモリから読み込み

SDL_RWops* SDL_RWFromMem(void* mem, int size)SDL_RWops* SDL_RWFromConstMem(const void* mem, int size)

43本日の内容

SDL で描画に OpenGL を使う

ファイル以外からデータ読み込み

応用 既存のウィンドウ上で SDL

44本日の内容

SDL2 とは

他ライブラリとの比較

SDL2 に関連する応用的な話題

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢