我正在制作一个球类/物体,就像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
(如果您知道如何修复,请在此处告诉我,如果您在网络编辑器中更改了代码,则不会提前将更改发送给我)
答案 0 :(得分:3)
speedX
和speedY
不是全局变量,它们是函数move
的参数。 speedY = -speedY
会更改参数的值,但这不会影响具有常量值dvd1.move(2, 3);
的函数的调用。
speedX
和speedY
的值始终分别为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语句变得多余!
我建议在构造函数中指定xSpeed
和ySpeed
,这样会将其存储在对象中,以便您的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>