2015-06-20 11 views
0

Я строю сверху вниз шутер, как Counter Strike 2D есть проблема с velecity:Libgdx Тригонометрия Неправильный угол

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(); 
} 

В этой части кода я пытаюсь идти туда, куда я смотрю, и он должен работать как это

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); 
    } 

но когда я это сделать, как, что персонаж движется в сторону, когда я стараюсь идти вперед

если изменить сов и места для Sin это работает прекрасно, как это, но это не должно

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

ответ

0

Возможная причина является просто потому, что ваша текстура игрока (сама PNG/JPG) не может быть направлена ​​вправо, который считается углом 0 градусов.

Если это так, самым простым решением является отредактирование текстуры, чтобы игрок указывал на право.

Все код кажется нормально, кроме этого:

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

где вы сравните радиан со степенями. Во всяком случае, что if-clause не требуется, Box2D уже будет зажимать значение угла между 0 и 2 * PI.

+0

Спасибо за ваш ответ. Я нашел проблему, я думал, что север - 0 градусов в box2D, но я понял, что 0 градусов - это восток. Вот почему мой игрок двигался боком. – Crystale

Смежные вопросы