I'm making a top-down space shooter where the player controls a ship and can aim and shoot using the mouse cursor. How can I fire bullets from the ship at the angle from the ship to the mouse cursor?
-
Is it that you need help calculating the angle based on the mouse cursor? – Nate Jun 07 '11 at 20:41
-
Yeah, sorry if my question is somewhat vague in that regard. And also how to move the projectile based on the angle, that too I need. – Tristan Dubé Jun 07 '11 at 21:42
-
Wait, you're asking us about basic trigonometry, or the means to implement it? – jcora Jan 21 '12 at 20:45
2 Answers
If I understood your problem properly, you just want to shoot a bullet towards a mouse position. Here is how I would do:
First of all, you must find the movement required for the bullet to get to the mouse, like so:
Vector2 movement = mousePosition - bulletStartPosition;
Then, you should normalize it to have a vector with a length of 1 so that you can hold a vector which tells you in which direction to go, like so:
movement.Normalize();
But here you have a little problem, if the direction is equal to (0, 0)
(meaning that the mouse is on the bullet start position), then you'll divide by zero, so make sure you check for that with the last piece of code:
if (movement != Vector2.Zero)
movement.Normalize();
So, you've got the movement required to move towards the mouse. You have to keep a Vector2
within your bullet class which holds the Direction
of the bullet.
What's next? You have to actually move the bullet!
In your bullet update code, do the following:
bullet.Position += bullet.Direction * bullet.Speed * gameTime.ElapsedGameTime.TotalSeconds; // multiply by delta seconds to keep a consistent speed on all computers.
Where bullet.Speed
is a float representing the bullet's speed in units per second.
Basically, here are the things to change:
Inside you bullet class, add a float Speed
and a Vector2 Direction
.
When shooting, set your bullet.Direction
to mousePosition - bullet.Position
and safely normalize it (by checking for equality with Vector2.Zero
first).
When updating your bullet, do the following: bullet.Position += bullet.Direction * bullet.Speed * gameTime.ElapsedGameTime.TotalSeconds;
.
It should work.

- 4,293
- 3
- 27
- 37
-
2
-
Thanks, that did the trick ! Awesome link on the vectors too, definitely something I'll read soon. – Tristan Dubé Jun 08 '11 at 01:27
-
what is movement used for after you normalize it? I dont see it being used. – Raptrex Aug 23 '11 at 18:40
-
@Raptrex: Actually movement is what I called the Direction later on. I just called it
movement
in the code to first show what it represents. It is basically just the Direction vector. – Jesse Emond Aug 28 '11 at 02:13 -
1