上記記事の続きです。
前の記事で、gg がなんとなくProcessingっぽく使えると書きました。
似ているなら寄せてしまえばいいんじゃないかと思い、openFrameworksとEbitengineのソースを参考にしつつ、ProcessingのAPI設計に寄せたAPIを作ってみました。
cc (cc4v) はまだまだ開発中なので、今後APIが変わっていく可能性がありますが、Processing風の使い方と、openFrameworks風の使い方の二種類を用意しています。
どんなAPIがあるかは docs/coverage.md を見てもらうとわかりますが、Processing風のHello Worldは以下になります。
ggに比べて、だいぶ簡単になったことがわかるんじゃないかなと思います。(参考: ggのminimal example)
(※ draw関数がなぜ draw() ではなく draw(_ voidptr) なのかは、記事を最後まで読めばわかります。)
さらに、円を表示するサンプルは次のようになります。
cc (cc4v) では、すべてを cc.xxx() とシンプルに書けるようにちょっとしたトリックを使っていて、隠された動作が極力ないようにする(= 可読性を最優先する)V言語の哲学とは若干背反してしまっているのですが、gg の覚えにくい部分を極力排除するには仕方ないかなと思っています。
ちなみに、cc (cc4v) は、openFrameworks(およびEbitengine)のソースコードを基本的に参考にしていて、ProcessingはAPI Referenceにできるだけ互換性を保つようにしているだけで、fill() no_fill() などの哲学はopenFrameworksに寄っています。
※ MPL-2.0ライセンスで公開しているのは、Processingコミュニティへの敬意です。コードベースはあくまでopenFrameworks / Ebitengine 準拠です。
先程はProcessing風のAPIでしたが、一応openFrameworks風のものも用意しているのでご紹介します。
このサンプルでは、毎フレームごとに count が追加されていくものになっています。
実は現時点でまだすべての関数 (例えば windowResized) を実装しているわけではないのですが、 on_event(event &gg.Event) が存在するので、gg の examples を参考に好きなイベントをトリガーすることができますし、cc (cc4v) は gg のラッパーでしかないので、以下のように gg を直接呼び出すこともできます。
cc (cc4v) では、EbitengineのようなIsKeyJustPressed 風のAPIも利便性のために用意しています。
cc4vでもProcessingやopenFrameworksのように key_pressed や mouse_pressed などのコールバックを定義できるようにしているものの、V言語はGo言語とよく似ていて、コールバックが多いとコードが多くなる傾向があって、個人的にはこちらのほうが簡単です。
これにより、記述量を減らしながらやりたいことをスクラッチでサッと書くということができるかなと思います。
最後に、V言語は実はデフォルトではグローバル変数が使えなくて、-enable-globals オプションを有効にすることで使えるようになるのですが、ユーザが自由に選べるように、グローバル変数を使わなくても良いようにする工夫をしています。1
ちなみにこれはProcessing風APIだけで、openFrameworks風APIの場合は、openFrameworksでもそうであるように、Appに直接変数を定義すればOKです。
※ 冒頭部にちょっと書いていた、draw関数がなぜ draw() ではなく draw(_ voidptr) (voidptrは汎用ポインタ)だったのかはこのためで、V言語ではポインタの型(参照型)は関数呼び出し時にキャストされるという性質を使っています。
この書き方が面倒に感じる場合は、オプションでグローバル変数を有効化して使っていただいても構いません。
今回はだいぶ早足でしたが、gg をよりProcessingやopenFrameworksっぽく使う方法をご紹介しました。
V言語はC言語にトランスパイルされるので、openFrameworks並に高速で動作し、C/C++のAPIも簡単にラップまたは変換することができ、それでありながらProcessingのようにメモリ管理などをあまり気にすることなく、やりたいことを書くことに専念することができます。2
個人的には夢のような言語だなと感じているのですが、まだアーリーステージであることから、ggやV言語の仕様も年々変更されていく可能性があり、安定していないので、あくまでホビーユースで楽しんでもらえるといいかなと思います。
ちなみに cc (cc4v) は MPL-2.0 ライセンスで公開しています(exampleの利用等には一部例外規定を設けています)。PR (Pull Request) などは随時歓迎しています。
今後、3Dやシェーダーなどに関しても便利な関数を追加していければと思っていますが、時間があるときに少しずつ拡充しているのであまり期待しないでもらえればとは思います。
gg 自体、ラップせずとも十分にコードが書きやすいAPI設計だと感じているので、ライセンス等気にせず好きに書きたい方は直接 gg を使うのも楽しいと思います。