2023-12-06に更新

DXOpalでスイカゲームみたいなのを作った

これは Ruby Advent Calendar 2023 の6日目の記事です。一つ前の記事はRubyのプロダクトコードの複雑度の変化を可視化するです。

image

こんにちは。今年は mruby や picoruby にも触れてみたかったのですがもう12月ですね……おかしいな……。

できたもの

遊んでみたい方はこちらのリンクからどうぞ。

https://sonota88.github.io/dxopal-suikalike/index.html

  • マウス操作のみ対応しています
  • ボール(正方形ですが)のサイズは 1 から 10 まで
    • 球にするのが面倒だったため正方形で作り始め、面倒だったため正方形のまま完成としました。以下「ボール」と言い張ります。
  • オリジナルに寄せる方向ではがんばってません。それっぽければヨシ。

リポジトリはこちら。効果音はパブリックドメインとします。何かに使えそうなら使ってください。

https://github.com/sonota88/dxopal-suikalike

DXOpal + 物理演算 → スイカゲーム

https://github.com/yhara/dxopal

DXOpal についてざっくり特徴を挙げると次のような感じでしょうか。

  • 手軽にゲームを作れるフレームワーク
  • 作ったゲームはブラウザで実行する
    • ここで Opal が使われる(Ruby のコードが JavaScript に変換されて実行される)
    • OS などの環境に依存せず同じように動かせる
    • ウェブで配信する形にすればダウンロードやインストールなしで使ってもらえる・遊んでもらえる・見てもらえる
    • 参考: 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 を使うとブラウザで動かせるゲームが手軽に作れて便利
  • スイカゲームみたいなのを作った

以下おまけです。

dxopal-demos

今回作ったものとは無関係ですが DXOpal 関連ということでご紹介です。
思いつきで書いてみた小物をときどき追加しているリポジトリです。アルゴリズムの解説とか見るとこういうの作りたくなりますよね。

https://github.com/sonota88/dxopal-demos


メタボール

image


Marching squares

image


連立方程式を解くやつ(ガウス・ジョルダンの消去法)

image


フーリエ変換

image

簡単なCPUシミュレータ

今回作ったものとは無関係ですが DXOpal 関連ということでご紹介です。

DXOpal は「ゲームを作るためのフレームワーク」という位置づけにはなっていますが、いわゆる普通のゲームを作る以外にも

  • Ruby でちょっとしたお絵描きやデータ可視化をしたい(特に動きのあるもの)
  • ついでにマウスやキーボードからの入力も扱ってインタラクティブにしたい
  • どうせなら音も出したい
  • 作ったものを手軽に他の人に見せたい、使ってもらいたい

という場合にサッと使えて重宝しています。

そのような「ゲームではないもの」の例として、以前簡単な CPU シミュレータを作ったことがありました。

  • 回路を描画して、
  • マウスクリックでスイッチを切り替えられて、
  • リレーが切り替わる時にカシャッと音が鳴る

というものです。

Ruby+DXOpalでリレー式論理回路シミュレータを自作して1bit CPUまで動かした

x00_1bit_cpu.gif

これ作るの結構楽しかったのでみなさんもぜひ! と言いたい気持ち。


以下の書籍にもゲーム以外のアプリケーションの例が載っています。参考までに。

今年 Ruby 関連で書いたもの

せっかくのアドベントカレンダーですので、今年書いたものを貼っておきます。

去年の

去年のアドベントカレンダーではこういうのを書いていました。

「世は大パーサー時代!」より数カ月早く書いてしまってタイミングを逃した(?)感がなくもないですが、パーサにご興味あればこちらもどうぞ!

Originally published at qiita.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

sonota486

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント