gpt4 book ai didi

javascript - 如何在 processing.js 函数之外访问 processing.js 'width' 和 'height'

转载 作者:行者123 更新时间:2023-11-29 19:17:24 24 4
gpt4 key购买 nike

我最近从使用 Khan Academy 的 processing.js 环境到真正的交易有了飞跃,但我有点困惑。

我有一个简单的 processing.js 程序,主要是画一个圆,我希望这个圆的大小由 Canvas 的宽度决定。

如果我在 processing.js 函数中打印宽度,比如设置,我会看到正确的 500 像素宽度。不幸的是,每当我尝试在 processing.js 函数之外访问 width 属性时,它都会显示默认的 100px 大小,即使 Canvas 本身是 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();
}

最佳答案

您的问题与混合处理和 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 将您的 Processing 代码编译成 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);
}

关于javascript - 如何在 processing.js 函数之外访问 processing.js 'width' 和 'height',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com