【问题标题】:How to access processing.js 'width' and 'height' outside processing.js functions如何在 processing.js 函数之外访问 processing.js 的“宽度”和“高度”
【发布时间】:2016-01-07 17:16:01
【问题描述】:

我最近从使用可汗学院的 processing.js 环境飞跃到真正的交易,有点困惑。

我有一个简单的 processing.js 程序,基本上画了一个圆,我希望这个圆的大小由画布的宽度决定。

如果我在 processing.js 函数(如 setup)中打印宽度,则会显示正确的 500px 宽度。不幸的是,每当我尝试在 processing.js 函数之外访问 width 属性时,它会显示默认的 100px 大小,即使画布本身是 500px 宽。

我认为我可能使用了相当丑陋的处理和 javascript 组合,这可能是我问题的根源。非常感谢您的帮助!

Processing.js

///* PROCESSING.JS SETUP *///
void setup() {
    size(500, 500);
    println(width); // WORKS! :)
}

println(width); // DOESN'T WORK... :(

///* GLOBAL VARIABLES *///
var moleculeQuantity = 1;

///* OBJECT CONSTUCTORS *///
var Molecule = function(x, y) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
};

Molecule.prototype.draw = function() {
    noStroke();
    fill(88, 91, 183);
    ellipse(this.x, this.y, 70, 70);

    fill(225, 227, 228);
    ellipse(this.x, this.y, 40, 40);
};

// Fill array with molecule objects
var molecules = [];
for (var i = 0; i < moleculeQuantity; i++) {
    molecules[i] = new Molecule(200, 100);
}

///* DRAW FUNCTION *///
void draw() {
    background(225, 227, 228);
    molecules[0].draw();
}

【问题讨论】:

  • 在全局范围内写var width;
  • 感谢 Jeremy,但@Kevin 指出了为什么这在下面不一定有效。在调用 setup 函数之前,全局声明的宽度仍未定义。

标签: javascript canvas processing processing.js


【解决方案1】:

您的问题与混合处理和 JavaScript 无关,与异步执行无关。比这简单得多。

想想你的代码执行的顺序。方法之外的任何东西都会在你的setup()函数被调用之前执行之前。在您的情况下,这意味着您在通过调用 size() 函数更改它之前访问了 width 变量。

您必须更改您的代码,以便在调用setup() 后触发您的代码。最简单的方法是将代码移到 setup() 函数的末尾,或者移到在 setup() 之后调用的函数中,例如 draw() 或事件方法。

您可能会认为,因为您的函数调用低于代码中的 setup() 函数,所以 setup() 调用首先发生,但事实并非如此。您只是简单地定义 setup() 函数 - 它还没有被(通过处理)调用!尝试将函数之外的任何代码移到草图顶部以使其更明显:

println(width); // this happens first, so width is still 100

void setup() {
    size(500, 500);
    println(width); //now that size() has been called, the width is 500
}

编辑:我将尝试解释事件的顺序。当您加载包含 Processing.js 草图的页面时会发生以下情况:

  1. 页面已加载。
  2. Processing.js 本身已加载。
  3. Processing.js 将您的处理代码编译成 JavaScript 代码。
  4. 您的代码(现在是 JavaScript 代码)已加载setup()draw() 之类的函数在此步骤中定义,但尚未调用。调用函数之外的代码。这是您看到100 被打印出来的时候。
  5. Processing.js 调用第 4 步中定义的 setup() 函数。此时设置了 width
  6. Processing.js 开始每秒调用 draw() 函数 60 次。

至于你应该把你的变量和函数放在哪里,这完全取决于你想用它们做什么。但是您可以将变量的声明放在草图的顶部,并将其初始化放在setup() 函数中。这样您就可以在任何地方访问它的值,但您知道它在setup() 运行之前不会被设置。像这样的:

float middleX;

void setup(){
   size(500, 500);
   middleX = width/2;
}

void draw(){
   background(0);
   ellipse(middleX, mouseY, 10, 10);
}

【讨论】:

  • 谢谢凯文,这很有意义。我认为 processing.js 在运行之前编译成 javascript,并且我认为它需要做的第一件事就是执行 setup 函数。您是说 processing.js 通常在提升我的 javascript 后执行其功能,还是只是发生了 setup 功能稍后执行?在这种情况下,当我的构造函数和全局变量需要“宽度”时,我应该将它们放在哪里?将它们放在设置函数中不会本地化它们的范围吗?再次感谢您帮助我。
  • 另外,我刚刚检查了 processing.js 文档,它说 setup() 在程序启动时被调用一次。现在我很困惑。如果在程序启动的时候调用了setup(),为什么不立即设置width变量呢?
  • @curzmg 查看我的编辑,如果您有任何其他问题,请告诉我。
  • 伟大的编辑 - 这为我清除了操作顺序。我确信这是有充分理由的,但从一开始就没有这些关键变量似乎有点令人沮丧。哦,好吧,我相信我能想出办法。感谢您抽出宝贵时间。
  • @curzmg 它们在开始时不可用,原因与将鼠标移入窗口之前mouseXmouseY 不可用相同。在鼠标有位置之前向Processing询问鼠标位置是没有意义的,在草图有尺寸之前向Processing询问尺寸是没有意义的。任何由此引起的问题都可以通过简单地将任何变量的初始化移动到 setup() 函数的末尾来解决。
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多