变量不会更改类内的属性

时间:2019-06-14 15:02:31

标签: javascript class processing p5.js

我正在制作一个球类/物体,就像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

(如果您知道如何修复,请在此处告诉我,如果您在网络编辑器中更改了代码,则不会提前将更改发送给我)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你是如此亲密!

您正在使用xSpeed函数在每一帧中传递ySpeed.move(),这使if语句变得多余!

我建议在构造函数中指定xSpeedySpeed,这样会将其存储在对象中,以便您的if语句可以直接更改字段!

    var dvd1;
    var dvd2;
    
    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(xSpeed, ySpeed) {
        this.x = 0;
        this.y = 0;
        this.speedX = xSpeed;
        this.speedY = ySpeed;
      }
    
      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;
        }
      }
    
      show(r, g, b) {
        noStroke();
        fill(r, g, b);
        ellipse(this.x, this.y, 50, 50);
      }
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/p5.js"></script>