0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

V言語のggでProcessingっぽく遊ぶ (2) ― cc4vの紹介

Last updated at Posted at 2025-10-04

上記記事の続きです。

ggをさらにProcessingっぽくしてみる

前の記事で、gg がなんとなくProcessingっぽく使えると書きました。

似ているなら寄せてしまえばいいんじゃないかと思い、openFrameworksEbitengineのソースを参考にしつつ、ProcessingのAPI設計に寄せたAPIを作ってみました。

Hello World (Processing風)

cc (cc4v) はまだまだ開発中なので、今後APIが変わっていく可能性がありますが、Processing風の使い方と、openFrameworks風の使い方の二種類を用意しています。

どんなAPIがあるかは docs/coverage.md を見てもらうとわかりますが、Processing風のHello Worldは以下になります。

スクリーンショット 2025-10-04 12.06.31.png

ggに比べて、だいぶ簡単になったことがわかるんじゃないかなと思います。(参考: ggのminimal example

(※ draw関数がなぜ draw() ではなく draw(_ voidptr) なのかは、記事を最後まで読めばわかります。)

さらに、円を表示するサンプルは次のようになります。

スクリーンショット 2025-10-04 12.06.48.png

cc (cc4v) では、すべてを cc.xxx() とシンプルに書けるようにちょっとしたトリックを使っていて、隠された動作が極力ないようにする(= 可読性を最優先する)V言語の哲学とは若干背反してしまっているのですが、gg の覚えにくい部分を極力排除するには仕方ないかなと思っています。

ちなみに、cc (cc4v) は、openFrameworks(およびEbitengine)のソースコードを基本的に参考にしていて、ProcessingはAPI Referenceにできるだけ互換性を保つようにしているだけで、fill() no_fill() などの哲学はopenFrameworksに寄っています。

※ MPL-2.0ライセンスで公開しているのは、Processingコミュニティへの敬意です。コードベースはあくまでopenFrameworks / Ebitengine 準拠です。

openFrameworks風に使う

先程はProcessing風のAPIでしたが、一応openFrameworks風のものも用意しているのでご紹介します。

スクリーンショット 2025-10-04 12.10.12.png

このサンプルでは、毎フレームごとに count が追加されていくものになっています。

実は現時点でまだすべての関数 (例えば windowResized) を実装しているわけではないのですが、 on_event(event &gg.Event) が存在するので、gg の examples を参考に好きなイベントをトリガーすることができますし、cc (cc4v) は gg のラッパーでしかないので、以下のように gg を直接呼び出すこともできます。

スクリーンショット 2025-10-04 13.11.39f.png

Ebitengine風の just_pressed

cc (cc4v) では、EbitengineのようなIsKeyJustPressed 風のAPIも利便性のために用意しています。

cc4vでもProcessingやopenFrameworksのように key_pressedmouse_pressed などのコールバックを定義できるようにしているものの、V言語はGo言語とよく似ていて、コールバックが多いとコードが多くなる傾向があって、個人的にはこちらのほうが簡単です。

スクリーンショット 2025-10-04 12.18.48.png

これにより、記述量を減らしながらやりたいことをスクラッチでサッと書くということができるかなと思います。

グローバル変数っぽいものの扱い

最後に、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 を使うのも楽しいと思います。

  1. お気づきの方もいるかもしれませんが、cc 自体、内部でグローバル変数の "ようなもの" を使っているおかげで簡便に書けるようにしていて、グローバル変数オプション (-enable-globals) を使わなくても良いトリックを使っているので通常時でも問題なく利用できます。(トリックと言っても、言語仕様に即しているので心配はありませんが、今後のV言語の動向には注意が必要かもしれません。)

  2. 余談として、Nelua など、最近この系統の言語が増えている気がする。若干乱立気味な感は否めないけれど、いずれはどれかに人気が集まるのだろうか…?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?