SlideShare a Scribd company logo
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に関連する応用的な話題
初期化
入力
紹介
実践
応用
インストール
簡単な描画
特徴
SDL2とは
オープンソースで
クロスプラットフォームな
マルチメディアライブラリ
7
SDL2 オープンソース
ライセンス形態は
zlibライセンス
かなり条件の緩いライセンス
利用したソフトの配布に謝辞や著作権の表示は不要
ソース頒布時に著作権とライセンスの表記が必要
8
SDL2 クロスプラットフォーム
公式に6プラットフォームをサポート
9
Windows
Mac OS X
Linux
iOS
Android
ブラウザ
これだけでなく、他のプラットフォームにも対応
デバイス入力
音出力
画面出力
に対応
SDL2 マルチメディア 10
SDL2が吸収する他の差異 11
イベント機構
ダイアログ
マルチスレッド
共有ライブラリ読み込み
ファイルシステム
電源状態
SDL2 活用事例
要するにゲームが作れる
多くのゲームが開発されている。
賞を取ったゲームもSDLで開発されてたりする。
動画再生ソフトやAndroidシミュレータ
リッチなUIが不要なソフトなどでも好まれる。
携帯機での標準GUIライブラリとして
別環境への移植もそこそこ容易なようだ。
12
本日の内容 13
SDL2とは
他ライブラリとの比較
SDL2に関連する応用的な話題
初期化
入力
紹介
実践
応用
インストール
簡単な描画
特徴
SDL2の特徴
C言語で開発
C++からも直に扱える。
多数の他言語バインディングが開発されている。
対応環境の多さ
前バージョンのSDLも含むと相当数に上る。
機能がシンプル
悪く言えば低機能。
ほぼ各プラットフォーム間の差異の吸収のみ。
14
SDL2を拡張するライブラリ
素のSDLのみで開発を行うのは手間だが、
SDL_image SDL_mixer
SDL_ttf SDL_gfx など
SDLの簡素すぎる機能を拡張し、
そこそこ扱いやすくしてくれるライブラリが存在する。
15
本日の内容 16
SDL2とは
他ライブラリとの比較
SDL2に関連する応用的な話題
初期化
入力
紹介
実践
応用
インストール
簡単な描画
特徴
SDL2と類似ライブラリの比較
似た目的のライブラリも多数!
17
SDL2と類似ライブラリの比較
Siv3D
C++。DirectX。Windowsオンリー。
短いコードで記述できる。日本製。
DXライブラリ
C++。 DirectX。
WindowsとPS4とPS Vita。
APIはC言語的。日本製。
18
SDL2と類似ライブラリの比較
Cinder
C++。Windows, iOS, OS X。
短いコードで記述できる。
SFML
C++。 OpenGL。
Windows, Linux, Mac OS X。
多くのプログラミング言語に対応。
19
SDL2と類似ライブラリの比較
openFrameworks
Windows、Mac OSX、Linux、
iOS、Android。かなり有名。C++。
Irrlicht Engine
C++。
海外では人気らしい。
20
SDL2と類似ライブラリの比較
ゲーム用途としては、SDL2は
別に多機能でも記述が楽でも無い。
GLUT、GLFWの方がライブラリとしては近い。
OpenGLのAPIが直接叩けたりなど。
SDLは、
長い歴史があること、ユーザ数が多いこと、
本体がシンプルで拡張も容易である点が利点。
21
おまけ:SDL1.2との違い
iOS、Androidサポート
複数ウィンドウ生成に対応
ハードウェアアクセラレーション描画
垂直同期対応
基本図形描画対応
ディスプレイ解像度フルスクリーン
テキスト入力
22
本日の内容 23
SDL2とは
他ライブラリとの比較
SDL2に関連する応用的な話題
初期化
入力
紹介
実践
応用
インストール
簡単な描画
特徴
インストール
Windows(VC++, Mingw), Mac(Xcode)
公式サイトから
Development Librariesをダウンロード!
*nix系環境
パッケージマネージャから
libsdl2-dev などの名称でダウンロード!
24
本日の内容 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
SDLで描画にOpenGLを使う 35
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コンテキストの作成
ウィンドウに描画を反映
OpenGLを動的に読み込む 36
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ライブラリの解放
SDLの描画機能とOpenGLの併用
OpenGLドライバでレンダラを作成することで可能
37
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
既存のウィンドウ上でSDL
ウィンドウハンドルを用いて可能
39
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に関連する応用的な話題
初期化
入力
紹介
実践
応用
インストール
簡単な描画
特徴

