When you create a projectile keep a reference of the entity the projectile is shooting towards. Every update cycle, you need to do something like this.
Here is my rotation helper class for simple 2d rotation operations.
public class Rotation {
public static int angle(vec2 pivot, vec2 point) {
float xdiff = pivot.x - point.x;
float ydiff = pivot.y - point.y;
float angle = (float) ((Math.atan2(xdiff, ydiff)) * 180 / Math.PI);
return -(int)angle;
}
public static float angle(float x0, float y0, float x1, float y1) {
return angle(new vec2(x0, y0), new vec2(x1, y1));
}
public static vec2 point(vec2 pivot, vec2 point, float rotation) {
float rot = (float)(1f / 180 * rotation * Math.PI);
float x = point.x - pivot.x;
float y = point.y - pivot.y;
float newx = (float)(x * Math.cos(rot) - y * Math.sin(rot));
float newy = (float)(x * Math.sin(rot) + y * Math.cos(rot));
newx += pivot.x;
newy += pivot.y;
return new vec2(newx, newy);
}
}
And vec2 class
public class vec2 {
public static vec2 NULL = new vec2(0, 0);
public float x, y;
public vec2(float x, float y) {
this.x = x;
this.y = y;
}
public int getX() {
return (int) x;
}
public int getY() {
return (int) y;
}
}
Here is a short guide how to do what you want.
public class Projectile {
private Entity target;
public void update() {
// 1) Calculate rotation between target (entity shooting at) and this (projectile)
float rotation = Rotation.angle(target.x, target.y, this.x, this.y);
// 2) The speed at which the projectiles travels
float speed = 2f;
// 3) A 2d vector which will tell how much to increment projectile's x,y coordinates.
// Rotate vector composed of [0,-speed] around point vec2.NULL( which is [0,0] vector) by rotation degrees.
vec2 velocity = Rotation.point(vec2.NULL, new vec2(0, -speed), rotation);
// 4) increment projectile's x,y coordinates.
this.x+=velocity.x;
this.y+=velocity.y;
}
}