pjs 草图和 html canvas

pjs sketches and html canvas

当我通过以下方式将 pjs 草图粘贴到 html canvas 时,我试图了解我在做什么。

<body>
<canvas id="mycanvas" style="border: 1px solid black;"></canvas> 
</body>
<script src="https://cdn.jsdelivr.net/processing.js/1.4.8/processing.min.js">
</script>

<script>
var sketchProc = function(processingInstance) {
with (processingInstance) {     
size(800, 400);      
frameRate(30);

draw = function() {
  background(235, 245, 255);
};

}};
var canvas = document.getElementById("mycanvas");     
var processingInstance = new Processing(canvas, sketchProc);
</script>

当我开始学习这些东西时,我很想将我的动画添加到 html 文档中。我通过上述方式几乎了解了仓鼠如何学会按下按钮并接收弹丸;也就是我不太了解这个机制,但是结果是肯定的。

下面是上面的例子: https://jsfiddle.net/h1Lb91ux/

这是我试图理解这一点的尝试。

以下代码定义了一个名为 sketchProc 的函数。

var sketchProc = function(processingInstance) {
with (processingInstance) {     
size(800, 400);      
frameRate(30);

draw = function() {
  background(235, 245, 255);
};

}};

这不会 return 任何东西,因为我们只是定义 sketchProc,而不是调用它。它的参数是 processingInstance,它被定义为局部变量,就像我所做的那样:

var functionX = function(x) {
  return x;
};

但是我不明白with语句。我知道 excel-vba 中的 with 语句,它可用于将多个方法附加到一个对象,而无需重复键入对象名称。这是一样的吗?

下面的说法很有道理。

var canvas = document.getElementById("mycanvas"); 

但下一个是混乱的根源:

var processingInstance = new Processing(canvas, sketchProc);

对我来说,这看起来像是我们从对象构造函数(在 javascript 中)或 class(在处理中)创建单个实例或对象,它有 2 个参数: canvas 和 sketchproc。我们正在调用这个特定的实例 processingInstance,它与函数 sketchProc 中使用的局部变量同名。

我希望这不会太乱。

The following code is defining a function called sketchProc.

var sketchProc = function(processingInstance) {
with (processingInstance) {     
size(800, 400);      
frameRate(30);

draw = function() {
  background(235, 245, 255);
};

}};

它正在定义一个 函数对象 ,它本身包含像 draw() 这样的函数。您可以阅读有关函数对象的更多信息 here,但基本上这只是一个包含 Processing 可以调用的函数的实例。

But I do not understand the with statement.

尝试使用谷歌搜索 "javascript with" 之类的内容以获得大量结果,包括 this one。但我的理解是,这是避免在一切之前调用 processingInstance. 的捷径。您可以尝试删除 with 语句并将 processingInstance. 放在任何处理函数之前以查看替代方案。 with 是可选的,但会使您的代码稍微短一些。我个人不喜欢在这里使用 with,但我就是这样。

But this next one is a source of confusion:

var processingInstance = new Processing(canvas, sketchProc);

To me, this looks like we're making a single instance or object from an object constructor function (in javascript) or a class (in processing), which takes 2 arguments: canvas and sketchproc. We're calling this specific instance processingInstance, which confusingly is the same name as the local variable used in the function sketchProc.

你的理解听起来是对的。创建 Processing 的实例是启动所有 Processing 魔法的原因,它会自动为您调用 setup() 函数和 draw() 函数。如果它让你感到困惑,你也可以重命名变量。

退一步说,这段代码使用了 Processing.js 的 实例模式 ,这就是为什么你有这些你并不真正理解的额外代码。我建议您从更基本的全局模式开始,这将使您的代码看起来像这样:

<script type="application/processing">
function setup(){
  size(800, 400);      
  frameRate(30);
}

function draw() {
  background(235, 245, 255);
};
</script>
<canvas> </canvas>

我也很好奇你为什么要使用 Processing.js。如果您来自 JavaScript 背景,那么选择 P5.js 可能会更幸运。