C++でゲームDSL
2014/03/21
第2回 mixC++勉強会@Tokyo
@minamiyama1994
全体の概要
● 自己紹介
● デモンストレーション
● ライブラリの外観
● ライブラリの実装
● 将来性
● (時間があれば)オマケ
● 質疑応答
自己紹介
● 広島に生息する極々平凡な大学生
● Twitter:@minamiyama1994
○ 女優能年玲奈ちゃんのファンとしてのアカウント
@masakazu_nonenなどもあります
● C++好きです、とか言いつつ最近Haskell...
● Github:minamiyama1994
○ FTMP(TMPのためのライブラリ)
○ C++のパーサコンビネータDSL
○ 議論支援系
○ 小説っぽいの
○ girlfriend_require(彼女募集)
● などを公開しています
自...
初めに
● 今回作成したのは「ノベルゲーム用のC++の
DSL」です
● もっと言えば設計も実装もプロトタイプです
● ご容赦下さいm(_ _)m
デモンストレーション
● こんなコードをコンパイルすると……
デモンストレーション
● こんな感じに
ライブラリの外観
● namespaceはgpp
● class gameオブジェクトを生成
● gameオブジェクトのoperator()に対しコマンドオ
ブジェクトを引数に渡すと実行される
● gameオブジェクトをoperator()()...
ライブラリの外観
● gameオブジェクトのoperator()に対してコマンド
を渡した結果のテキスト描画などは次に
operator()が呼び出された時に消される
● operator()内ではコマンドによる描画結果など
は有効
ライブラリの外観
● コマンドオブジェクトは
○ text……テキスト
○ image……背景画像
○ bgm……音声
○ pause……Enterキー待
○ clear……テキストクリア
● operator+で結合可能
ライブラリの実装
● やりたいこと
○ templateを活用して重複の少ない&実行時コストの低い
コードに
■ →TMPを活用
○ 実装の詳細は隠蔽する
■ →pImplを活用
ライブラリの実装
● 問題発生
● TMPとpImplを両立させたい
○ templateばかりだとヘッダに全てが公開される
■ →pImplとは相性が悪い
● どうすればいいか
● CRTP
ライブラリの実装
● コマンドオブジェクトのoperator+などは全コマン
ドクラスで共通
● それぞれのクラスで異なる部分もある
● 普通なら継承などを使うところだけれども、「実
行時コストの低い」という目標に反する
● そこでCRTPを用...
ライブラリの実装
● CRTPとは?
○ class Inheritance : public Base < Inheritance > { } ;
○ 「奇妙に再帰するtemplateパターン」
○ 基底クラスは継承先のクラスについての詳細を...
ライブラリの実装
● CRTPを用いて、共通の処理は基底クラス側
で、派生クラスごとに異なる処理もstatic_castと
visitorパターンを用いて処理を行う
● 基底クラス側では実装をpImplなどを用いて隠
蔽できる
● TMPとpI...
ライブラリの実装
● 各種コマンドクラスの実装の詳細はcppファイル
に隠蔽できる
● デモンストレーションのようなCUIを例えば
wxWidgetsなどを用いてGUIに差し替えることも
できる
将来
● 選択肢を出して、結果により条件分岐を行う機
能の実装
● 実行中の状態のセーブ/ロード機能の実装
● バックエンドをGUIに差し替え
● 等々
● なお、今回発表に使ったライブラリはGame++と
してGithubで公開しています
オマケ
● 当初はデモンストレーションもGUIを目指してい
ました
○ →使用環境(MinGW)でwxWidgetsがビルドできず
○ その他のGUIライブラリを試すも時間が無くなり断念
● というわけで、試した各種GUIライブラリについ
て簡...
オマケ
● wxWidets
○ イベントドリブン
○ 使いやすい、慣れてる
○ →最新のMinGWでビルドできず使用を断念
オマケ
● Qt
○ メジャーらしい(この勉強会でも関連のテーマで発表する
人がいますね)
○ ちょっと目的と沿わない感じだったので断念
オマケ
● FLTK
○ 海外ではメジャー? らしい
○ 手続き型とイベントドリブンが混在したようなインター
フェース
○ 使いやすそう……と思ったけれども結局良くわからず断
念
オマケ
● FOX
○ wxWidgetに似たようなイベントドリブンなインターフェー
スのライブラリ
○ これなら行けると思ったけれども、画像の表示がうまく行
かず断念
■ 目的がノベルゲームなので画像とテキストがオー
バーラップするのだけれど...
時間があれば質疑応答に入ります
ご清聴
ありがとうございました
第2回 mix c++勉強会@tokyo 資料
Upcoming SlideShare
Loading in …5
×

第2回 mix c++勉強会@tokyo 資料

972 views

Published on

第2回 mix c++勉強会@tokyo 資料での発表スライドです

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
972
On SlideShare
0
From Embeds
0
Number of Embeds
223
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

