Nimで簡単なゲームを作った
2019年1月15日
最近Nimでインタプリタを作っているのですが、如何せんNim流の書き方に慣れていないようで、度々がっつり詰まってしまいます。
ですので、一度Nimっぽい書き方を学んでみようと思い、2日くらいでできるプロジェクトを探してみました。
成果物
完成品はこちらにあります。
概要
このゲームはNimで書かれたSDL2というクロスプラットフォーム向けのマルチメディアライブリを使って書いています。 ゲームはとても簡単なもので、表示されたキャラクターをキーボード操作で右側にあるゴールへ向かって進めるものです。
それまでにかかった時間と、ベストタイムも表示されます。
https://gyazo.com/8ef173c748cedbefb9786e13195cae61
環境構築
環境構築がちょっと大変だったのでそこだけメモ。
homebrewでゲーム関係のライブラリをを入れる。
$ brew install sdl2 sdl2_image sdl2_ttf
Nimのプロジェクトを作成する。
$ mkdir nim_platform_game
$ nimble install
依存するパッケージをインストール
$ nimble install sdl2 strfmt
実行
ディレクトリ構成に気をつけて、プロジェクトルートで以下を実行
$ nim -r c nim_platform_game.nim
注意点
全体的に記事通りに進めれば良いのですが、一つだけ注意する箇所があります。
あまりsdl2のことをしらないけど、記事中の「1.最初の動くプログラム」を書き終わった時点では画面は表示されませんでした。
「2.ユーザ入力」までやり終えて、コンパイルし実行したら青いスクリーンが起動しました。
Nimとしての気付き
列挙型と構造体の使い方
result句を多用する
構造体のコンストラクタでもnew result のようにしてインスタンスを生成する
基本的にreturn 句は使わない
Nimは関数呼び出し時に色々な書き方できるが、
hoge(piyo)や、piyo.hoge()だったりhoge piyoだったり、どういう基準で書き分けているのかがわからない
forward declarationsで最初に関数を定義して置くと定義した順番に依らずに使うことができる
pure
discardable
global
notin
最後に
本当は、マップを拡張したり、プレイするキャラを選択できる機能を追加したりなどのオリジナリティを入れても良かったのですが、それよりもインタプリタを作りたかったので、ここで中断しました。
NimはGoやRustと同じように、構造体を作ってそこにメソッドを生やしていく書き方をしていきます。
Rustの場合はimplで括るのでまだ見やすいのですが、NimやGoはメソッドの定義が散らばってしまうのでちょっと見づらいなという気がしています。
Nimでゲームを作るなんて割とニッチなとこだと思うのですが、それを翻訳して掲載してくれてるPOSTDにとても感謝です。
参考