ScalaでProcessingを使う

昔はSpdeとかいうのがあったっぽいのですが、今ProcessingをScalaから使おうと思うと、普通にライブラリっぽい感じでimportしてあげる必要があるみたい。

1.まず、
processing-3.x.x/core/library/core.jar
Processingのフォルダの中にある、core.jarをExternal Librariesの中にコピーしてあげて、import文をちょっと書いてあげる。

2.シングルトンオブジェクトを普通に作って、def mainの中でPApplet.main(Array[String)(“クラス名”)
として、適当に作ったクラス名を呼び出してあげる。

3.クラスを作って、settings()と、setup()と、draw()をオーバーライドする。
settingsにはレンダラの指定だけしてあげる。
レンダラも、FX2Dみたいな短縮名が定義されていないので、レンダラの指定は
JAVA2D なら “processing.awt.PGraphicsJava2D”
P2D なら “processing.opengl.PGraphics2D”
P3D なら “processing.opengl.PGraphics3D”

としてやってあげるか、PConstants.FX2Dのように定義されているクラスを指定して呼び出してあげるようにすればOK。
下記のソースは、

Processing from Java and Scala, 3-steps tutorial (2016)


このサイトを参考にさせて貰って、fullScreenでFX2Dモードのレンダラを使えるようにちょっとだけ書き換えました。
深く考えずにテンプレとして使って良いと思います。

[code lang=”scala”]

import processing.core._
object Composing {
def main(args: Array[String]) {
PApplet.main(Array[String]("ScalaProcessingExample"))
}
}

class ScalaProcessingExample extends PApplet {
override def settings() {
fullScreen("processing.javafx.PGraphicsFX2D")

}

override def setup() {
background(0)
smooth()
}

override def draw() {
stroke(255)
if (mousePressed) {
line(mouseX, mouseY, pmouseX, pmouseY)

}
}
}[/code]

別のクラスを作って、その中でProcessingのメソッドを使いたい場合には

[code lang=”scala”]
import processing.core._
object Composing {
def main(args: Array[String]) {
PApplet.main(Array[String]("ScalaProcessingExample"))
}
}

class ScalaProcessingExample extends PApplet {

override def settings() {
fullScreen("processing.javafx.PGraphicsFX2D")

}

override def setup() {
background(0)
}

override def draw() {
stroke(255)

val b = new Balls(10,10)
b.dispBall()
}

class Balls(var x: Float,var y: Float ) {

def dispBall(){
ellipse(100,100,50,50)
}

}
}
[/code]

こんな感じに、PAppletを継承したクラス内にクラス内クラスとして作成する必要があるみたい。
別のclassファイルを作って、そこでPAppletを継承した別のクラスを作って呼び出してもエラーが起きてしまうので注意。

ただ、僕はまだモナドをあんまりちゃんと理解できないので、scalaで使えるようになってもこの手のオブジェクトの中身はvarだらけになるだろうし、状態も持ちまくりだしで、しばらくは「ちょっと便利なprocessing」的なノリを脱せない感…。

勉強せねば。