Libgdx Trigonometry Wrong Angle

207 views Asked by At

I am building a top down shooter like Counter Strike 2D there is problem with velecity:

public class Player extends Entity {

private float moveSpeed;
private float turnSpeed;
private float maxSpeed;
private float moveFriction;
private float turnFriction;

private Texture tex;
private Sprite sprite;

private ArrayList<Bullet> bullets;

public Player() {
    moveSpeed = 15 / Game.PPM;
    turnSpeed = 400 / Game.PPM;
    maxSpeed = 300 / Game.PPM;
    moveFriction = 5 / Game.PPM;
    turnFriction = 10 / Game.PPM;

    tex = new Texture(Gdx.files.internal("ingame/TempPlayer.png"));
    sprite = new Sprite(tex);

    bodyDef = new BodyDef();
    bodyDef.position.set(Game.cam.position.x / Game.PPM, Game.cam.position.y / Game.PPM);
    bodyDef.type = BodyType.DynamicBody;
    body = Game.world.createBody(bodyDef);

    shape = new PolygonShape();
    shape.setAsBox(sprite.getWidth() / 2 / Game.PPM, sprite.getHeight() / 4 / Game.PPM);

    fixDef = new FixtureDef();
    fixDef.shape = shape;
    body.createFixture(fixDef);

    shape.setAsBox(sprite.getWidth() / 10 / Game.PPM, sprite.getHeight() / 5 / Game.PPM, new Vector2(sprite.getWidth() / 2 / Game.PPM, sprite.getHeight() / 3 / Game.PPM), 0 / Game.PPM);

    fixDef.shape = shape;
    body.createFixture(fixDef);

    bullets = new ArrayList<Bullet>();
}

public void update(float dt) {
    sprite.setCenter(body.getPosition().x * Game.PPM, body.getPosition().y * Game.PPM);
    sprite.setRotation(body.getAngle() * MathUtils.radiansToDegrees);

    // FRICTON
    if (body.getLinearVelocity().x > 0) {
        body.setLinearVelocity(body.getLinearVelocity().x - moveFriction, body.getLinearVelocity().y);
    } else if (body.getLinearVelocity().x < 0) {
        body.setLinearVelocity(body.getLinearVelocity().x + moveFriction, body.getLinearVelocity().y);
    }
    if (body.getLinearVelocity().y > 0) {
        body.setLinearVelocity(body.getLinearVelocity().x, body.getLinearVelocity().y - moveFriction);
    } else if (body.getLinearVelocity().y < 0) {
        body.setLinearVelocity(body.getLinearVelocity().x, body.getLinearVelocity().y + moveFriction);
    }
    if (body.getAngularVelocity() > 0) {
        body.setAngularVelocity(body.getAngularVelocity() - turnFriction);
    } else if (body.getAngularVelocity() < 0) {
        body.setAngularVelocity(body.getAngularVelocity() + turnFriction);
    }

    // MAX SPEED
    if (body.getLinearVelocity().x > maxSpeed) {
        body.setLinearVelocity(maxSpeed, body.getLinearVelocity().y);
    } else if (body.getLinearVelocity().x < -maxSpeed) {
        body.setLinearVelocity(-maxSpeed, body.getLinearVelocity().y);
    }
    if (body.getLinearVelocity().y > maxSpeed) {
        body.setLinearVelocity(body.getLinearVelocity().x, maxSpeed);
    } else if (body.getLinearVelocity().y < -maxSpeed) {
        body.setLinearVelocity(body.getLinearVelocity().x, -maxSpeed);
    }

    // PLAYER MOVEMENT
    if (body.getAngle() >= 360) {
        body.setTransform(body.getPosition().x, body.getPosition().y, 0);
    }

    float xVel = -(MathUtils.sin(body.getAngle()) * moveSpeed);
    float yVel = MathUtils.cos(body.getAngle()) * moveSpeed;

    if (Gdx.input.isKeyPressed(Keys.LEFT)) {
        body.setAngularVelocity(turnSpeed);
    } else if (Gdx.input.isKeyPressed(Keys.RIGHT)) {
        body.setAngularVelocity(-turnSpeed);
    } else {
        body.setAngularVelocity(0);
    }
    if (Gdx.input.isKeyPressed(Keys.UP)) {
        body.setLinearVelocity(body.getLinearVelocity().x + xVel, body.getLinearVelocity().y + yVel);
    } else if (Gdx.input.isKeyPressed(Keys.DOWN)) {
        body.setLinearVelocity(body.getLinearVelocity().x - xVel, body.getLinearVelocity().y - yVel);
    }
    if (Gdx.input.isKeyJustPressed(Keys.SPACE)) {
        bullets.add(new Bullet(body.getPosition().x, body.getPosition().y, body.getAngle()));
    }

    // CAMERA MOVEMENT
    Game.b2dCam.position.set(body.getPosition().x, body.getPosition().y, 0);
    Game.cam.position.set(body.getPosition().x * Game.PPM, body.getPosition().y * Game.PPM, 0);

    for (int i = 0; i < bullets.size(); i++) {
        bullets.get(i).update(dt);
    }
}

public void render(SpriteBatch sb) {
    sb.setProjectionMatrix(Game.cam.combined);
    sprite.draw(sb);
    for (int i = 0; i < bullets.size(); i++) {
        bullets.get(i).render(sb);
    }
}

public void dispose() {
    tex.dispose();
    shape.dispose();
}

On this part of code i am trying to go where am i looking and it should work like this

float xVel = MathUtils.cos(body.getAngle()) * moveSpeed;
    float yVel = MathUtils.sin(body.getAngle()) * moveSpeed;

    if (Gdx.input.isKeyPressed(Keys.LEFT)) {
        body.setAngularVelocity(turnSpeed);
    } else if (Gdx.input.isKeyPressed(Keys.RIGHT)) {
        body.setAngularVelocity(-turnSpeed);
    } else {
        body.setAngularVelocity(0);
    }
    if (Gdx.input.isKeyPressed(Keys.UP)) {
        body.setLinearVelocity(body.getLinearVelocity().x + xVel, body.getLinearVelocity().y + yVel);
    } else if (Gdx.input.isKeyPressed(Keys.DOWN)) {
        body.setLinearVelocity(body.getLinearVelocity().x - xVel, body.getLinearVelocity().y - yVel);
    }

but when i do it like that the character moves sideways when i try to go forward

İf i change the cos and sin's places it works fine like that but it shouldn't

float xVel = -(MathUtils.sin(body.getAngle()) * moveSpeed);
    float yVel = MathUtils.sin(body.getAngle()) * moveSpeed;
1

There are 1 answers

1
MadEqua On BEST ANSWER

A possible cause is simply because your Player texture (the png/jpg itself) may not be pointing to the right, which is considered the 0 degree angle.

If that's the case the easiest solution is to edit the texture so that the player points to the right.

All of your code seems fine, except this:

// PLAYER MOVEMENT
if (body.getAngle() >= 360) {
    body.setTransform(body.getPosition().x, body.getPosition().y, 0);
}

where you compare radians with degrees. Anyway that if-clause should not be necessary, Box2D will already clamp the angle value between 0 and 2*PI.