避免在 p5 中使用全局范围

Avoid using global scope in p5

刚刚在p5新建了一个项目,我已经在浏览器中直接导入使用了,不过这次由于是比较复杂的项目,所以打算在 webpack 中使用它。

我导入了库并以这种方式引导它:

import * as p5 from 'p5';

function setup() {
  createCanvas(640, 480);
}

function draw() {
  if (mouseIsPressed) {
    fill(0);
  } else {
    fill(255);
  }
  ellipse(mouseX, mouseY, 80, 80);
}

但是不行。

原因很简单:webpack 将模块包装在本地范围内,而 p5 并不知道它。

出于这个原因,我将函数分配到全局范围:

import * as p5 from 'p5';

window.setup = function () {
  createCanvas(640, 480);
}

window.draw = function () {
  if (mouseIsPressed) {
    fill(0);
  } else {
    fill(255);
  }
  ellipse(mouseX, mouseY, 80, 80);
}

它工作正常,但看起来还是不对。我不认为污染全局范围是 2019 年使用 JS 的正确方法。特别是如果我正在使用 webpack 并且我即将实现 TypeScript。

那么,我如何告诉 p5 在模块范围内而不是在全局范围内查找函数?

您会使用 instance mode,它不依赖于全局变量。这是该页面的示例:

var sketch = function( p ) {

  var x = 100; 
  var y = 100;

  p.setup = function() {
    p.createCanvas(700, 410);
  };

  p.draw = function() {
    p.background(0);
    p.fill(255);
    p.rect(x,y,50,50);
  };
};

var myp5 = new p5(sketch);

实例:

var sketch = function( p ) {

  var x = 100; 
  var y = 100;

  p.setup = function() {
    p.createCanvas(700, 410);
  };

  p.draw = function() {
    p.background(0);
    p.fill(255);
    p.rect(x,y,50,50);
  };
};

var myp5 = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.min.js"></script>