F#でもゲームを作りたい!

これはmast Advent Calendar 2016 - Adventarの6日目の記事です.

はじめに

F#という言語を知っていますか?
F#はMicrosoftが開発しているML (Meta Language) でいわゆる関数型言語です.
詳しくはF# Guide を読むとよさそうです.
MLといえばOCamlStandard MLが有名ですが,F#の|>演算子OCamlに輸入されたりいい感じに高めあってる気がします.

さて,そんなF#を勉強するため試しに簡単なゲームを作ろうとしていたのですが,ggってみるとXNAを使う記事が多く見つかり残念な気持ちになります(XNAは開発中止……)
UnityというC#ベースのエンジンでF#を使うという記事がいくつかあるのですが,F#のコードをビルドして出来上がったdllをC#から使うという話であって全部F#で書けるわけではなさそう……

というわけでゲームエンジン - Altseed -というものを使ってF#でゲームを作る方法を紹介したいと思います.
実はAltseedは正式にF#に対応しているわけではないのですが,C#版のライブラリをF#から使ってやっていきます.

環境はVisual Studio 2015を想定していますが,Visual Studio 2017 RCでもほとんど同じでした.

F#をはじめてまだ日が浅いので何か変なことを書いていれば指摘していただけると嬉しいです.

環境の準備

  1. http://altseed.github.io/ の左のカラムの「導入」 > 「ダウンロード」からC#版のWindows向けのものを入手して解凍
  2. Visual Studioを開いてVisual F#のコンソールアプリケーションのプロジェクトを作る
  3. 解凍した中のRuntimeフォルダに入っているAltseed.dll, Altseed_core.dll, Altseed.XMLをプロジェクトのディレクトリにコピー
  4. コピーしたAltseed.dllとAltseed_core.dllをVisual Studioの右欄にあるソリューションエクスプローラーにドラッグ
  5. Altseed.dllとAltseed_core.dllそれぞれに対して右クリック > プロパティ から「出力ディレクトリーにコピー」を「コピーしない」から「新しい場合はコピーする」に変更
  6. ソリューションエクスプローラー内の「参照設定」を右クリックして「参照の追加」
  7. 出てきたダイアログの下の方にある「参照」からプロジェクトフォルダ内のAltseed.dllを「追加」して「OK」

適当にソースコード内に「asd.」と書いてみてインテリセンスが効いているようなら多分大丈夫.
実はこの流れはほとんどC#版と同じなので困ったらC#版のドキュメントをみるといいかもしれません.

コードの例

ウィンドウを出してみる

Program.csに

[<EntryPoint>]
let main argv =
    ignore (asd.Engine.Initialize("test", 640, 480, new asd.EngineOption()))
    while asd.Engine.DoEvents() do
        asd.Engine.Update()
    done
    asd.Engine.Terminate()
    0

と書いてF5を押す.
うまくいけばtestっていうタイトルの真っ黒なウィンドウが表示されるはず.

画像を出してみる

適当な画像をプロジェクトに追加してAltseed.dllとかと同じように「出力ディレクトリーにコピー」を「新しい場合はコピーする」に変更.
例えば画像の名前をnyan.pngとすると

type Neko =
    inherit asd.TextureObject2D
    new() as self = {} then
        self.Texture <- asd.Engine.Graphics.CreateTexture2D("nyan.png")

[<EntryPoint>]
let main argv =
    ignore (asd.Engine.Initialize("test", 640, 480, new asd.EngineOption()))
    let neko = new Neko ()
    ignore(asd.Engine.AddObject2D(neko))
    while asd.Engine.DoEvents() do
        asd.Engine.Update()
    done
    asd.Engine.Terminate()
    0

みたいな感じに書くと左上に画像がでてくる.
個人の好みで継承とか使ってるのでもっと短く書こうと思えば書ける.

Altseedの使い方はC#版のドキュメントを読めばだいたいそれがF#でも通用する.

おわりに

めっちゃ簡単にMLでゲームを作れる環境を見つけれたので個人的にとてもうれしい.
F12を押して宣言に移動とかも普通にできる.うれしい.
これまでゲーム書くときはC#を使ってたけど,これからはF#に移住するかもしれないです.