これは Ruby Advent Calendar 2023 の6日目の記事です。一つ前の記事はRubyのプロダクトコードの複雑度の変化を可視化するです。
こんにちは。今年は mruby や picoruby にも触れてみたかったのですがもう12月ですね……おかしいな……。
遊んでみたい方はこちらのリンクからどうぞ。
https://sonota88.github.io/dxopal-suikalike/index.html
リポジトリはこちら。効果音はパブリックドメインとします。何かに使えそうなら使ってください。
https://github.com/sonota88/dxopal-suikalike
https://github.com/yhara/dxopal
DXOpal についてざっくり特徴を挙げると次のような感じでしょうか。
入門用のドキュメントとしては以下2つがおすすめです。
DXOpal には物理演算ライブラリ(matter.js)を利用した機能が実験的に用意されており、リポジトリの examples ディレクトリにサンプルがあります。
https://github.com/yhara/dxopal/tree/master/examples/matter
これを使って何かできないかなーと以前からボンヤリ考えていたのですが、今年はスイカゲームが流行りましたから、じゃあ作ろうかと。
作り自体は割と簡単です。めんどくさいところ(ボール同士の接触判定や物理演算)は DXOpal と matter.js がやってくれるので基本部分は数時間で動くようになりました。
できあがりのサイズはこのくらい。小さく作るのが好き。
$ wc -l *.rb
57 ball.rb
314 game.rb
119 main.rb
490 合計
以下、開発メモです。
なるべく DXOpal 本体に手を加えない範囲に収めたかったのですが、物体を消去する処理は必要なのでここだけ追加しました。
--- a/lib/dxopal/sprite/physics.rb
+++ b/lib/dxopal/sprite/physics.rb
@@ -56,6 +56,15 @@ module DXOpal
`Matter.World.addBody(#{Sprite._matter_engine}.world, body)`
end
+ def remove_matter_body
+ Sprite._remove_matter_body(@_matter_body)
+ end
+
+ def self._remove_matter_body(body)
+ _matter_sprites.delete(`body.id`)
+ `Matter.World.remove(#{Sprite._matter_engine}.world, body, null)`
+ end
+
# Return true if `physical_body=` is ever called
def self.matter_enabled?
# Note: we cannot use `!!` here because @matter_engine may be a JS object,
これを追加するために matter.js のドキュメントとソースを軽く眺めましたが、matter.js 絡みの手間はその程度で済みました。見様見真似の間に合わせなのでひょっとしたらおかしなことしてるかもしれません。
やっぱり音量調節もしたいということで。Sound クラスと SoundEffect クラスの代わりに少しいじったクラスを用意してそっちを使っています。DXOpal 本体に手を入れなくて済むので今回はこの方式にしました。
今回は事前コンパイルする方式で開発を進めました。以下の記事を参照してください。
Dockerを利用してDXOpalアプリケーションを手軽に事前コンパイルする
以下おまけです。
今回作ったものとは無関係ですが DXOpal 関連ということでご紹介です。
思いつきで書いてみた小物をときどき追加しているリポジトリです。アルゴリズムの解説とか見るとこういうの作りたくなりますよね。
https://github.com/sonota88/dxopal-demos
メタボール
Marching squares
連立方程式を解くやつ(ガウス・ジョルダンの消去法)
フーリエ変換
今回作ったものとは無関係ですが DXOpal 関連ということでご紹介です。
DXOpal は「ゲームを作るためのフレームワーク」という位置づけにはなっていますが、いわゆる普通のゲームを作る以外にも
という場合にサッと使えて重宝しています。
そのような「ゲームではないもの」の例として、以前簡単な CPU シミュレータを作ったことがありました。
というものです。
Ruby+DXOpalでリレー式論理回路シミュレータを自作して1bit CPUまで動かした
これ作るの結構楽しかったのでみなさんもぜひ! と言いたい気持ち。
以下の書籍にもゲーム以外のアプリケーションの例が載っています。参考までに。
せっかくのアドベントカレンダーですので、今年書いたものを貼っておきます。
去年のアドベントカレンダーではこういうのを書いていました。
「世は大パーサー時代!」より数カ月早く書いてしまってタイミングを逃した(?)感がなくもないですが、パーサにご興味あればこちらもどうぞ!
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント