SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
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パターン」
○ 基底クラスは継承先のクラスについての詳細を知ること
ができる
○ 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に似たようなイベントドリブンなインターフェー
スのライブラリ
○ これなら行けると思ったけれども、画像の表示がうまく行
かず断念
■ 目的がノベルゲームなので画像とテキストがオー
バーラップするのだけれども、オーバーラップさせる
方法がわからなかった
時間があれば質疑応答に入ります
ご清聴
ありがとうございました

Más contenido relacionado

Más de 真一 北原

Lt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみたLt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみた真一 北原
 
Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果真一 北原
 
型安全Printf作ってみた
型安全Printf作ってみた型安全Printf作ってみた
型安全Printf作ってみた真一 北原
 
能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた真一 北原
 
C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料真一 北原
 

Más de 真一 北原 (6)

すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
 
Lt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみたLt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみた
 
Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果
 
型安全Printf作ってみた
型安全Printf作ってみた型安全Printf作ってみた
型安全Printf作ってみた
 
能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた
 
C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Último (8)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

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