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