describe("A ball bouncing in a box simulator");
createCanvas(windowWidth, windowHeight);
speed = createSlider(0,2,0.5,0.01);
constructor(ballX = 0, ballY = 0, speedX = 0, speedY = 0, drag = 0, bounciness = 1, gravity = 1) {
this.bounciness = bounciness;
circle(this.ballX,this.ballY,10);
this.ballX += this.speedX * time;
this.ballY += this.speedY * time;
this.speedX -= this.drag * time;
else if (this.speedX < 0) {
this.speedX += this.drag * time;
this.speedY += this.drag * time;
if (this.ballY < height-1) {
this.speedY += this.gravity * time;
this.speedX = -this.speedX*this.bounciness;
else if (this.ballX > width) {
this.speedX = -this.speedX*this.bounciness;
if (this.ballY > height) {
this.speedY = -this.speedY*this.bounciness;
else if (this.ballY < 0) {
this.speedY = -this.speedY*this.bounciness;
function mousePressed() {
describe("A new ball is being created.");
function mouseReleased() {
balls.push(new Ball(originalX,originalY,mouseX-originalX,mouseY-originalY,0.05,0.8,1));
describe("A new ball was created at (${mouseX},${mouseY})");
if (originalX != -1 && originalY != -1) {
line(originalX,originalY,mouseX,mouseY);
point(originalX,originalY);
describe("There are ${balls.length} balls bouncing in a box. A new ball is being created with a speed of (${mouseX-originalX},${mouseY-originalY}).");
describe("There are ${balls.length} balls bouncing in a box.");
for (var ball in balls) {
balls[ball].tick(speed.value());