こんどはcontrolP5
先の_whyさんのshoesがやっぱりいろいろと大変なので結局jruby+p5にもどってくることに。この前カメラ動画の取り込みやらマイク入力音声の波形表示に成功しているのでおそらくいけるだろうと期待して。ちなみにいろんなとこで使われてるControlP5というp5ライブラリを使います。こんなかんじで。
require 'java' include_class "processing.core.PApplet" include_class "controlP5.ControlP5" class Sketch < PApplet def setup @val = 1 @bg = color(128,128,128) size(360,240) @ctrl = ControlP5.new(self) button = @ctrl.add_button("push",10,0,0,80,20) sl = @ctrl.add_slider("sliderValue",0,255,40,40,100,10) end def draw background(@bg) end def button(val) puts val end def slider(v) @bg = v puts v end end JFrame = javax.swing.JFrame def run applet applet.init frame = JFrame.new applet.class.to_s frame.content_pane.add applet frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.pack frame.visible = true end if $0 == __FILE__ app = Sketch.new run app end
無事にレンダリング成功! しかしながらbuttonを定義してそのクリックイベントのコールバックを受け取るbuttonメソッド、sliderメソッドが動かなかった。class.methodsで見てみたけどちゃんと定義はされてた。なんでだろう?
jrubyの不思議なとこ
これを通してjrubyのなんでそうなるんだ的なことが出て来たのでメモ。
まずひとつめ。
#OK def mouseClicked puts "agagaga" end #ダメ #def mouse_clicked # puts "eaeaeaea" #end
↑のソースのSketchクラスにこんなメソッドを書いてみる。もちろんSketchクラスにはmouseClickedメソッドとmouse_clickedがオーバーライドした形になって定義されている。この状態だとmouseClickedは動作するがmouse_clickedは動作しない。たぶん↑のbuttonやらsliderメソッドが動かなかったのもイベントリスナーぽい関数が呼ばれるときにこういうメソッド名の問題がひょっとしたらあるのかもなと。
ふたつめ。
javax.swingを呼ぶのにもっとかっこいいほうがいいと思って
JFrame.new(applet.class.to_s).instance_eval do content_pane.add applet default_close_operation = JFrame::EXIT_ON_CLOSE pack visible = true end
としたらpackあたりで怒られた。なんでだよー↑とかわんねーじゃんよーと思ったけどまともにswingを使ったことがないので、これはjrubyというよりもswingの使い方なのかも。けどpack呼ぶとこまでは大丈夫っぽいんだよなー
ちなみにgroovyでも試した
じゃあってんでgroovyで同じことに挑戦した。
import groovy.swing.SwingBuilder
import processing.core.PApplet
import controlP5.*class Sketch extends PApplet{
/*def setup(){
println "setup"
size(360,240)
ctrl = new ControlP5(this)
ctrl.addButton("button",10,0,0,80,20)
}
def draw(){
background(100)
}*/
}Sketch.metaClass.setup = {
println "setup"
size(360,240)
ctrl = new ControlP5(this)
ctrl.addButton("button",10,0,0,80,20)
}Sketch.metaClass.draw = {
println
background(100)
}
こんなふうにして定義してみたけどsetup()もdraw()も呼べないんだよなー クラス内定義もmetaClassを使った定義も試してみたんだけど・・
app = new Sketch()
app.class.methods.each{
println it.name
}
これでメソッドも見てみたけど、ちゃんといるよな。なんでだろう・・?
追記(2007-08-09)
わたくしのグルよりgroovyでいけそうなヒントをいただいたので、groovyでいくかも!!