bigsleepの日記

 | 

2015-07-19

AFRPでゲームを作ってみる

20:24

ゲームを作るのとかにFRPが使われてるというのを聞いたりしたことがあって

使い方を覚えたいと思いつつスプラトゥーンばっかりしていたため

なかなか進まなかったんですが、少し使い方がわかった気がするのでここに書いておきます。


ソースコード

https://github.com/bigsleep/warehousekeeper

https://bigsleep.github.io/warehousekeeper/game.html

倉庫番というゲームとだいたい同じでブロックを定位置に動かすという感じのゲームをつくりました。

elmにautomatonというAFRP向けっぽいライブラリがあってこれを使って作ってみました。

elmの使い方はまだあまり覚えてなくてキーボード入力とか簡単なところしか使ってません。


AFRP

AFRPは Arrowized Functional Reactive Programming の略です。

FRPの種類とかライブラリとか色々あってどう違うのかとかどれを使えばいいのかとかよくわかってませんが、

AFRPでゲームを作った例とかサンプルは結構見かけたので使ってみることにしました。



haskellのYampaというライブラリが結構古くからあって有名なようです。

シューティングゲームの例なんかもありました。

https://wiki.haskell.org/Yampa

ここのパックマンFRPにした感じの絵がなんかよくわからないけれど楽しい感じがします。

https://wiki.haskell.org/Yampa/game_engine



他にも色々AFRPのライブラリがあるようです。

http://hackage.haskell.org/package/netwire



このあたりも関係がありそうな雰囲気がありました。

http://hackage.haskell.org/package/auto

http://hackage.haskell.org/package/arrows

http://hackage.haskell.org/package/machines


Signal Function

AFRPではSignal Functionというのが重要な感じで、これの使い方がわかればだいたい使えそうという感じがしました。

Signal Functionで色々な部品を作って、Signal FunctionはArrowのインスタンスになっているので

Arrowの関数を使って配線してプログラムを作るという感じのようです。


実装によって色々違いますがSignal Functionは下のような感じの定義になってることが多いようです。

data SF a b = SF (a -> (SF a b, b))

入力と出力があって、入力を受け取って出力と次のSignal Functionを返す感じになってます。

AutomatonとかMealyと呼ばれることもあるようです。


状態

ゲームを作るときにStateTなどで状態を扱ったりしてました。

ただそれだとどこからも状態を変えられたりして微妙な感じがしてたんですが

AFRPではSignal Functionに内部状態を隠蔽するような感じで扱えるようです。

Yampaにそれっぽい関数がありました。

https://hackage.haskell.org/package/Yampa-0.9.5/docs/FRP-Yampa.html#v:loopPre


ArrowLoopというのを使ってるようなんですが、デフォルトの状態を渡さなくてもいいのがよく理解できてません。

http://hackage.haskell.org/package/base-4.8.0.0/docs/Control-Arrow.html#v:loop


elmの方にも似た感じの関数がありました。

http://package.elm-lang.org/packages/evancz/automaton/1.0.1/Automaton#state

http://package.elm-lang.org/packages/evancz/automaton/1.0.1/Automaton#hiddenState

http://package.elm-lang.org/packages/evancz/automaton/1.0.1/Automaton#loop



Arrow

http://hackage.haskell.org/package/base-4.8.0.0/docs/Control-Arrow.html

Arrowも型クラスの一つです。

haskellにarrow記法というのがあってdo記法と少し似た感じでArrowを書けるようになってます。

https://www.haskell.org/arrows/syntax.html

ただ慣れないとあまり書きやすくないような気もします。

使ったことないですがアスキーアートで書くものとかもあるらしいです。

http://scrambledeggsontoast.github.io/2014/09/28/needle-announce/


elm

elmはJavaScriptコンパイルされるHaskell風の言語の一つです。

触ったことないですが他にもPureScriptとか色々あるようです。


http://elm-lang.org/

マリオを動かすサンプルとかがあって結構簡単に動かせそうという気がします。

実際haskellと大分似てるのですぐなんとなく使い方がわかった気がします。

haskellと違ってIOはなくて、mainの型はSignal Elementのような感じになってます。

だいたいマウス入力やキーボード入力などのシグナルを色々操作して

出力のSignal Elementに持っていくような感じで使えるようでした。

haskellより機能が大分限られていてhaskellと同様のものを期待するときつそうですが、

使えるものが限られているのであまりやり方に悩まないということはあると思います。

あと標準で色々絵を描くようなライブラリ (Graphic.Element, Graphic.Collage) もあって簡単な可視化とかは

やりやすそうでした。

トラックバック - http://d.hatena.ne.jp/bigsleep/20150719/1437305044
 |