Как замедлить отскакивающие шары в MDN tutorial

#javascript #canvas

#javascript #холст

Вопрос:

Я следую руководству по созданию объектов MDN, пытаясь завершить учебное пособие, используя объявления классов ES6.

Прыгающие шары в моей программе движутся намного быстрее, чем описано в руководстве. Я установил скорость вновь созданных экземпляров Ball; однако экземпляры Ball все еще движутся слишком быстро.

 // setup canvas

var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');

var width = canvas.width = window.innerWidth;
var height = canvas.height = window.innerHeight;

// function to generate random number

function random(min, max) {
    let num = Math.floor(Math.random()*(max-min))   min;
    return num;
}

class Ball {
    constructor(x, y, velX, velY, color, size) {
        this.x = x;
        this.y = y;
        this.velX = velX;
        this.velY = velY;
        this.color = color;
        this.size = size;
    }

    draw() {
        ctx.beginPath();
        ctx.fillStyle = this.color;
        ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);
        ctx.fill();
    }

    update() {
        if ((this.x   this.size) >= width) {
            this.velX = -(this.velX);
        }
        if ((this.x - this.size) <= 0) {
            this.velX = -(this.velX);
        }
        if ((this.y   this.size) >= height) {
            this.velY = -(this.velY);
        }
        if ((this.y - this.size) <= 0) {
            this.velY = -(this.velY);
        }
        this.x  = this.velX;
        this.y  = this.velY;
    };

}


function loop() {
    let balls = [];
    ctx.fillStyle = 'rgba(0, 0, 0, 0.25)';
    ctx.fillRect(0, 0, width, height);

    while (balls.length < 25) {
        let size = random(10,20);
        let ball = new Ball(
            // ball position always drawn at least one ball width
            // away from the edge of the canvas, to avoid drawing errors
            random(0   size,width - size),
            random(0   size,height - size),
            5,
            5,
            'rgb('   random(0,255)   ','   random(0,255)   ','   random(0,255)  ')',
            size
        );
        balls.push(ball);
    }

    for (let i = 0; i < balls.length; i  ) {
        balls[i].draw();
        balls[i].update();
    }

    requestAnimationFrame(loop);
}

loop();
  

Ответ №1:

Ошибка заключается в том, что вы помещаете let balls = [] функцию внутри цикла.

Просто переместите его наружу, и все начнет работать.

 var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');

var width = canvas.width = window.innerWidth;
var height = canvas.height = window.innerHeight;

// function to generate random number

function random(min, max) {
    let num = Math.floor(Math.random()*(max-min   1))   min;
    return num;
}

class Ball {
    constructor(x, y, velX, velY, color, size) {
        this.x = x;
        this.y = y;
        this.velX = velX;
        this.velY = velY;
        this.color = color;
        this.size = size;
    }

    draw() {
        ctx.beginPath();
        ctx.fillStyle = this.color;
        ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);
        ctx.fill();
    }

    update() {
        if ((this.x   this.size) >= width) {
            this.velX = -(this.velX);
        }
        if ((this.x - this.size) <= 0) {
            this.velX = -(this.velX);
        }
        if ((this.y   this.size) >= height) {
            this.velY = -(this.velY);
        }
        if ((this.y - this.size) <= 0) {
            this.velY = -(this.velY);
        }
        this.x  = this.velX;
        this.y  = this.velY;
    };

}


let balls = []; // moved outside loop() function

function loop() {
    ctx.fillStyle = 'rgba(0, 0, 0, 0.25)';
    ctx.fillRect(0, 0, width, height);

    while (balls.length < 25) {
        let size = random(10,20);
        let ball = new Ball(
            // ball position always drawn at least one ball width
            // away from the edge of the canvas, to avoid drawing errors
            random(0   size,width - size),
            random(0   size,height - size),
            5,
            5,
            'rgb('   random(0,255)   ','   random(0,255)   ','   random(0,255)  ')',
            size
        );
        balls.push(ball);
    }

    for (let i = 0; i < balls.length; i  ) {
        balls[i].draw();
        balls[i].update();
    }

    requestAnimationFrame(loop);
}

loop();  
 <canvas></canvas>  

Единственное, что я сделал, это сверил ваш код с кодом руководства. Всегда перепроверяйте шаги, которые вы выполнили, когда сталкиваетесь с проблемой кода.