More Related Content

PDF
Tackling Complexity
PPTX
C#とILとネイティブと
PDF
ゲーム開発者のための C++11/C++14
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
SolrとElasticsearchを比べてみよう
PDF
闇魔術を触ってみた
PDF
プログラミングコンテストでの動的計画法
PDF
できる!並列・並行プログラミング
Tackling Complexity
C#とILとネイティブと
ゲーム開発者のための C++11/C++14
コンテナの作り方「Dockerは裏方で何をしているのか?」
SolrとElasticsearchを比べてみよう
闇魔術を触ってみた
プログラミングコンテストでの動的計画法
できる!並列・並行プログラミング

What's hot (20)

PDF
いまさら聞けない!CUDA高速化入門
PPTX
Redisの特徴と活用方法について
PPTX
純粋関数型アルゴリズム入門
PDF
Webアプリを並行開発する際のマイグレーション戦略
PPTX
世界一わかりやすいClean Architecture
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
Pythonによる黒魔術入門
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
PDF
それはYAGNIか? それとも思考停止か?
PDF
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
PDF
DockerとPodmanの比較
PDF
イミュータブルデータモデルの極意
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
規格書で読むC++11のスレッド
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
PDF
BERT入門
PDF
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
PDF
キメるClojure
PDF
ブルックスのいう銀の弾丸とは何か?
いまさら聞けない!CUDA高速化入門
Redisの特徴と活用方法について
純粋関数型アルゴリズム入門
Webアプリを並行開発する際のマイグレーション戦略
世界一わかりやすいClean Architecture
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Pythonによる黒魔術入門
いまさら聞けないarmを使ったNEONの基礎と活用事例
それはYAGNIか? それとも思考停止か?
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
DockerとPodmanの比較
イミュータブルデータモデルの極意
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
規格書で読むC++11のスレッド
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
BERT入門
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
キメるClojure
ブルックスのいう銀の弾丸とは何か?
Ad

SDL2の紹介

