一个小例子 MySnowFlakes
-
主要原理:
-
通过 LFO 不停地去驱动下雪,每次飘落雪花的数量由 Repeat 控制;
-
每片雪花都是一个 MySnowFlake(Class)的实例,都存放在叫做 _mySnowFlakes 的 Spread 中;
-
当雪花超出范围时,将其从 _mySnowFlakes 中删去;
其他没啥太复杂的东西;开始学习的时候,我一直比较疑惑,添加一个可视元素,连上线就好了;删除一个可视元素,断开连线就好了,那么要如何动态删除呢?
-
-
@青-Joker 源文件在此 the-snowflakes3.vl
-
提一个小问题,当允许的雪花数量比较多时,运行一段时间之后会出现视野内没有雪花的情况;
没有经过严谨的测试,但是大概看了一下可能是由于RemoveAt
:- 当数量比较多时,容易出现同一计算周期内多个雪花触发超出区域的情况
- 当对一个数组根据索引同时删除多个元素时,常见的问题是前一个元素的删除引发索引更新,导致后续的删除对象错误,从而导致原本应该被删除的雪花仍然存在于 Spread 中,占据了容量
- 当所有容量被这些已经超出区域的雪花占满,就看不到雪花了;
- 由于在雪花类中超出区域使用了
TogEdge
,导致它们失去了再次被删除的可能——虽然删除还是会出错;
我的建议是:
- 在处理超出边界时没有必要使用
TogEdge
来触发,简单地使用一个状态变量可能是更安全的做法; - 不要在循环体内删除循环对象;
- 在处理
Spread
删除时可以通过Select
状态变量来实现
同样没有做严谨测试,只是稍微改一下示意
附修改程序:
the-snowflakes4.vl -
@lby 感谢你如此仔细的看了我的源文件,这样的氛围真好,能更快地帮助新手进步,多谢。
你提的这个问题,我在制作的时候也发现了;即使是少量的时候,运行时间长了,就发现 _mySnowFlakes 的数量和观察到的不一致了;一开始就我怀疑是 ForEach 中 remove 的问题;因为在 JS 中,在 ForEach 循环中删除元素,就会出现您说的索引的问题;所以在 JS 中,这种情况通常都是用 For 循环来代替 ForEach 就会避免出现这种问题(具体原因我也是一知半解)。
在 VVVV Gamma 中的 ForEach 看来是存在同样的问题的,你的解决方案的确是很好,学到了,非常感谢!
-
@青-Joker 客气客气
对于 JS 中删除多个数组元素,需要关注的问题可能是具体的删除动作是否操作原数组,通常我认为用新数组保存删除(筛选)结果是更方便的做法,比如
Array.filter
,vvvv 中的Select
可能与此类似;如果一定需要在原数组上做修改,可以使用for
循环倒序遍历