Moving from point A to B - Shooting and movement

Hi guys so i’m looking into making my enemy get the position of the player and then fire a bullet towards the previous location and was wondering what the best way to do this was. (My game is a 2D vertical scrolling game and the enemy shoots down towards the player)

I’ve searched online but i’m a little confused right now. People seem to suggest using trig and was wondering if anyone could point me in the right direction? A common piece of code I found was this:


double dx = player.x - enemy.x, dy = player.y - enemy.y;
double distance = Math.sqrt(dx*dx + dy*dy);

double multiplier = moveSpeedOfEnemy / distance;

double velocityX = dx * multiplier, velocityY = dy * multiplier;

I’ll likely have to brush up my maths as this is confusing me but if anyone can explain exactly what I should do and any useful resources then it would be great! :slight_smile:

Sorry if the question is a little vague but just ask if you need more info etc :smiley:

Thank you

That’s actually a pretty good code snippet you found there. :smiley:

To be honest you don’t even need trigonometry for this, just the very basics of linear algebra, mostly vectors.
You can create a vector that points from point A to point B by subtracting all of A’s components from all of B’s components.
That’s what [icode]dx[/icode] and [icode]dy[/icode] are in your code.
The [icode]distance[/icode] is just the distance formula to calculate the distance between the player and the enemy, and the [icode]multiplier[/icode] is there to make the projectile go faster as it gets closer to it’s target. However, it’s a really bad way of achieving acceleration and I wouldn’t use that.

To make your enemies fire a bullet at your player’s current position you should save the player’s actual position (by value and not by reference) and calculate against that like so:


Vector2f direction = new Vector2f(target.x-position.x, target.y-position.y);
direction.normalise(direction);
position.x += direction.x*speed*delta;
position.y += direction.y*speed*delta;

[icode]position[/icode] is just a Vector2f that contains your projectile’s current position and [icode]target[/icode] is a Vector2f too which contains the projectile’s target location. [icode]speed[/icode] should be the speed of the projectile.

This is just the basics and the first thing that I would change on this code as soon as you understand what’s going on is to add some kind of time based (and definitely not distance based) acceleration. :slight_smile:

Thanks Panda! :slight_smile: I really appreciate the detailed response about what each thing is doing. I’m going to go over it a few more times just to make sure I understand it and then will mess around with the code :stuck_out_tongue: