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

24
C++でゲームDSL 2014/03/21 2mixC++勉強会@Tokyo @minamiyama1994

Upload: -

Post on 19-Jul-2015

619 views

Category:

Technology


3 download

TRANSCRIPT

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

C++でゲームDSL2014/03/21

第2回 mixC++勉強会@Tokyo@minamiyama1994

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

全体の概要

● 自己紹介● デモンストレーション● ライブラリの外観● ライブラリの実装● 将来性● (時間があれば)オマケ● 質疑応答

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

自己紹介

● 広島に生息する極々平凡な大学生● Twitter:@minamiyama1994

○ 女優能年玲奈ちゃんのファンとしてのアカウント

@masakazu_nonenなどもあります

● C++好きです、とか言いつつ最近Haskellばかりやっている

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

初めに

● 今回作成したのは「ノベルゲーム用のC++のDSL」です

● もっと言えば設計も実装もプロトタイプです● ご容赦下さいm(_ _)m

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

デモンストレーション

● こんなコードをコンパイルすると……

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

デモンストレーション

● こんな感じに

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

ライブラリの外観

● namespaceはgpp● class gameオブジェクトを生成● gameオブジェクトのoperator()に対しコマンドオ

ブジェクトを引数に渡すと実行される● gameオブジェクトをoperator()()で呼び出したら

終了

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

ライブラリの外観

● gameオブジェクトのoperator()に対してコマンドを渡した結果のテキスト描画などは次にoperator()が呼び出された時に消される

● operator()内ではコマンドによる描画結果などは有効

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

ライブラリの外観

● コマンドオブジェクトは○ text……テキスト○ image……背景画像○ bgm……音声○ pause……Enterキー待○ clear……テキストクリア

● operator+で結合可能

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

ライブラリの実装

● やりたいこと○ templateを活用して重複の少ない&実行時コストの低い

コードに■ →TMPを活用

○ 実装の詳細は隠蔽する■ →pImplを活用

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

ライブラリの実装

● 問題発生● TMPとpImplを両立させたい

○ templateばかりだとヘッダに全てが公開される■ →pImplとは相性が悪い

● どうすればいいか● CRTP

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

ライブラリの実装

● コマンドオブジェクトのoperator+などは全コマンドクラスで共通

● それぞれのクラスで異なる部分もある● 普通なら継承などを使うところだけれども、「実

行時コストの低い」という目標に反する● そこでCRTPを用いて共通部分と異なる部分を

まとめる

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

ライブラリの実装

● CRTPとは?○ class Inheritance : public Base < Inheritance > { } ;○ 「奇妙に再帰するtemplateパターン」

○ 基底クラスは継承先のクラスについての詳細を知ること

ができる

○ static_castを用いて「安全に」「コンパイル時に」ダウン

キャストができる

■ static_cast < Inheritance & > ( * this ) ; // というの

が可能■ →実行時のコストが低い

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

ライブラリの実装

● CRTPを用いて、共通の処理は基底クラス側で、派生クラスごとに異なる処理もstatic_castとvisitorパターンを用いて処理を行う

● 基底クラス側では実装をpImplなどを用いて隠蔽できる

● TMPとpImplを両立させることが出来た!

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

ライブラリの実装

● 各種コマンドクラスの実装の詳細はcppファイルに隠蔽できる

● デモンストレーションのようなCUIを例えばwxWidgetsなどを用いてGUIに差し替えることもできる

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

将来

● 選択肢を出して、結果により条件分岐を行う機能の実装

● 実行中の状態のセーブ/ロード機能の実装● バックエンドをGUIに差し替え● 等々● なお、今回発表に使ったライブラリはGame++と

してGithubで公開しています

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

オマケ

● 当初はデモンストレーションもGUIを目指していました○ →使用環境(MinGW)でwxWidgetsがビルドできず○ その他のGUIライブラリを試すも時間が無くなり断念

● というわけで、試した各種GUIライブラリについて簡単に紹介

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

オマケ

● wxWidets○ イベントドリブン○ 使いやすい、慣れてる○ →最新のMinGWでビルドできず使用を断念

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

オマケ

● Qt○ メジャーらしい(この勉強会でも関連のテーマで発表する

人がいますね)○ ちょっと目的と沿わない感じだったので断念

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

オマケ

● FLTK○ 海外ではメジャー? らしい

○ 手続き型とイベントドリブンが混在したようなインター

フェース

○ 使いやすそう……と思ったけれども結局良くわからず断

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

オマケ

● FOX○ wxWidgetに似たようなイベントドリブンなインターフェー

スのライブラリ

○ これなら行けると思ったけれども、画像の表示がうまく行

かず断念

■ 目的がノベルゲームなので画像とテキストがオー

バーラップするのだけれども、オーバーラップさせる

方法がわからなかった

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

時間があれば質疑応答に入ります

ご清聴ありがとうございました