在实例模式下使用p5.sound.js:“ p5.Amplitude()不是构造函数”

Jul*_*iño 5 javascript processing processing.js ecmascript-6 p5.js

我正在使用npm,webpack,babel环境使用p5.js编写应用程序。为了能够将草图作为模块,我将草图设置为实例模式,并将库和附加组件作为模块导入:

import p5 from 'p5';
import 'p5/lib/addons/p5.sound';
import 'p5/lib/addons/p5.dom';
Run Code Online (Sandbox Code Playgroud)

然后将它们加载到草图中的窗口中:

const sketch = (p5) => {
   window.p5 = p5;
   ...
}
new p5(sketch);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用时:

amp = new p5.Amplitude()
Run Code Online (Sandbox Code Playgroud)

我收到“ p5.Amplitude不是构造函数”错误。我的预测是在窗口上命名库p5与使用库中使用p5的构造函数(例如p5.Amplitude,p5.Vector,p5.Soundfile)之间存在冲突。我还没有找到在实例模式下使用这些对象或构造函数的解决方法。但是,我可以使用不需要构造函数的这些对象中的方法。例如,loadSound()是p5.Soundfile的方法。以下作品:

sound = p5.loadSound('assets/sound.wav)

但是当我尝试时,console.log(p5.SoundFile)我变得不确定。

我迷路了!

Kev*_*man 4

我不是 JavaScript 专家,但您的语法与实例模式页面上的语法不匹配。

具体来说,你在这里做什么?

const sketch = (p5) => {
   window.p5 = p5;
   ...
}
new p5(sketch);
Run Code Online (Sandbox Code Playgroud)

将其与实例模式页面上的语法进行比较:

var sketch = function (p) {
  var gray = 0; 

  p.setup = function () {
    p.createCanvas(600, 400);
  };

  p.draw = function () {
    p.background(gray);
    p.rect(p.width/2, p.height/2, 200, 200);
  };

  p.mousePressed = function () {
    gray = (gray + 16) % 256;
  };
};

new p5(sketch);
Run Code Online (Sandbox Code Playgroud)

看起来您的代码正在重新定义p5变量,这将导致您所看到的各种问题。我将重写您的代码以不再重新定义p5变量,并使用实例模式页面中的语法:

var sketch = function(p) {
   //your code here
   //but don't change the p5 variable!
}
new p5(sketch);
Run Code Online (Sandbox Code Playgroud)