見出し画像

vvvv gamma入門 - 6

vvvv入門、6回目。今回はパッチ制作に欠かせないSpreadという概念とループ処理について学びます。

Spread

配列やListの様なものをまとめてCollectionと言います。
vvvvのCollectionにはSequence、Spread、Dictionary、HashSetがあります。
その中でもSpreadは一番良く使用するものです。
Spreadの一つひとつの要素をSliceと言います。
vvvv betaユーザーであればお馴染みのSpreadですがvvvv gammaでは扱いが少し変わっているので最初は戸惑うかもしれません。

Spreadを作るには予め用意されているRandomSpread等のノードを使用するか、Repeatノードを使います。

色々なSpreadノードの一例
Repeatノード

SpreadはC#等の他の言語のCollectionにはあまり見られない面白い仕組みがあります。
例えば、GetSliceノードを使用するとSpreadから指定したインデックスのSliceを取得できますが、この時Spreadの数より大きな値を指定できます。
大抵の言語では、要素数5の配列に対してインデックス7を指定するとエラーになりますが、GetSliceの場合はエラーにならず、5 % 7 = 2となり、インデックス2のSliceが取得できます。

GetSlice

Loops

Spreadを理解したところでいよいよループ処理を学びます。vvvvでループ処理を行うにはRepeatForEachを使います。

Repeat

Repeatは回数指定のループ処理です。
Repeatで検索するといくつか表示されますが、イタリック書体のRepeatがループ処理を行うRepeatです。

Repeat

Repeatのループ回数を指定するにはIteration Countピンに回数を指定します。Inspectorからも指定できます。InspectorはCtrl+Iで表示できます。

Iteration Count

Repeat RegionにはSplicerAccumulatorという2種類の入り口があります。

SplicerはSpreadを繋ぐことができ、1ループにつき1Sliceずつ処理します。台形のアイコンです。

Accumulatorは全回数分のループ処理を通して値を蓄積させることができます。菱形のアイコンです。
Accumulatorは全回数分のループ処理で必要になるので、Regionの入力側と出力側に2つ1組で置かれます。どちらかを削除するともう一方も消えます。任意の名前を付けることができます。

SplicerとAccumulatorは最初は結構混乱するかもしれません。理解できるまで実際に簡単なノードを組んで試してみると良いです。
SplicerとAccumulatorを通さずに、Reagionの外から直接ノードを繋ぐと、ループのすべての処理で同じ値を使用することになります。

色々なSplicerとAccumulatorの組み合わせ

ForEach

Repeatが分かってしまえばForEachも同じ様なものです。
違いは、ForEachにはIteration Countの設定がありません。Splicerに渡したSpreadのSlice数だけ処理が実行されます。

ForEach

複数のSpreadをSplicerに繋いだ場合、ループの実行回数はSlice数の少ない方になります。

特別なピン

ループのRegion内だけで使用できる特別なピンがあります。IndexBreakKeepです。
Index: ループのインデックス番号を取得できます。
Break: ループを抜ける条件を指定できます。
Keep: ループの出力として処理中のSliceを使用するかどうかを指定できます。

Index、Break、Keepの例

While…?

RepeatもForEachも一定の回数だけ処理をループします。他のプログラミング言語にはWhileというある条件を満たす間だけループを継続するという構文がありますが、vvvvの場合それはRepeatに非常に大きな値を設定することで実現するそうです。ち…力技すぎる…。あまりやりたく無いのでWhileは使わなくてもよいアルゴリズムを考えましょう。

以上、Spreadとループ処理でした!
また次回の記事でお会いしましょう!

もしこの記事があなたのお役に立てたなら幸いです。 よろしければサポートをお願いします。今後の制作資金にさせていただきます!