読者です 読者をやめる 読者になる 読者になる

Cruxがあればゲームのコードが良くなると思った

Advent Calendar 2016 Rust 作った

ryo33.hatenablog.com

24日目です。


動機

昔何かの記事を読んで、その時からメッセージ指向でゲームを作りたいと考え始めました。 しかし、慣れてしまったやり方からはなかなか離れられないもので、 長らく実現することができていませんでした。 後述するcdb-rustも「いつものやり方でいいか」という消極的な考えのまま作られたものです。

最近、Webのフロントエンドをやる機会があって、 JavaScriptのRedux.jsというライブラリを使っていました。 僕の認識では、状態の変更に関して、 Storeに送られたActionが Middlewareを通って変形・フィルタリングされ、 それを受け取ったReducerが状態を書き換えるような アーキテクチャにするためのライブラリです( Fluxを実現するライブラリの一つと書いたほうが正確ですが、 動機的にはこの書き方のほうが伝わりやすいはずです)。 それを使っていく中で、ゲームプログラミングも似たようなやり方でやりたいという思いが高まってきたためCruxというライブラリを作ることになりました。

Cruxについて

基本的な使い方は、状態を管理する構造体をもとにStoreを作って store.dispatch(action)で非同期にstore.dispatch_sync(action)で同期的にActionを 送ります。最新の状態はstore.state()で取れます。

Actionのキューや非同期処理、排他処理などはいい感じに隠蔽されています(コードもいい感じとは言っていない)。

あとActorっぽく使うこともできます。

ryo33.hatenablog.com

実際に使ってみる

github.com

前に作ったCDBというゲームがあったので、それをCruxを使って書き換えました。 Crux本体のコードを書くのは本当に楽しくてしょうがなかったのですが、 こっちの作業はかなりつまらなかったです。 ウィンドウ切り替えなどをした時に固まるなどの不具合がありますが、とりあえず動くところまではできました。

さて、コードが良くなったどうかですが、正直に言うとあまり良くなっていません。 時間がなくてActionの単位が大きかったり、 Middlewareを使うようにしたりできなかったためです。

幾つかの処理をActionとして切り出してMiddlewareから送るようにすれば、もうちょっとCruxの良さが分かるコードになると思います (具体的にはボールやバーの大きさが徐々に変化する部分やボールがアイテムに当たる部分などです)。

これから

コードに危ういところがあり警告も出るのでそれを直していきたいです。 あとはドキュメントの整備もやっていきたいです。


最後まで読んでいただきありがとうございました。