44
SDL2 ののの nyaocat

SDL2の紹介

  • Upload
    nyaocat

  • View
    4.021

  • Download
    1

Embed Size (px)

Citation preview

Page 1: SDL2の紹介

SDL2 の紹介

nyaocat

Page 2: SDL2の紹介

自己紹介

本名  : 楠田 真矢

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

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

最近の仕事は Scala と Javascript 。

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

Page 3: SDL2の紹介

SDL2 の紹介

nyaocat

Page 4: SDL2の紹介

4本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 5: SDL2の紹介

5本日の内容

SDL で描画に OpenGL を使う

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

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

Page 6: SDL2の紹介

6本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 7: SDL2の紹介

7SDL2 とは

オープンソースで

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

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

Page 8: SDL2の紹介

8SDL2  オープンソース

ライセンス形態は

zlib ライセンス

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

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

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

Page 9: SDL2の紹介

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

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

Windows

Mac OS X

Linux

iOS

Android

ブラウザ

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

Page 10: SDL2の紹介

10

デバイス入力

音出力

画面出力

に対応

SDL2  マルチメディア

Page 11: SDL2の紹介

11SDL2 が吸収する他の差異

イベント機構

ダイアログ

マルチスレッド

共有ライブラリ読み込み

ファイルシステム

電源状態

Page 12: SDL2の紹介

12SDL2  活用事例

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

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

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

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

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

Page 13: SDL2の紹介

13本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 14: SDL2の紹介

14SDL2 の特徴

C 言語で開発

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

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

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

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

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

Page 15: SDL2の紹介

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

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

SDL_image   SDL_mixer

SDL_ttf     SDL_gfx   など

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

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

Page 16: SDL2の紹介

16本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 17: SDL2の紹介

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

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

Page 18: SDL2の紹介

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

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

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

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

Windows と PS4 と PS Vita 。

API は C 言語的。日本製。

Page 19: SDL2の紹介

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

CinderC++ 。 Windows, iOS, OS X 。

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

SFMLC++ 。 OpenGL 。

Windows, Linux, Mac OS X 。

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

Page 20: SDL2の紹介

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

openFrameworks Windows 、 Mac OSX 、 Linux 、

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

Irrlicht EngineC++ 。

海外では人気らしい。

Page 21: SDL2の紹介

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

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

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

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

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

SDL は、

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

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

Page 22: SDL2の紹介

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

iOS 、 Android サポート

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

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

垂直同期対応

基本図形描画対応

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

テキスト入力

Page 23: SDL2の紹介

23本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 24: SDL2の紹介

24インストール

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

Development Libraries をダウンロード!

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

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

Page 25: SDL2の紹介

25本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 26: SDL2の紹介

26初期化

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

}

SDL_Quit();

初期化

終了

Page 27: SDL2の紹介

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;

初期化確認

Page 28: SDL2の紹介

28本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 29: 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);

ウィンドウ初期化

レンダラ作成

Page 30: SDL2の紹介

30画面描画

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

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

SDL_RenderPresent(window);

描画色設定

線を描画

ウィンドウに描画を反映

SDL_RenderClear(renderer);

画面クリア

Page 31: SDL2の紹介

31本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 32: SDL2の紹介

32キー入力取得

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

押されてるキーの取得

Page 33: SDL2の紹介

33本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢
Page 34: SDL2の紹介

34本日の内容

SDL で描画に OpenGL を使う

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

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

Page 35: SDL2の紹介

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 コンテキストの作成

ウィンドウに描画を反映

Page 36: SDL2の紹介

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 ライブラリの解放

Page 37: SDL2の紹介

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);

Page 38: SDL2の紹介

38本日の内容

SDL で描画に OpenGL を使う

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

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

Page 39: SDL2の紹介

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

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

SDL_Window* SDL_CreateWindowFrom(const void* data);

Page 40: SDL2の紹介

40本日の内容

SDL で描画に OpenGL を使う

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

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

Page 41: SDL2の紹介

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;};

Page 42: SDL2の紹介

42メモリから読み込み

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

Page 43: SDL2の紹介

43本日の内容

SDL で描画に OpenGL を使う

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

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

Page 44: SDL2の紹介

44本日の内容

SDL2 とは

他ライブラリとの比較

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

初期化

入力

紹介

実践

応用

インストール

簡単な描画

特徴

楠田真矢