Asteroids: Shoot at a target question

Hi,

I have been making a clone of Asteroids in Java. You can see my progress here Play Asteroids

I am having some trouble with getting the flying saucers to shoot at the player.
I have done some research and found that by taking the players position away from the flying saucers position and using the Math.atan2 function on the result I should get the rotation in radians needed to point towards the player from the flying saucers position.

Here is that in code.


double x1 = saucer.x.get();
double y1 = -saucer.y.get();
					
double x2 = player.x.get();
double y2 = -player.y.get();
					
double x = x2 - x1;
double y = y2 - y1;
					
double angle = Math.atan2(y, x);

I tried this and it did not work. So I did some test calculations to see why.

[tr][td]Saucer Position[/td][td]Player Position[/td][td]Result[/td][/tr]
[tr][td](100, 100)[/td][td](100, 90)[/td][td]3.14[/td][/tr]
[tr][td](100, 100)[/td][td](110, 100)[/td][td]1.57[/td][/tr]
[tr][td](100, 100)[/td][td](100, 110)[/td][td]0[/td][/tr]
[tr][td](100, 100)[/td][td](90, 100)[/td][td]-1.57[/td][/tr]

This would rotate an object to point in the direction I wanted except the Y axis was upside down.
So if I multiplied the Y by -1 it comes out ok.

I then calculate the velocity for the bullet the saucer fires at the player as such


xVelocity += Math.sin(angle) * ACCELERATION;
yVelocity -= Math.cos(angle) * ACCELERATION;

I tried this in my game and the saucers do not shoot at the player.
Any tips on what to try next?

Thanks!

My first guess would be that you need to switch around the cos and sin in the velocity calculation, like so. (That’s usually the way things work with atan2.)

xVelocity += Math.cos(angle) * ACCELERATION;
yVelocity -= Math.sin(angle) * ACCELERATION;

However, that doesn’t seem to agree with the “Result” angles that you’ve given in your example, so I’m not confident that it will solve the problem.

Also, you should be able to remove the minus signs from y1, y2 and yVelocity since they should all cancel out.

If you put a debugging line in the code to print out (x1,y1), (x2,y2), (x,y), angle, and (xVelocity,yVelocity), it should make it clearer what’s going on.

For what it’s worth, I believe that the following two bits of code should both make a bullet fly towards a target.

double dx = xTarget - xBullet;
double dy = yTarget - yBullet;
double angle = Math.atan2(dy,dx);
double xVelBullet = speed*Math.cos(angle);
double yVelBullet = speed*Math.sin(angle);
double dx = xTarget - xBullet;
double dy = yTarget - yBullet;
double d = Math.sqrt(dx*dx + dy*dy);
d = Math.max(d, 1.0e-6); // avoid dividing by zero
double xVelBullet = speed*dx/d;
double yVelBullet = speed*dy/d;

Hi!

Please don’t forget to add your game on the Java Game Tome. I tested it. Please clarify what you mean by providing a schema with the data you know and what you want to compute from these data, then I will try to help you.

I tried the bullet maths you suggested and it works.
The little flying saucers are quite dangerous now :slight_smile:

Thanks for the help!

I added my game to the Java Game Tome as well.

Thanks. I will validate your addition as soon as possible. It is a pleasure for me to see more and more people adding their games and I will have to improve the website to drive the experience better.