FsBulletML(Beta)
これは何?
FsBulletML
は、弾幕記述言語BulletML
のF#
実装です。 MonoGame
やUnity(2D or 3D)
などで利用することができます。
判別共用体(Discriminated Unions)で弾幕を記述できる型付き内部DSLを提供します。
また、XML
形式、SXML
形式、FSB
形式(オフサイドルールの独自形式)の外部DSLを読み込んで実行することもできます。
特徴
- 判別共用体で弾幕を記述できます。(内部DSL)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: |
open FsBulletML /// 全方位弾 let sample = Bulletml({ bulletmlXmlns = None; bulletmlType = Some ShootingDirection.BulletVertical;}, [BulletmlElm.Action ({actionLabel = Some "circle";}, [Action.Repeat (Times "$1", Action ({actionLabel = None;}, [Fire ({fireLabel = None;}, Some (Direction (Some {directionType = DirectionType.Sequence;},"360/$1")), None, Bullet ({bulletLabel = None;}, None, None,[]))]))]); BulletmlElm.Action ({actionLabel = Some "top";}, [Action.Repeat (Times "30", ActionElm.Action ({actionLabel = None;}, [Action.ActionRef ({actionRefLabel = "circle";}, ["20"]); Wait "20"]))])]) |
XML
形式で弾幕を記述できます。 (外部DSL)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: |
<!--全方位弾--> <bulletml> <action label="circle"> <repeat> <times>$1</times> <action> <fire> <direction type="sequence">360/$1</direction> <bullet/> </fire> </action> </repeat> </action> <action label="top"> <repeat> <times>30</times> <action> <actionRef label="circle"> <param>20</param> </actionRef> <wait>20</wait> </action> </repeat> </action> </bulletml> |
SXML
形式で弾幕を記述できます。(外部DSL)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: |
(bulletml (action (@ (label "circle")) (repeat (times "$1") (action (fire (direction (@ (type "sequence")) "360/$1") (bullet))))) (action (@ (label "top")) (repeat (times "30") (action (actionRef (@ (label "circle")) (param "20")) (wait "20"))))) |
FSB
形式(オフサイドルールの独自形式)で弾幕を記述できます。(外部DSL)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: |
bulletml action label="circle" repeat times:"$1" action fire direction type="sequence":"360/$1" bullet action label="top" repeat times:"30" action actionRef label="circle" param:"20" wait:"20" |
- 敵弾、敵機の動作に加えて、自機弾も
BulletML
で記述することができます(互換性を保った仕様拡張)。
- Bulletml判別共用体の記述を容易にするためのコードスニペットを提供しています。
※拡張機能 F# snippetを導入する必要があります
F# snippet extension - Visual Studio Gallery - Microsoft
F# code snippet + snippet management for Visual Studio 2012 Addon - Apollo 13 - Tao Liu's blog
すべての F# ユーザーが今すぐ導入すべき拡張機能 F# snippet を導入しよう - Bug Catharsis
- 外部DSLは
C#
やVB
からも使えます。F#
で定義した内部DSLをC#
やVB
から呼び出すこともできます。
インストール
内部DSLおよび、XML
形式の外部DSLを利用するには、FsBulletML.Core
をインストールします。(.NET Framework3.5以上)
PM> Install-Package FsBulletML.Core
外部DSL(SXML
形式、FSB
形式)を利用するには、FsBulletML.Core
に加えて、FsBulletML.Parser
をインストールします。(.NET Framework4.0以上)
PM> Install-Package FsBulletML.Parser
型プロバイダー利用するには、FsBulletML.Core
, FsBulletML.Parser
に加えて、FsBulletML.TypeProviders
をインストールします。(.NET Framework4.0以上)
XML
形式、SXML
形式、FSB
形式のBulletMLの型プロバイダーを利用することができます。
PM> Install-Package FsBulletML.TypeProviders
MonoGame Demo
Unity2D Demo
Move:↑↓←→ Shot: Z Key
サンプルプログラム(F#), サンプルプログラム(C#)
Unity3D Demo
ご利用上の注意
- パフォーマンスがよろしいとは言えないので鬼畜系弾幕は厳しいかもしれません。
ActionRef
,FireRef
,BulletRef
要素の相互参照に対応していません。- APIが固まっていないBeta版扱い。なので、バージョンアップによって破壊的変更がされる可能性があります。
今後の課題とか(予定は未定)
- テストが雑。現状ざっくりとしたパーサのテストしかない。
BulletML
の構文チェックが中途半端。- より型安全な弾幕記述のサポート。
- モナディックに弾幕を構築する仕組みとか。
CustomOperationAttribute
を利用したコンピュテーション式とか。 SXML
形式のパーサの改善。行コメントのサポート。FSB
形式のパーサの改善。行コメントのサポート。- APIの改善とか。
C#
等からの使いやすさの向上とか。 - パフォーマンスの向上とか。
BulletML
の仕様と互換を持たせつつ、独自仕様を追加。別枠でカスタム ビジュアライザーの提供とか。
完全名: Index.sample
全方位弾
共用体ケース Bulletml.Bulletml: BulletmlAttrs * BulletmlElm list -> Bulletml
--------------------
type Bulletml =
| Bulletml of BulletmlAttrs * BulletmlElm list
| Action of ActionAttrs * Action list
| ActionRef of ActionRefAttrs * Params
| Fire of FireAttrs * Direction option * Speed option * BulletElm
| FireRef of FireRefAttrs * Params
| Wait of string
| Vanish
| ChangeSpeed of Speed * Term
| ChangeDirection of Direction * Term
| Accel of Horizontal option * Vertical option * Term
...
member ToNodeString : unit -> string
override ToString : unit -> string
member Description : string option
member Name : string option
member private ToStructuredDisplay : string
member Type : ShootingDirection option
完全名: FsBulletML.DTD.Bulletml
| BulletNone
| BulletVertical
| BulletHorizontal
override ToString : unit -> string
member private ToStructuredDisplay : string
完全名: FsBulletML.DTD.ShootingDirection
| Bullet of BulletAttrs * Direction option * Speed option * ActionElm list
| Fire of FireAttrs * Direction option * Speed option * BulletElm
| Action of ActionAttrs * Action list
override ToString : unit -> string
member private ToStructuredDisplay : string
完全名: FsBulletML.DTD.BulletmlElm
共用体ケース ActionElm.Action: ActionAttrs * Action list -> ActionElm
--------------------
type Action =
| ChangeDirection of Direction * Term
| Accel of Horizontal option * Vertical option * Term
| Vanish
| ChangeSpeed of Speed * Term
| Repeat of Times * ActionElm
| Wait of string
| Fire of FireAttrs * Direction option * Speed option * BulletElm
| FireRef of FireRefAttrs * Params
| Action of ActionAttrs * Action list
| ActionRef of ActionRefAttrs * Params
override ToString : unit -> string
member private ToStructuredDisplay : string
完全名: FsBulletML.DTD.Action
共用体ケース Times.Times: string -> Times
--------------------
type Times = | Times of string
完全名: FsBulletML.DTD.Times
共用体ケース Direction.Direction: DirectionAttrs option * string -> Direction
--------------------
type Direction = | Direction of DirectionAttrs option * string
完全名: FsBulletML.DTD.Direction
| Aim
| Absolute
| Relative
| Sequence
override ToString : unit -> string
member private ToStructuredDisplay : string
完全名: FsBulletML.DTD.DirectionType
| Action of ActionAttrs * Action list
| ActionRef of ActionRefAttrs * Params
override ToString : unit -> string
member private ToStructuredDisplay : string
完全名: FsBulletML.DTD.ActionElm