» cn.Tutorial Spreads
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

cn.Tutorial Spreads

English | French | Russian | Spanish | Japanese | Italian | Korean

下列指导课假定你已经完成了 教程3 - „属性检查器”?.

铺展数据

如果有一天你决定接受挑战,要参加期末考试成为vvvv编程高手,你最好能理解铺展(spread)的易用性。仔细阅读,你就会喜欢上它的。因为:

在几乎所有的情况下,当你要处理多个实例数据,无论它是值,颜色,文件,纹理,几何形...你都可以以铺展的方式来思考,从而使得你的程序相当简洁。

片段的铺展

首先,铺展一词其实就是指一张表,并没有什么玄机。一张任意的数据表,可以是数值, 字符串, 颜色,... 如此一张表中的一项我们就称之为一个 片段(Slice)

你已经知道,每一个节点的引脚总是具备vvvv的数据类型之一(即数值,字符串,颜色,枚举,结点等)。到目前为止还没有提到就是每一个引脚并不一定只有它指称的数据的一个实例,有可能一整张数据表。

铺展生成器

你可以通过悬停鼠标在引脚上来看它有多少分段。创建一个 LinearSpread (Spreads) 结点,然后鼠标悬停在它的输出引脚上。好,现在将结点的 SpreadCount 设成5,再次悬停,请注意输出值后面的 (5) 。

提示栏就是要让你相信其实里面有5个片段,但只显示了一个给你。 还有令人高兴的事,假定你有不是5个而是9874个片段,你肯定不乐意它们都出现在提示栏里,肯定有什么办法能一下子看到电子表里所有片段。还记得我们上节课里的内容吗?

当我们在属性检查器里观察一个结点时,按引脚左面的小箭头可以看到整张数据表。

就像 LinearSpread (Spreads) 结点,还有其它一些结点能够产生铺展。如果你现在就很好奇,可以快速过一遍 CircularSpread (Spreads)RandomSpread (Spreads)I (Spreads)helppatches

应用铺展

深入思考一下,我们现在有个具有5个片段的引脚,它如果被接到一个节点的输入上,那个结点会如何处理这个铺展呢。为了看看发生了什么,我们需要创建一个 Renderer (GDI) 和一个连到渲染器上的 Point (GDI) 。这会在 Renderer (GDI)的中央产生一个 + (就是,通过 Point (GDI)上的输入引脚XY ) 。现在将 LinearSpread (Spreads) 的输出连到 Point (GDI)X 输入引脚上,然后你就往后靠靠吧。

你看到的是聪明的 Point (GDI) 结点是如何处理铺展的。它就是简简单单地画出不是一个而是五个+,因为它接收到了5个描绘+的坐标值。显而易见,是吗?如果你是一个点,你会怎么做?嗯,如果你把一个铺展连上一个不同的计数值会怎样呢?复制一个 LinearSpread (Spreads) 并将它的SpreadCount设到2,然后连到 Point (GDI) 的输入引脚,看看它的反应。

得到了什么? Point (GDI)X 输入引脚上得到了5,Y 输入引脚上得到了2。它是这样做的:

  • 在画第一个+时,它取X引脚的第一个片段和Y引脚的第一个片段
  • 在画第二个+时,它取X引脚的第二个片段和Y引脚的第二个片段
  • 在画第三个+时,它取X引脚的第三个片段,而由于Y引脚的没有第三个片段,它就简单地再取第一个片段
  • ...

事情就是这样。每个结点都是这样处理它的输入值的,如果输入值理解铺展。如果不理解,那么只保留第一个,其它的都舍弃了。要了解一个引脚是否理解铺展,在属性观察器中查看,名字左边的>或>>表示它能理解铺展。

存取单个的片段

如果处置恰当,大部分情况下你不需要与单个的片段打交道,因为计划所有结点天生都能处理铺展。但肯定有理由需要存取单个的片段,假定我们已经有了这么一个理由,我们需要单独手工处理从我们的第一个 LinearSpread (Spreads) 里出来的第三个片段,我们就要插入 SetSlice (Spreads) 结点,如下所示。

结点 SetSlice (Spreads)的最右边的输入告诉结点我们要改哪一个片段。由于片段都是从0开始计数的,我们要改变第三个就要在这里输入2,第二个输入引脚是片段的新值,改变这个值,注意第三个+在其它+之外独立移动了。

你可能会说这很棒啊,但请你看看这个:

通过结点 I (Spreads) 我们告诉 SetSlice (Spreads) ,我们不是要处理第三个片段,还要处理第一个到第三个之间的所有片段。通过另一个 LinearSpread (Spreads) ,我们创建了这3个值...

等等,因此,无论何时你认为玩不转了,铺展就可信手拈来以发挥作用。

更多的实验

现在,你可能还想看看 GetSlice (Spreads)Stallone (Spreads)Queue (Spreads)Cons (Spreads)helppatches

教程将继续深入,告诉你更多关于 教程5 - „IOBoxes”?的你应该了解的信息。

anonymous user login

Shoutbox

~4h ago

microdee: @fibo: vvvv is delphi in its core, it just interacts with .NET with com visible objects under the hood. VL on the other hand...

~1d ago

drupal_admin: hello. maintenance reboot at 1am. save your work. back in a few minutes

~1d ago

fibo: lol now AWS Lambda supports C# ... does it mean we will see vvvv cloud version?

~2d ago

joreg: @pdubost great, i'd love to see this in our gallery 24

~3d ago

skyliner: @pdubost: vvvvery good!

~3d ago

gerrit: Any recommendations for interesting / exciting booths at IAA? Any good media installations? Somebody made something with vvvv? Thx

~3d ago

microdee: @matka: nope because the SD card got full and we never received an empty one :(

~3d ago

matka: Do we have recordings of the second part of PBR Rendering workshop at NODE17?

~5d ago

pdubost: latest personal project thanks devs and @mrvux for Box2d :) https://vimeo.com/233756367