# How do I generate projectiles toward the mouse pointer? [duplicate]

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?

-

## marked as duplicate by Josh Petrie♦Aug 10 '14 at 4:33

Is it that you need help calculating the angle based on the mouse cursor? – Nate Jun 7 '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 Dube Jun 7 '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

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.

-
+1 Vectors are a wonderful thing. Learn them! – doppelgreener Jun 7 '11 at 22:43
Thanks, that did the trick ! Awesome link on the vectors too, definitely something I'll read soon. – Tristan Dube Jun 8 '11 at 1: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 2:13
@JesseEmond Welcome to the vote to close privilege, use it wisely. – Byte56 May 17 '13 at 19:44

If you're having trouble calculating the angle, you can use this:

``````Vector2 target = mousePos - startPos;
float angle = Math.Atan2( target.Y, target.X );
``````
-
+1 Keepin' it simple. – Arcane Engineer Jan 21 '12 at 16:40