我正在制作一个像DVD屏幕一样弹跳的球类/物体。但是,当球撞击边缘时,控制其X和Y速度的变量不会改变。
我已经尝试过在完全相同的名称和所有内容的类外运行相同的IF语句,然后它可以工作,但是一旦我在类内执行它就会中断。
var dvd1;
var dvd2;
function setup() {
createCanvas(400, 400);
dvd1 = new dvdlogo();
dvd2 = new dvdlogo();
}
function draw() {
background(255);
dvd1.move(2, 3);
dvd1.show(200, 200, 200);
dvd2.move(3, 2);
dvd2.show(255, 0, 0);
}
class dvdlogo {
constructor() {
this.x = 0;
this.y = 0;
}
move(speedX, speedY) {
this.x = this.x + speedX;
this.y = this.y + speedY;
//speedX and Y arn't changing when the statement is true
if (this.y >= height || this.y <= 0) {
speedY = -speedY;
}
if (this.x >= width || this.x <= 0) {
speedX = -speedX;
}
}
show(r, g, b) {
noStroke();
fill(r, g, b);
ellipse(this.x, this.y, 50, 50);
}
}
这是球应该做的:https://editor.p5js.org/wiski/sketches/06p20NSgZ
这就是他们的工作:https://editor.p5js.org/wiski/sketches/mym6EJenN
(如果您知道如何解决它,请在这里告诉我,如果您在网络编辑器中更改了代码,则不会提前将更改发送给我)
最佳答案
speedX
和speedY
不是全局变量,它们是函数move
的参数。 speedY = -speedY
会更改参数的值,但这不会影响具有常量值dvd1.move(2, 3);
的函数的调用。speedX
和speedY
的值始终始终为2,因为函数move
用此常数值调用。
将属性.speedX
和.speedY
添加到类dvdlogo
并使用属性而不是参数:
function setup() {
createCanvas(400, 400);
dvd1 = new dvdlogo(2, 3);
dvd2 = new dvdlogo(3, 2);
}
function draw() {
background(255);
dvd1.move();
dvd1.show(200, 200, 200);
dvd2.move();
dvd2.show(255, 0, 0);
}
class dvdlogo {
constructor(speedX, speedY) {
this.x = 0;
this.y = 0;
this.speedX = speedX;
this.speedY = speedY;
}
move() {
this.x = this.x + this.speedX;
this.y = this.y + this.speedY;
if (this.y >= height || this.y <= 0) {
this.speedY = -this.speedY;
}
if (this.x >= width || this.x <= 0) {
this.speedX = -this.speedX;
}
}