12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RubyAdvent Calendar 2023

Day 6

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

Last updated at Posted at 2023-12-05

image.png

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

できたもの

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

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

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

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

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

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

  • 手軽にゲームを作れるフレームワーク
  • DXRuby のブラウザ向け移植
    • API に互換性があり、仕組み上しかたないもの以外は DXRuby に合わせるみたいな方針だと思います
  • 作ったゲームはブラウザで実行する
    • ここで Opal が使われる(Ruby のコードが JavaScript に変換されて実行される)
    • OS などの環境に依存せず同じように動かせる
    • ウェブで公開する形にすればダウンロードやインストールなしで使ってもらえる・遊んでもらえる・見てもらえる

入門用のドキュメントとしては以下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 本体に手を入れなくて済むので今回はこの方式にしました。

事前コンパイル

今回は事前コンパイルする方式で開発を進めました。以下の記事を参照してください。

まとめ

  • DXOpal を使うとブラウザで動かせるゲームが手軽に作れて便利
  • スイカゲームみたいなのを作った

以下おまけです。

dxopal-demos

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


メタボール

Peek 2022-07-24 12-42_metaball.gif


Marching squares

Peek 2022-08-13 15-06_marching-sq.gif


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

Peek 2023-10-01 14-13_gaus_jordan.gif


フーリエ変換

Peek 2023-11-12 13-58_ft.gif

簡単なCPUシミュレータ

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

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

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

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

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

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

というものです。

x00_1bit_cpu.gif

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


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

今年 Ruby 関連で書いたもの

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

去年の

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

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

12
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?