Processing by Ruby #2

(前回のあらすじ:http://d.hatena.ne.jp/dewdrop/20070506/p5r

この前のJRubyでProcessing動かすやつですが、あれ書いたその日にJRuby1.0.0RC1がリリースされてたらしくて(プロジェクトトップページは更新されてないのに!)、それ使ったら見事動きましたわーいわーい。

ちなみに、JRubyにもirbが付属してるんだけど、それ使うとProcessingのリアルタイム制御ができます。

この前のスクリプトの最後のところを次のような感じにちょっと変えといて、

# p5r.rb

...

JFrame = javax.swing.JFrame

def run applet
  frame = JFrame.new applet.class.to_s
  frame.content_pane.add applet
  frame.default_close_operation = JFrame::EXIT_ON_CLOSE
  applet.init
  frame.pack
  frame.visible = true
end

if $0 == __FILE__
  run Sketch.new
end

で、irbでロード。

> set CLASSPATH=%P5_HOME%\lib\core.jar
> jirb

irb(main):001:0> load "p5r.rb"
irb(main):002:0> applet = Sketch.new
irb(main):003:0> run applet

これでAppletが動き始める。そんで、このappletオブジェクトに対していろいろ操作することができます。

irb(main):004:0> applet.stop

stopで動きが止まる。

irb(main):005:0> applet.init

initでまた動き出す。みたいな。

ProcessingのAPIは全部appletオブジェクトのメソッドとして呼び出せる。入力に対してちゃんと反応してリアルタイムにAppletが変化していきます。

irb(main):006:0> applet.smooth
irb(main):007:0> applet.stroke_weight 5
irb(main):008:0> applet.stroke applet.color(255, 255, 255, 50)
irb(main):009:0> applet.background 100, 120, applet.random(100, 200)

Applet動かしたままdraw()メソッド丸ごと書き換えたりとか。

irb(main):010:0> class Sketch < PApplet
irb(main):011:0> def draw
irb(main):012:0> fill random(200, 255), random(200, 255), random(200, 255)
irb(main):013:0> stroke 255
irb(main):014:0> ellipse_mode CENTER
irb(main):015:0> size = PApplet.max(PApplet.abs(pmouseX - mouseX), PApplet.abs(pmouseY - mouseY))
irb(main):016:0> ellipse mouseX, mouseY, size, size
irb(main):017:0> end
irb(main):018:0> end

この最後の「end」を入力した瞬間に動いてるAppletの挙動ががらっと変わる。これはちょっとたのしい。さすがにこれ全部irb上で入力するのはめんどくさいのでファイルに書いてそれをloadしたりするほうがいいんだろうな。

いやー、JRubyおもしろいわー。

- - - -

[11/18 追記]

hysysk さんの Jython 版:
http://hysysk.blogspot.com/2007/11/jython-p51.html
http://hysysk.blogspot.com/2007/11/jython-p52.html