p5.js 实例模式:无法读取 属性 未定义的“0”

p5.js Instance Mode: Cannot read property '0' of undefined

我在全局模式下有一个完美运行的草图,现在我将它带到另一个实例模式下的文档中,因为它与 3D/WEBGL 草图并排放置。

每当我单击以推送 Pulse() 的新实例时,我都会从 draw() 中的 for() 循环中得到 return 中的 "Cannot read property '0' of undefined"。正如我所说,它在全局模式下完美运行,所以我肯定只是这里的语法错误,但我找不到任何在 p5 实例模式下使用对象的示例。我不知道为什么它不能从数组中读取,或者为什么它不能推送。

在 p5.js 实例模式下推送到对象数组时,我非常不确定语法。我也尝试了 s.pulses.push(new s.Pulse()) 和 s.pulses.s.push(new s.Pulse()) 的变体,但是这些 returned 推送错误。下面的代码似乎在推送,但无法读取数组。

任何帮助都将非常有用,谢谢。

var twoDee = function(s) {
var cnv;
var cnvWidth, cnvHeight;
var pulsesAmount;
var pulses = [];

s.setup = function() {
    s.cnvWidth = s.windowWidth;
    s.cnvHeight = document.getElementById('sketch-wrap-bleed-bottom').offsetHeight;
    s.cnv = s.createCanvas(s.cnvWidth, s.cnvHeight, s.P2D);
    s.cnv.parent("sketch-wrap-bleed-bottom");
    s.pulsesAmount = 0;
}

s.draw = function() {
    s.background(40);
    for (var i = 0; i < s.pulsesAmount; i++) {
        s.pulses[i].move(); // problem here
        s.pulses[i].display();
    }

    s.noFill();
    s.stroke(255);
    s.ellipse(s.mouseX, s.mouseY, 30, 30);
}

s.Pulse = function() {
    this.size = 20;
    this.grow = 0.5;
    this.xPos = s.width/2 + 200;
    this.yPos = s.height/2;
    this.opacity = 255;

    this.move = function() {
        this.size += this.grow;
        this.opacity = map(this.size, 0, 60, 255, 0);
    }

    this.display = function() {
        s.noFill();
        s.strokeWeight(2);
        s.stroke(242, 202, 102, this.opacity);
        s.translate(this.xPos, this.yPos);
        s.ellipse(0, 0, this.size, this.size);
        s.translate(-this.xPos, -this.yPos);
    }
}

s.mousePressed = function() {
    s.pulsesAmount += 1;
    s.pulses = s.push(new s.Pulse());
}

}

您只需要对来自 P5.js 的内容使用 s 变量,例如 mouseXsetup() 函数。

对于您声明的内容,例如 pulsespulsesAmount 变量,您不使用 s 变量。所以你的 for 循环应该是这样的:

for (var i = 0; i < pulsesAmount; i++) {
    pulses[i].move();
    pulses[i].display();
}

编辑: 在你解决了那个问题之后,你还有另一个问题。这行没有意义:

pulses = s.push(new Pulse());

请参考 the P5.js reference 以更好地理解 push() 函数的作用。它与数组无关。

您可能会想到 append() 函数,但即便如此,您的语法也不对。您必须将数组连同要添加到它的值一起传递给函数。像这样:

s.append(pulses, new Pulse());

在你修复之后,你仍然会遇到一些其他问题(比如不使用 s 变量来访问 map() 函数),但这应该会让你朝着正确的方向前进.