読者です 読者をやめる 読者になる 読者になる

ux00ff

ビールとプログラミングと

ProcessingのプログラムをIntelliJとScalaで開発する

さてScalaでProcessing書こうと思ったものの、あんまり情報がなかったのでまず環境周りのメモを書き残しておきます。(後日、sbt を用いた CUI開発に流れ着きました

ここでは前提として、IntelliJはインストール済みであるものとします。また、Processingは 3系が /Applications/Processing.app/ にインスール済みであるとします。

入手は以下からどうぞ。

新しくScalaのプロジェクトを作成する

作りましょう。

f:id:ux00ff:20170131210647p:plain

ここではプロジェクト名を processing_with_scala としています。

External Library として、Processing の core.jar を追加します。

core.jar は /Applications/Processing.app/Contents/Java/core.jar に存在すると思います。他の場所に Processing をインストールしている場合、Processing.app の中を探しましょう。

f:id:ux00ff:20170131210736p:plain

ひとまず、最低限の動作には core.jar だけあれば大丈夫です。Processing.app の中には OpenGLのライブラリも含まれていますが、ここでは利用しません。

f:id:ux00ff:20170131211048p:plain

メインクラスを作成する

「新しい Scala のクラスを作成する」しましょう。クラス名はとりあえず Main としています。クラス名に特に理由はありません。

f:id:ux00ff:20170131211103p:plain

以下のような簡単な実装をします。

import processing.core.PApplet

class App extends PApplet{
  override def draw(): Unit ={
    rect(width/2 - 5 , height/2 - 5 ,10 ,10)
  }
}

object Main {
  def main(x: Array[String]): Unit ={
    PApplet.main("App")
  }
}

実行時に Main クラスを指定して実行しましょう。すると、ウインドウの中央に 10x10 の四角形が描かれます。おめでとうございます。これで、Scalaで作成されたProcessingプログラムが実行されています。

ポイントは import processing.core.PApplet すること、PApplet を継承したクラスを作成して本体を作成すること、PApplet.main の引数として実行したい PApplet を継承したクラス名を渡している点です。PAppletについては Javadoc を参照するのが手っ取り早いでしょう。

PApplet を継承した App クラスの中は、普通の Processing のプログラミングと変わらないのでわかりやすいと思います。

定数クラスをインポートする

これはあってもなくても動きますがないと辛いので。

最初は JAVA2D とか RADIUS とかLEFT みたいな定数が見つからなくて、Processing の本体で println(LEFT) とかやって定数調べてました(ほんとです)。そのあたりは PConstants に定義されているので、そちらをインポートすることで解決します。

例えば、以下は画面の左上にマウスの座標を表示するだけのプログラムですが、いくつかの定数を利用しています。

import processing.core.PApplet
import processing.core.PConstants._

class App extends PApplet{

  override def settings(): Unit = {
    size(200,200, JAVA2D)
  }

  override def draw(): Unit ={
    background(0)
    textAlign(LEFT,TOP)
    text("%d, %d".format(mouseX,mouseY),0,0)
  }
}

object Main {
  def main(x: Array[String]): Unit ={
    PApplet.main("App")
  }
}

クラスファイルを直接実行する

最後にコマンドラインから実行させてみます。

以下のようにします。

java -cp "./:/Applications/Processing.app/Contents/Java/core.jar:${HOME}/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.1.jar" Main

少し長いですが、クラスパスに以下の三つを指定した上で、実行したいクラスの名前を渡しているだけです。

シンプルなものですが実行できました。

f:id:ux00ff:20170131214203p:plain

まとめ

ということで、これで IntelliJ の強力なコード補完機能と Scala の強力な言語機能を利用して Processing の開発を行うことができます。ブレークポイント貼ってステップ実行できるだけでもだいぶ使いやすい。よかったよかった。

以下多大に参考にしました。