Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why must I add velocity to object.position.y + object.height?

There nothing wrong with my code really. I was watching a tutorial to help me learn to make games in canvas.

I’ve understood every single bit of it, but the one thing I don’t understand is why must I add velocity to my equation?

I understand its the speed and direction of an object, but why must I add it? I’ve been trying to understand it for 8 hours now. And I don’t think I can continue with learning until I understand why.

I’ve interrogated two separate AI bots, but what they were saying were making no sense to me whatsoever even when I asked them to simplify it.

Here is my code of course:

let canvas = document.getElementById("canvas");
let ctx = canvas.getContext("2d");
canvasWidth = 770;
canvasHeight = 650;
canvas.width = canvasWidth;
canvas.height = canvasHeight;

let gravity = 7.4;

class Player {

  constructor() {
    this.position = {
      x: 175,
      y: 0
    }
    this.velocity = {
      x: 0,
      y: 0
    }
    this.width = 65;
    this.height = 60;
  }

  draw() {
    ctx.fillStyle = "goldenrod";
    ctx.fillRect(this.position.x, this.position.y, this.width, this.height)
  }

  update() {
    this.draw();
    this.position.y += this.velocity.y;

    if(this.position.y + this.height + this.velocity.y <= canvas.height) {
      this.velocity.y += gravity;
    }
    else {
      this.velocity.y = 0
    }
  }
}

let player = new Player();
player.draw()

function animate() {
  requestAnimationFrame(animate)
  ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  player.update();
}

animate()

The specific part of the code I don’t understand is: this.position.y + this.height + this.velocity.y <= canvas.height

I understand that this.position.y + this.height is the position of the bottom of the player, but if I already have the bottom position of th eplayer, why do I have to add velocity?

I’m only 15 and I just started taking geometry, lol.

like image 864
Heavenly Gater Avatar asked Oct 20 '25 13:10

Heavenly Gater


1 Answers

You're right to be confused, because the code is a mess. It will animate at different speeds depending on how quickly the browser can provide animation frames.

Gravity causes the velocity to increase as time increases. Therefore, use the physics formula distance = initial speed + 0.5 * gravity * time^2 to get the distance that the box would have dropped at a particular time.

Then use Math.min() to ensure that when the box reaches the bottom of the canvas, it cannot travel any further (because it has reached the ground).

let canvas = document.getElementById("canvas");
let ctx = canvas.getContext("2d");
canvasWidth = 770;
canvasHeight = 180;
canvas.width = canvasWidth;
canvas.height = canvasHeight;

let gravity = 7.4/4000;
class Player {
  constructor() {
    this.position = {
      x: 175,
      y: 0
    };
    this.width = 65;
    this.height = 60;
    }
  draw(){
    ctx.fillStyle = "goldenrod";
    ctx.fillRect(this.position.x, this.position.y, this.width, this.height)
  }
  update(){
    this.position.y = Math.min(canvas.height - this.height, 0.5 * gravity * Math.pow(+new Date() - start, 2));
    this.draw();
    }
}
let player = new Player();

let start = +new Date();
player.draw();

function animate(){
  ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  player.update();
    requestAnimationFrame(animate);
}
animate()
<canvas id="canvas"></canvas>
like image 199
Andrew Parks Avatar answered Oct 22 '25 03:10

Andrew Parks



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!