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はC#等の他の言語のCollectionにはあまり見られない面白い仕組みがあります。
例えば、GetSliceノードを使用するとSpreadから指定したインデックスのSliceを取得できますが、この時Spreadの数より大きな値を指定できます。
大抵の言語では、要素数5の配列に対してインデックス7を指定するとエラーになりますが、GetSliceの場合はエラーにならず、5 % 7 = 2となり、インデックス2のSliceが取得できます。
Loops
Spreadを理解したところでいよいよループ処理を学びます。vvvvでループ処理を行うにはRepeatかForEachを使います。
Repeat
Repeatは回数指定のループ処理です。
Repeatで検索するといくつか表示されますが、イタリック書体のRepeatがループ処理を行うRepeatです。
Repeatのループ回数を指定するにはIteration Countピンに回数を指定します。Inspectorからも指定できます。InspectorはCtrl+Iで表示できます。
Repeat RegionにはSplicerとAccumulatorという2種類の入り口があります。
SplicerはSpreadを繋ぐことができ、1ループにつき1Sliceずつ処理します。台形のアイコンです。
Accumulatorは全回数分のループ処理を通して値を蓄積させることができます。菱形のアイコンです。
Accumulatorは全回数分のループ処理で必要になるので、Regionの入力側と出力側に2つ1組で置かれます。どちらかを削除するともう一方も消えます。任意の名前を付けることができます。
SplicerとAccumulatorは最初は結構混乱するかもしれません。理解できるまで実際に簡単なノードを組んで試してみると良いです。
SplicerとAccumulatorを通さずに、Reagionの外から直接ノードを繋ぐと、ループのすべての処理で同じ値を使用することになります。
ForEach
Repeatが分かってしまえばForEachも同じ様なものです。
違いは、ForEachにはIteration Countの設定がありません。Splicerに渡したSpreadのSlice数だけ処理が実行されます。
複数のSpreadをSplicerに繋いだ場合、ループの実行回数はSlice数の少ない方になります。
特別なピン
ループのRegion内だけで使用できる特別なピンがあります。Index、Break、Keepです。
Index: ループのインデックス番号を取得できます。
Break: ループを抜ける条件を指定できます。
Keep: ループの出力として処理中のSliceを使用するかどうかを指定できます。
While…?
RepeatもForEachも一定の回数だけ処理をループします。他のプログラミング言語にはWhileというある条件を満たす間だけループを継続するという構文がありますが、vvvvの場合それはRepeatに非常に大きな値を設定することで実現するそうです。ち…力技すぎる…。あまりやりたく無いのでWhileは使わなくてもよいアルゴリズムを考えましょう。
以上、Spreadとループ処理でした!
また次回の記事でお会いしましょう!
もしこの記事があなたのお役に立てたなら幸いです。 よろしければサポートをお願いします。今後の制作資金にさせていただきます!