- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近从使用 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 草图的页面时发生的情况:
setup()
和 draw()
等函数已在这一步定义,但尚未调用。调用函数之外的代码。这是您看到 100
被打印出来的时候。setup()
函数。这是在设置 width
时。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/
我是一名优秀的程序员,十分优秀!