ProcessingをIntelliJ+Kotlin+Gradleで開発する

Processingのエディタ使いにくいし、Javaもどきが微妙に気持ち悪いし、
どうせならKotlinで書きたいし、Gradleで管理したいよねって趣旨。



## Java8をインストールする

ProcessingがJava9以上だと動かないため
https://github.com/processing/processing/wiki/Supported-Platforms#user-content-java-versions

```
$ brew cask reinstall caskroom/versions/zulu8
```

```
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    10.0.2, x86_64:	"Java SE 10.0.2"	/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
    1.8.0_222-zulu-8.40.0.25, x86_64:	"Zulu 8"	/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
```



## 新しいプロジェクトを作成

<img width="986" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/ef009a02-fe90-63a9-174c-c671853e6686.png">

Gradle を選択し、 Java と Kotlin にチェックを付けます。

`Project SDK` はさっきインストールした `1.8` を指定してください。


あとは道なりに



## GradleにProcessingを追加

```gradle:build.gradle
dependencies {
    compile group: 'org.processing', name: 'core', version: '3.3.7'
}
```

`build.gradle` を開き
`dependencies` の中に `processing` を追加します。

するとダウンロードが開始されます。
ダウンロードが完了したら、 `External Libraries` に `org.processing:core` が追加されていればＯＫです。


## プログラムを作成

`src/main/kotlin` に新しいKotlinファイルを作成します。

<img width="953" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/689e94f2-6485-15c9-641e-32c58a8d000c.png">

ファイル名は `Main.tk` にしました。

```kotlin:src/main/kotlin/Main.tk
import processing.core.*

class Main : PApplet () {
    fun run() {
        return PApplet.main(Main::class.java.simpleName)
    }
}

fun main() : Unit = Main().run()
```

Processing実行に必要な部分のみを記述した超シンプルな状態です。



## 実行してみる

`fun main()` の隣に表示される三角形から `Run MainKt` を実行してください。

<img width="568" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/3e709b1b-bf34-dfba-e9ba-527c33900cc8.png">

実行されると、

<img width="240" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/f0c36b2a-3b39-5c04-dc5e-90b256b9f4e4.png">

空のProcessingアプリが実行されました。



## Kotlinで実装してみる

Processing公式の中にあるExamplesの**Follow 3**を試しにKotlinで実装してみます。
https://processing.org/examples/follow3.html

```kotlin:src/main/kotlin/Main.tk
import processing.core.*

class Main : PApplet () {
    var x = FloatArray(20)
    var y = FloatArray(20)
    var segLength = 18

    override fun settings() {
        size(640, 360)
    }

    override fun setup() {
        strokeWeight(9F)
        stroke(255F, 100F)
    }

    override fun draw() {
        background(0f)
        dragSegment(0, mouseX.toFloat(), mouseY.toFloat())
        for (i in 0 until x.size - 1) {
            dragSegment(i + 1, x[i], y[i])
        }
    }

    private fun dragSegment(i: Int, xin: Float, yin: Float) {
        val dx = xin - x[i]
        val dy = yin - y[i]
        val angle = PApplet.atan2(dy, dx)
        x[i] = xin - PApplet.cos(angle) * segLength
        y[i] = yin - PApplet.sin(angle) * segLength
        segment(x[i], y[i], angle)
    }

    private fun segment(x: Float, y: Float, a: Float) {
        pushMatrix()
        translate(x, y)
        rotate(a)
        line(0F, 0F, segLength.toFloat(), 0F)
        popMatrix()
    }

    fun run() {
        return PApplet.main(Main::class.java.simpleName)
    }
}

fun main() : Unit = Main().run()
```

これを実行すると

<img width="752" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/eac8a9c0-189e-a6af-36eb-e846278d254b.png">

Processingが無事に動作しているのが確認できます。



## ライブラリーを追加する

gradleに記述すると

```gradle:build.gradle
repositories {
    mavenCentral()
    maven { url "https://clojars.org/repo" }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.processing', name: 'core', version: '3.3.7'
    compile group: 'ddf.minim', name: 'ddf.minim', version: '2.2.0'
    compile group: 'controlp5', name: 'controlp5', version: '2.2.4'
    compile group: 'de.sojamo', name: 'oscp5', version: '0.9.8'
}
```

mavenCentral には `oscp5` と `controlp5` がなかったため、 `clojars.org` を repositories に追加しました。



## おわり

これで戦える。