我正在制作一个像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

(如果您知道如何解决它,请在这里告诉我,如果您在网络编辑器中更改了代码,则不会提前将更改发送给我)

最佳答案

speedXspeedY不是全局变量,它们是函数move的参数。 speedY = -speedY会更改参数的值,但这不会影响具有常量值dvd1.move(2, 3);的函数的调用。
speedXspeedY的值始终始终为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;
        }
    }

09-18 17:38