見出し画像

ClojureScriptでPhaser.jsのライブラリとゲーム開発をする楽しい日々

昨年末にニャンパス株式会社を清算することを決め、個人事業主としてゲーム開発を行なっているのですが、その際にClojureScriptで、Phaser.jsというフレームワークを使った開発をしようと決めてビジュアルプログラミングのゲームを開発中です。
その際に直接Phaser.jsをいじらずPhaser.jsを触るためのライブラリを介して実装することで、ゲームのアプリケーションの部分を切り分けようと考えてこちらのライブラリを作り始めました。

そういったわけでアプリケーション部分とライブラリ部分に分けているので、普段の開発の流れを具体的な例を出して挙げてみますとこんな形になります。

 1. あるSpriteをドラッグしているときに、そのSpriteの色が変わっていてドラッグ中であることを表現したいと考えてPhaser.jsのドキュメントをチェックし、setColorが適切だと分かる。

setTint
<instance> setTint([topLeft], [topRight], [bottomLeft], [bottomRight])
Description:
Sets an additive tint on this Game Object.

Sprite.setTint

 2. アプリケーションのコード上で、そのAPIを呼び出して動作を確認する。

(.setTint (:sprite block) 0xa0a0a0)

 3. 上記のままだと直接Phaser.jsの APIを叩いているため、アプリケーションレベルでは、meowser.cljsのライブラリを経由するように修正する

;; アプリケーション部分
(set-tink! bock 0xa0a0a0)

;; ライブラリ部分
(defn set-tint! [{:keys [sprite]} color]
  (.setTint sprite color))

簡単に書くとこういったステップで、これを繰り返していくとアプリケーションレベルでは直接Phaser.jsのAPIを叩くことがなくなり、ある程度のものがmeowser.cljsに収まっているのでPhaser.jsに関する知見はライブラリに集まり、アプリケーション側ではそのPhaser.jsの薄いラッパーを使う形で役割が分離されているという感じです。

そうなると、もう一つ大きく嬉しい点があり、Clojureらしいコードをアプリケーション側で書けるようになります。
いわゆる関数型言語としての利点を受けられ、ゲーム開発なのだけれどあくまでもデータの操作を中心とした書き方をしたり、もちろん破壊的な操作は破壊的な操作として違和感なくコードをかけますが、この辺は何を持ってClojureらしいのかと説明しようとするとニュアンス的なものを伝えるのが難しいなとここにきて感じてきましたので、皆様方におかれましては時間のある時にClojure(Script)でゲームを作っていただくことで体感していただければ幸いです。


いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
2024年12月から「Meowtaverse Games」を立ち上げ、プログラミングをテーマにしたゲーム開発を行っています。鹿児島県にある長島町出身。 これまでに書いた本 https://note.com/meowtaverse/n/nc3c409fd46ef
ClojureScriptでPhaser.jsのライブラリとゲーム開発をする楽しい日々|登尾 徳誠(Tokusei Noborio)@Meowtaverse Games
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1