2
\$\begingroup\$

So I am working on a top down shoot and have been stumped on why my bullets refuse to come out of the barrel of the gun. I know about the rotation equation which is

x2 = x * cos(theta) - y * sin(theta)
y2 = x * sin(theta) + y * cos(theta)

Here is part of my shoot method for my shotgun

    float dx = (float) (5 * Math.cos(direction) + 40 * Math.sin(direction));
    float dy = (float) (5 * -Math.sin(direction) + 40 * Math.cos(direction));

    //PlayState.effects.add(new MuzzleFlashEffect(x + dx, y + dy, (float) Math.toDegrees(-direction)));

    for(int i = 0; i < randNum; i++){
        float var = MathUtils.random(-accuracy, accuracy);
        float dir = direction + (float) Math.toRadians(var);
        PlayState.projectiles.add(new Bullet(this, x + dx, y + dy, dir));
    }

    bulletsInClip--;
    lastShot = System.currentTimeMillis();

The bullets always tend to shoot out of the left side and I don't have a clue why. The player sprite origin is the center and not the top left but I can't get it shooting out of the barrel.

enter image description here

Can someone explain why this is happening and how I can fix this. I have spent too many hours and losing my sanity.

Thanks in advance!

EDIT

Here are some pictures of the character shooting in different directions

RIGHT RIGHT

LEFT enter image description here

DOWNWARD enter image description here

\$\endgroup\$
  • \$\begingroup\$ What does it look like if the player is shooting in a different direction - to the left/right, or downwards? \$\endgroup\$ – congusbongus May 6 '14 at 7:53
  • \$\begingroup\$ can you verify that the sprite is in the correct location, add a rectangle with the bounding box of the player and make sure they match up. my guess would be that the sprite is drawn in the wrong location \$\endgroup\$ – ratchet freak May 6 '14 at 8:48
  • \$\begingroup\$ Added some pictures to show you guys in more detail what it looks like. \$\endgroup\$ – G3tinmybelly May 6 '14 at 14:55
2
\$\begingroup\$

Let's see what is happening.

float dx = (float) (5 * Math.cos(direction) + 40 * Math.sin(direction));
float dy = (float) (5 * -Math.sin(direction) + 40 * Math.cos(direction));

So facing right, dx = 40, so cos(direction) = 0 sin(direction) = 1.

dy = -5 for the same reasons. 0,0 is top left.

This means that direction = pi/2. This is unusual, normally pi/2 means up in java.

Facing down the shots are offset downward and a little left. So cos(direction) = 1, sin(direction) = 0, dx = -5, dy = 40. This means the angle is 0.

So far so good, though the angle is still funny, 0 meaning down.

Facing left it's down and below.

dx = -40, dy = 5. cos(direction) = 0, sin(direction) = -1, so this is -pi/2

Then up, it's greatly to the left and up.

What I would expect given the rest is that direction = pi. sin(direction) = 0, cos(direction) = -1

If that is the case, then you should have dx = -5, dy = -40.

But you have something that looks more like dy = -80, dx = -40.

So what's up?

My first test would be to check what exactly the direction is when you're pointing up.

Then I would watch the values of dx and dy to confirm that they were in fact the things that were screwing up and it wasn't something like your x and y values that were getting offset when you pointed up.

I know there's no way for both cos(x) and sin(x) to return positive numbers, and no way for cos(x) to return something less than -1.

So either something is screwing up the value of dy (like code that isn't shown) or the value of y when you create the bullets is incorrect, or possibly that there's some logic in your bullet constructor that is screwing up the position in that case.

I would look at the bullet constructor to make sure that it's not the one at fault. Finally I would worry about the casts to float. All the trig functions take and return doubles, and conversions to floats can do weird things which might be present elsewhere.

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ As a small note, there are many ways for cos(x) and sin(x) to both return positive numbers; for instance, cos(pi/4) = sin(pi/4) ~= .707. \$\endgroup\$ – Steven Stadnicki May 6 '14 at 17:43
  • \$\begingroup\$ I fixed it and I appreciate the time you put in helping me. Thanks! \$\endgroup\$ – G3tinmybelly May 6 '14 at 23:07
  • \$\begingroup\$ @StevenStadnicki or more precisely all 0 < x < pi/2 will have both sin(x) and cos(x) be positive \$\endgroup\$ – ratchet freak May 7 '14 at 8:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.