Editor's Notes

  • #2: オープンソースなクロスプラットフォームマルチメディアライブラリであるSDL2の紹介
  • #3: 最近24歳になった サイトには自作wikiを使用 つくりかけてはすぐ飽きて放置する性質。 最近はバイナリハックスよんでバイナリにはまってる
  • #4: 改めて
  • #5: 本日の内容です 最初にSDL2自体の紹介を、次に簡単な使い方をごく一部、最後に応用的なことを少々話します。
  • #6: 応用的な内容です。
  • #7: ではまず最初に。
  • #8: この一言で紹介が済んでしまう 急に意識高くなったわけではなく、ちょうどよい日本語訳がない。 なお、Simple DirecMedia Layerが正式名称 libsdl.org
  • #9: ちなみに、前のバージョンである SDL1.2 では GNU LGPL ライセンスだった。そのため、もっぱらDSO(DLL)として利用されていたと聞く。もっとも、SDL2でもスタティックリンクライブラリをビルドするのが難しいのと、別にスタティックリンクにする利点もないのであまりそうされてはいないのではないか。
  • #10: 他プラットフォーム対応はソースコード中に見ることができる。 Haiku(OpenBeOS)、Mir(displayProtocol),wayland(displayProtocol),Pandora(オープンな携帯ゲーム機、組み込みLinuxマシン。GP2Xの後継)、PSP(PSP)、raspberry pi(小型linuxボード)
  • #11: デバイスは、マウス、キーボード、ゲームパッド、ジョイスティック。 音はかなり自由に好きに波形からいじれる。 画面は対応プラットフォームにより様々だが、ハードウェアアクセラレータも利用できる。
  • #12: イベント機構はシンプルなもの。C言語なので……。マルチスレッドもシンプルだが一応ミューテックス条件変数アトミック操作など一通りはそろっている。C++的にはstd::threadを使えばよいのでまぁいらないですが。電源状態は取得のこと。
  • #13: 公式サイトのトップページでSDL製のゲームがランダムに紹介される。Steamのクロスプラットフォーム対応ゲームで多いらしい? エミュレータでも使用例あり。携帯機はpandoraとかgp2x(移植)とか。最後に話すがビデオ層の拡張さえすればよいので比較的楽。SDLをラップして作られたゲームライブラリなども。
  • #15: 公式では多言語対応は行っていない。Ada,C#,Lua,Ocaml,Pascal,Pythonが紹介されてる。erlang,ruby,commonlispなどもある。とにかく素直なC言語なので楽。 残念ながら前バージョンのSDLについてはサイトからドキュメントが消失してるので詳細を上げられない。機能のシンプルさは本当にシンプルなので、多分色々な人がついついラッピングしたくなるし実際多くのライブラリがあふれてる。
  • #16: というかゲーム用途ならばimage, mixer はほぼ必須になるかもしれない。ttfは文字列描画を行わせる機能だが、毎回文字列を描画するのにはむかない、遅い欠点あり。まぁOpenGLつかってるとそうなりそうですが。SDL1.2用だがそこを改良したSDL_kanjiがあったりした。ADCII文字のみならばgfxに固定フォントで描画する巻子が容易されている。gfxは便利関数群みたいなライブラリで、FPSタイマや円の描画などがある。
  • #19: DXライブラリ、それもはやDXじゃないやん
  • #21: ofはネーミングがややこしいのが個人的に気にかかる。最初はこれ自体がライブラリなのだと認識できなかった。芸術大学などでも使われているらしい。
  • #22: 私は大学のOpenGLの課題のときにSDL1.2を使いました。歴史は具体的な年数がいまいちわからず……
  • #23: SDL1.2のときはとくに描画機能が弱く、ハードウェアアクセラレータなし、垂直同期なし、画素集合の転送しかできなかった。もっとも、それだけで作られたゲームも aba games で公開されてて普通に遊べるんですが。テキスト入力とは、画面上でテキスト入力ボックスを出してユーザ環境のIMEを利用して入力させることができる機能。すごい。まだ試してない。複数ウィンドウ対応はemscriptenやandroid、iosではたぶんうごかないんでしょう。
  • #25: 構成プロパティの追加のインクルードディレクトリ、ライブラリディレクトリに設定し、追加のインストールライブラリで sdl を設定。*nix系環境ならばソースからコンパイルしてインストールももちろん良い。sdl2-configかpkg-config SDL2 を使う。pkg-configの方が、sdl_imageなども一括で指定できるしおすすめ。
  • #27: システム部分にはSDL_INIT_TIMERタイマ サブシステムSDL_INIT_AUDIOオーディオ サブシステムSDL_INIT_VIDEOビデオ サブシステムSDL_INIT_JOYSTICKジョイスティック サブシステムSDL_INIT_HAPTICハプティクス(感覚フィードバック) サブシステムSDL_INIT_GAMECONTROLLERコントローラー サブシステムSDL_INIT_EVENTSが入れられる。全部指定ももちろん可能。
  • #28: 一見使い道が思いつかないかもしれないが例えばジョイスティックを終了して再度初期化すると起動中に新しく繋がれたジョイスティックとかも検知できる
  • #30: 移行レンダラ経由で描画を行うことになる。ウィンドウ初期化、レンダラ作成を一括で行う関数もあるがそちらだとパラメータを与えられない。
  • #33: イベント形式で入力を受け取ることもできる
  • #36: あとはOpenGLの関数がガンガン使える。SDL1.2のときはこっちがむしろ主流な描画方法扱いだった。コンテキストは切り替えたりもできるが特殊なことをするのでもないかぎり変数に保持せずともよいっぽい
  • #37: OpenGLのうむを起動後にチェックして使うかどうかを決めるのには良いかもしれないが面倒だと思う
  • #38: 基本的に3Dだがインターフェースを2Dで出したいときに便利かもしれない。glの設定によってはうまくいかないかもしれないがいまいち詳細不明
  • #40: これを使って wxWidgets と組み合わせて UI つきの SDL とかもくめたりする。少々バグがまだのこっていたり、OSや環境依存の指定が必要になることもある。面白いが絶対必要でもないかぎりやらない方がよい。gtk::socketににたようなのがあるのでそれと組み合わせ可能。
  • #45: ビデオドライバを拡張する話,love2dの話