How to shift a vector based on the rotation of another vector?
Posted
by
bpierre
on Game Development
See other posts from Game Development
or by bpierre
Published on 2012-11-16T00:56:45Z
Indexed on
2012/11/16
5:14 UTC
Read the original article
Hit count: 270
I’m learning 2D programming, so excuse my approximations, and please, don’t hesitate to correct me. I am just trying to fire a bullet from a player. I’m using HTML canvas (top left origin).
Here is a representation of my problem:
- The black vector represent the position of the player (the grey square).
- The green vector represent its direction.
- The red disc represents the target.
- The red vector represents the direction of a bullet, which will move in the direction of the target (red and dotted line).
- The blue cross represents the point from where I really want to fire the bullet (and the blue and dotted line represents its movement).
This is how I draw the player (this
is the player object. Position, direction and dimensions are 2D vectors):
ctx.save();
ctx.translate(this.position.x, this.position.y);
ctx.rotate(this.direction.getAngle());
ctx.drawImage(this.image, Math.round(-this.dimensions.x/2), Math.round(-this.dimensions.y/2), this.dimensions.x, this.dimensions.y);
ctx.restore();
This is how I instanciate a new bullet:
var bulletPosition = playerPosition.clone(); // Copy of the player position
var bulletDirection = Vector2D.substract(targetPosition, playerPosition).normalize(); // Difference between the player and the target, normalized
new Bullet(bulletPosition, bulletDirection);
This is how I move the bullet (this
is the bullet object):
var speed = 5;
this.position.add(Vector2D.multiply(this.direction, speed));
And this is how I draw the bullet (this
is the bullet object):
ctx.save();
ctx.translate(this.position.x, this.position.y);
ctx.rotate(this.direction.getAngle());
ctx.fillRect(0, 0, 3, 3);
ctx.restore();
How can I change the direction and position vectors of the bullet to ensure it is on the blue dotted line?
I think I should represent the shift with a vector, but I can’t see how to use it.
© Game Development or respective owner