Help wanted for "Adding features to our bouncing balls demo"

I did the assessment and checked a code of the final version.
I amended a little bit, but still I cannot fix it.
(Evil circle appears, but the balls doesn’t appear anymore).

Could you let me know what is wrong with my code?
Here is my code…


const para = document.querySelector(‘p’);
let count = 0;

const canvas = document.querySelector(‘canvas’);
const ctx = canvas.getContext(‘2d’);

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

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

function Shape(x, y, velX, velY, exists)
{
this.x = x;
this.y = y;
this.velX = velX;
this.velY = velY;
this.exists = exists;
}

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

Ball.prototype = Object.create(Shape.prototype);
Ball.prototype.constructor = Ball;

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

Ball.prototype.update = function()
{
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;

}

Ball.prototype.collisionDetect = function() {
for (let j = 0; j < balls.length; j++) {
if (!(this === balls[j])) {
const dx = this.x - balls[j].x;
const dy = this.y - balls[j].y;
const distance = Math.sqrt(dx * dx + dy * dy);

    if (distance < this.size + balls[j].size) {
    balls[j].color = this.color = 'rgb(' + random(0, 255) + ',' + random(0, 255) + ',' + random(0, 255) +')';
    }
}
}

}

function EvilCircle(x, y, velX, velY, exists, size, color)
{
Shape.call(this, x, y, 20, 20, exists);
this.size = 10;
this.color = ‘white’;
}

EvilCircle.prototype = Object.create(Shape.prototype);
EvilCircle.prototype.constructor = EvilCircle;

EvilCircle.prototype.draw = function() {
ctx.beginPath();
ctx.strokeStyle = this.color;
ctx.lineWidth = 3;
ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);
ctx.stroke();
};

EvilCircle.prototype.checkBounds = function()
{
if ((this.x + this.size) >= width)
{
this.x -= this.size;
}

if ((this.x - this.size) <= 0) 
{
this.x += this.size;
}

if ((this.y + this.size) >= height) 
{
this.y -+ this.size;
}

if ((this.y - this.size) <= 0) 
{
this.y += this.size;
}

}

EvilCircle.prototype.setControls = function()
{
let _this = this;
window.onkeydown = function(e) {
if (e.key === ‘a’) {
_this.x -= _this.velX;
} else if (e.key === ‘d’) {
_this.x += _this.velX;
} else if (e.key === ‘w’) {
_this.y -= _this.velY;
} else if (e.key === ‘s’) {
_this.y += _this.velY;
}
}
}

EvilCircle.prototype.collisionDetect = function ()
{
for (let j = 0; j < balls.length; j++)
{
if (balls[j].exists)
{
const dx = this.x - balls[j].x;
const dy = this.y - balls[j].y;
const distance = Math.sqrt(dx * dx + dy * dy);

    if (distance < this.size + balls[j].size) 
    {
    balls[j].exists = false;
    count--;
    para.textContent = 'Ball Count: ' + count;
    }
}
}

};

const balls = [];

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),
random(-7,7),
random(-7,7),
true,
size,
‘rgb(’ + random(0,255) + ‘,’ + random(0,255) + ‘,’ + random(0,255) +’)’
);

balls.push(ball);
count++;
para.textContent = 'Ball count:' + count;

}

let evil = new EvilCircle(random(0, width), random(0, height), true);
evil.setControls();

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

for (let i = 0; i < balls.length; i++)
{
    if (balls[i].exists)
    {
        balls[i].draw();
        balls[i].update();
        balls[i].collisionDetect();
    }
}
evil.draw();
evil.update();
evil.collisionDetect();

requestAnimationFrame(loop);

}

loop();

this one of the issue

also if you check the browser console you will see it complain about this
evil.update();

so right click on your page of project then find what console complain about it will help you a lot then if things did not work then add this in each part you want to test
console.log(write string or variable name); it will print it to console so you check the value if it behave as it should be or not

and share you r whole project in a sharing site like codepen or jsfiddle or anything else it will be much easier for people to check it as copy from here to there not always work as it should be

hope that help and have a nice day :slight_smile:

@justsomeone

Thank you for your reply!
I checked the browser console and fix the complain they had!

Now it worked!!!

Somehow, this order ‘constructor(x, y, velX, velY,exists, color, size)’ has to be color, then size. if I switched to constructor(x, y, velX, velY,exists, size, color) and all other relative sections, it didn’t work. Still don’t understand why that makes a difference, but for now it’s working.

Thank you so much.

My CodePen; https://codepen.io/rena-suzuki-wagner/pen/abmzeWM

glad to know that you figured it out and you very welcome @renawagner

cause when you constract a ball you send this

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),
    random(-7,7),
    random(-7,7),
    true,
    'rgb(' + random(0,255) + ',' + random(0,255) + ',' + random(0,255) +')',
    size
    );

function or constructor get the parameter in the same order so it does not know which one is used for which variable that why you have to match the order

in other more strict language the compiler would screen on your face if you did that :joy:

so function expect that you send the parameter in the order as it written for

by the way try to use IDE it would help you spot error while writting your code it help a lot

hope that help and have a nice day :slight_smile:

Aghh I see! I totally missed that!!!
Thank you @justsomeone!! :grin:

Have a great day!

you very welcome and glad that you got it and thanks a lot :slight_smile: