ピンボールを作りました

Colin Moock に日本の ActionScript を見せつける会で発表させて頂いた、ピンボールです。

Pinball - HotRuby - Ruby on JavaScript & Flash

その前の仕事のミーティングが早めに終わったので、アドビさんのオフィスに3時間前入りして、その場で作っていました(竹迫メソッド)。いや〜、だって、Box2DFlashAS3のサンプルそのままだったら芸がないもん。休憩室の自動販売機脇のコンセントを勝手にお借りしました。すいません。

ピンボールは、普通は何らかのキーを押して、フリップが動くんですが、Box2DFlashAS3を使っているので、あえて手動です(笑)。玉となる箱があるんですが、これも、あえて手動です。一番下の箱を、自分でドラッグして飛ばしてください。フリップを動かすのは、もう、大変です。必死に頑張ってください!

スライド:http://www.slideshare.net/yukoba/use-ruby-on-flash

HotRubyでBox2DFlashAS3が動いたよ!

前の日記(HotRuby - Ruby on JavaScript - yukobaのブログ)の続編です。

明日の発表(Colin Moock に日本の ActionScript を見せつける会 - yukobaのブログ)に向けて、改良しました。Box2DFlashAS3という物理演算のライブラリを動くようにしました。下のリンク先をクリックしてください。ドミノ倒しは物理法則に基づいて動いています。マウスでドラッグすると、物を動かすことができます。左右のカーソルキーでサンプルを選ぶことができます。

Box2DFlashAS3 - HotRuby - Ruby on JavaScript & Flash

今回やったこと:

  1. ActionScript 3 (Flex)に対応しました。
  2. $nativeという変数を導入しました。ホスト(ブラウザやFlash)の変数やメソッドを呼び出せます。$nativeが長いので、下記では変数 $n に代入して使っています。

Google code の Subversion にはあがっていますが、皆様がちゃんと使えるように、使い方のドキュメント書かないといけないですね。

こんな重そうな(CPUパワーを使う)サンプルですが、重い部分はネイティブ(ActionScript3)でやっているので、それを呼び出す側は Ruby で作っても、全く問題ありません!

HotRuby - Ruby on JavaScript

先日の木曜日、YLUGに参加しました。笹田耕一さんの YARV(Yet Another RubyVM) の講演会でした。なんか、会は、過去9年間の間で、1,2を争う盛り上がりだったそうで、すごく楽しかったです。参加者のレベルも高く、YARV の中の話を色々と聞かせていただきました。

その席で、ザイボウズ・ラボの竹迫さんに、「Ruby on JavaScript つくらないの?」とお誘いを受けたので、この週末、作ってみました♪

名づけて、HotRuby。ちゃんと動いているよ〜

http://hotruby.accelart.jp/

基本的な文法は、大体、実装しました。ただし、組み込み関数や組み込みクラスは、大部分が実装されていません。文法面でも、例外は実装していません。

仕組みは、一度、サーバーの Ruby 1.9.0 の YARV でオペコード列にコンパイルさせて、それを JSON でクライアント側に渡し、JavaScript 上の RubyVM で実行しています。つまり、RubyVM on JavaScript です。JSONJavaScriptソースコードで持っておくと速いのですが、どうしても<script type="text/ruby">を使いたかったので、毎回、サーバーにコンパイルさせています。でも、おかげでコードの最後の微調整は楽でした!

sum = ""
50000.times(|e| sum += e.to_str)

というベンチマークを動かしてみました。HotRuby@Opera9 で 6.767秒、Ruby 1.9.0 で 12.051秒と、Ruby(YARV)よりも 78% も速かったです!

でも、IEベンチマークはとらないでね (^^;;;;

まぁ、GUIを操作するだけに、そんなにCPUパワーはいらなく、複雑な処理はサーバー側で処理すればいいだけなので、十分だと思います。

http://hotruby.accelart.jp/test-web/diy.html で自分で Ruby のソースを貼り付けて、実行させることができます。HotRuby 自体は "Ruby License" です。「これが動かないよ!」とか「このメソッド実装したよ!」とかソースでいただけたら、嬉しいです!

クライアント側は、Array, Hash, String, Time などがちゃんと実装されていれば、あとは、そんなに組み込みクラスはいらなく、それよりも、DOM や ExtJS などの GUI ライブラリの Ruby ラッパーの方が重要です。

では、よいお年を〜♪