第2回 mix c++勉強会@tokyo 資料

  1. 1. C++でゲームDSL 2014/03/21 第2回 mixC++勉強会@Tokyo @minamiyama1994
  2. 2. 全体の概要 ● 自己紹介 ● デモンストレーション ● ライブラリの外観 ● ライブラリの実装 ● 将来性 ● (時間があれば)オマケ ● 質疑応答
  3. 3. 自己紹介 ● 広島に生息する極々平凡な大学生 ● Twitter:@minamiyama1994 ○ 女優能年玲奈ちゃんのファンとしてのアカウント @masakazu_nonenなどもあります ● C++好きです、とか言いつつ最近Haskellばかり やっている
  4. 4. ● Github:minamiyama1994 ○ FTMP(TMPのためのライブラリ) ○ C++のパーサコンビネータDSL ○ 議論支援系 ○ 小説っぽいの ○ girlfriend_require(彼女募集) ● などを公開しています 自己紹介
  5. 5. 初めに ● 今回作成したのは「ノベルゲーム用のC++の DSL」です ● もっと言えば設計も実装もプロトタイプです ● ご容赦下さいm(_ _)m
  6. 6. デモンストレーション ● こんなコードをコンパイルすると……
  7. 7. デモンストレーション ● こんな感じに
  8. 8. ライブラリの外観 ● namespaceはgpp ● class gameオブジェクトを生成 ● gameオブジェクトのoperator()に対しコマンドオ ブジェクトを引数に渡すと実行される ● gameオブジェクトをoperator()()で呼び出したら 終了
  9. 9. ライブラリの外観 ● gameオブジェクトのoperator()に対してコマンド を渡した結果のテキスト描画などは次に operator()が呼び出された時に消される ● operator()内ではコマンドによる描画結果など は有効
  10. 10. ライブラリの外観 ● コマンドオブジェクトは ○ text……テキスト ○ image……背景画像 ○ bgm……音声 ○ pause……Enterキー待 ○ clear……テキストクリア ● operator+で結合可能
  11. 11. ライブラリの実装 ● やりたいこと ○ templateを活用して重複の少ない&実行時コストの低い コードに ■ →TMPを活用 ○ 実装の詳細は隠蔽する ■ →pImplを活用
  12. 12. ライブラリの実装 ● 問題発生 ● TMPとpImplを両立させたい ○ templateばかりだとヘッダに全てが公開される ■ →pImplとは相性が悪い ● どうすればいいか ● CRTP
  13. 13. ライブラリの実装 ● コマンドオブジェクトのoperator+などは全コマン ドクラスで共通 ● それぞれのクラスで異なる部分もある ● 普通なら継承などを使うところだけれども、「実 行時コストの低い」という目標に反する ● そこでCRTPを用いて共通部分と異なる部分を まとめる
  14. 14. ライブラリの実装 ● CRTPとは? ○ class Inheritance : public Base < Inheritance > { } ; ○ 「奇妙に再帰するtemplateパターン」 ○ 基底クラスは継承先のクラスについての詳細を知ること ができる ○ static_castを用いて「安全に」「コンパイル時に」ダウン キャストができる ■ static_cast < Inheritance & > ( * this ) ; // というの が可能
  15. 15. ライブラリの実装 ● CRTPを用いて、共通の処理は基底クラス側 で、派生クラスごとに異なる処理もstatic_castと visitorパターンを用いて処理を行う ● 基底クラス側では実装をpImplなどを用いて隠 蔽できる ● TMPとpImplを両立させることが出来た!
  16. 16. ライブラリの実装 ● 各種コマンドクラスの実装の詳細はcppファイル に隠蔽できる ● デモンストレーションのようなCUIを例えば wxWidgetsなどを用いてGUIに差し替えることも できる
  17. 17. 将来 ● 選択肢を出して、結果により条件分岐を行う機 能の実装 ● 実行中の状態のセーブ/ロード機能の実装 ● バックエンドをGUIに差し替え ● 等々 ● なお、今回発表に使ったライブラリはGame++と してGithubで公開しています
  18. 18. オマケ ● 当初はデモンストレーションもGUIを目指してい ました ○ →使用環境(MinGW)でwxWidgetsがビルドできず ○ その他のGUIライブラリを試すも時間が無くなり断念 ● というわけで、試した各種GUIライブラリについ て簡単に紹介
  19. 19. オマケ ● wxWidets ○ イベントドリブン ○ 使いやすい、慣れてる ○ →最新のMinGWでビルドできず使用を断念
  20. 20. オマケ ● Qt ○ メジャーらしい(この勉強会でも関連のテーマで発表する 人がいますね) ○ ちょっと目的と沿わない感じだったので断念
  21. 21. オマケ ● FLTK ○ 海外ではメジャー? らしい ○ 手続き型とイベントドリブンが混在したようなインター フェース ○ 使いやすそう……と思ったけれども結局良くわからず断 念
  22. 22. オマケ ● FOX ○ wxWidgetに似たようなイベントドリブンなインターフェー スのライブラリ ○ これなら行けると思ったけれども、画像の表示がうまく行 かず断念 ■ 目的がノベルゲームなので画像とテキストがオー バーラップするのだけれども、オーバーラップさせる 方法がわからなかった
  23. 23. 時間があれば質疑応答に入ります ご清聴 ありがとうございました

×