P5.js draw()函数以错误的顺序执行循环

时间:2019-05-17 06:56:01

标签: javascript html p5.js

因此,我一直在思考为什么现在不能使用数小时……我想要实现的实际上是通过2D数组对行进行“传播”。基本上,将数组的第一行设置为随机值,然后将该行复制到第二行,然后第一行再次填充随机值-重复此操作,直到该行到达数组的末尾。这是一个视觉示例:

[0, 0, 0]
[1, 1, 1]
[2, 2, 2]
    |
[3, 7, 2]
[0, 0, 0]
[1, 1, 1]
    |
[5, 6, 8]
[3, 7, 2]
[0, 0, 0]
    |
And so on...

在Python中,通过在新值注入第0行之前创建一个与原始数组相等的temp数组,可以很容易地做到这一点。然后,将数组的每一行设置为temp数组的当前索引-1,从而有效地将每一行向上移动一位。

但是,在JavaScript中,尤其是在 p5js 中,我似乎根本无法正常工作。在draw()函数中执行for循环时,好像一切要么异步完成,要么未按照我期望的顺序执行。这是我的代码:

var arr = [], temp = [];

function setup() {
  noLoop();
  arr[0] = [0,0,0];
  arr[1] = [1,1,1];
  arr[2] = [2,2,2];

}

function draw(){
    for(let k = 0; k < 3; k++){
      temp[k] = arr[k];
    }
    console.table(arr);

    for(let i = 0; i < 3; i++){
       arr[0][i] = random(10)
    }
    console.table(arr);

    arr[1] = temp[0];
    arr[2] = temp[1];
    console.table(arr);
}

我知道我可以在循环中使用更多,但是现在我使用了一些单独的索引使其更加基础。

请注意console.table(arr)语句的位置-我觉得这段代码按照我编写的顺序执行,但是每个console语句都会生成相同的表,就像此外,即使我将temp设置为arr,但在以任何方式修改arr之前,都会为temp分配arr的值,然后再设置随机值。

连续循环时,这会产生并用相同的随机数填充数组,因为它依赖于临时存储未修改版本的arr ...

也许这里缺少一些明显的东西,或者我只是不知道JavaScript / p5.js的工作方式,但是任何帮助将不胜感激!

谢谢:)。

1 个答案:

答案 0 :(得分:0)

temp[k] = arr[k];通过引用复制数组对象,这意味着修改其中一个子数组将修改另一个子数组,因此arr[0][i] = random(10)修改了两个数组中的两个内容。可以通过先执行arr[0] = [];来解决此问题。 (如果我没记错的话,这与Python中的一样)

在常规JS中,console.log以及其他日志记录功能不会立即获取对象的内容,而是获取需要显示的部分,从而仅显示对象的最后状态。宾语。 chrome devtools应该显示一个小小的警告。

一种更好,更有效的方法来完成整个操作是

let temp = [];
for (let i = 0; i < 3; i++) temp.push(random(10));
arr.unshift(temp);
arr.pop();