Upload
-
View
619
Download
3
Embed Size (px)
Citation preview
C++でゲームDSL2014/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パターン」
○ 基底クラスは継承先のクラスについての詳細を知ること
ができる
○ static_castを用いて「安全に」「コンパイル時に」ダウン
キャストができる
■ static_cast < Inheritance & > ( * this ) ; // というの
が可能■ →実行時のコストが低い
ライブラリの実装
● CRTPを用いて、共通の処理は基底クラス側で、派生クラスごとに異なる処理もstatic_castとvisitorパターンを用いて処理を行う
● 基底クラス側では実装をpImplなどを用いて隠蔽できる
● TMPとpImplを両立させることが出来た!
ライブラリの実装
● 各種コマンドクラスの実装の詳細はcppファイルに隠蔽できる
● デモンストレーションのようなCUIを例えばwxWidgetsなどを用いてGUIに差し替えることもできる
将来
● 選択肢を出して、結果により条件分岐を行う機能の実装
● 実行中の状態のセーブ/ロード機能の実装● バックエンドをGUIに差し替え● 等々● なお、今回発表に使ったライブラリはGame++と
してGithubで公開しています
オマケ
● 当初はデモンストレーションもGUIを目指していました○ →使用環境(MinGW)でwxWidgetsがビルドできず○ その他のGUIライブラリを試すも時間が無くなり断念
● というわけで、試した各種GUIライブラリについて簡単に紹介
オマケ
● wxWidets○ イベントドリブン○ 使いやすい、慣れてる○ →最新のMinGWでビルドできず使用を断念
オマケ
● Qt○ メジャーらしい(この勉強会でも関連のテーマで発表する
人がいますね)○ ちょっと目的と沿わない感じだったので断念
オマケ
● FLTK○ 海外ではメジャー? らしい
○ 手続き型とイベントドリブンが混在したようなインター
フェース
○ 使いやすそう……と思ったけれども結局良くわからず断
念
オマケ
● FOX○ wxWidgetに似たようなイベントドリブンなインターフェー
スのライブラリ
○ これなら行けると思ったけれども、画像の表示がうまく行
かず断念
■ 目的がノベルゲームなので画像とテキストがオー
バーラップするのだけれども、オーバーラップさせる
方法がわからなかった
時間があれば質疑応答に入ります
ご清聴ありがとうございました