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