Question

I'm creating a 2D game based on asteroids. And In that game I need to thrust the ship in a direction.

I'm able draw the ship, so that it turns around. But when it comes to moving it forward my problem occours.

I don't seem to be able to get my head around this. (This whole making games thing is new to me ^^)

The player.cs

protected Vector2 sVelocity;
protected Vector2 sPosition = Vector2.Zero;
protected float sRotation;
private int speed;

public Player(Vector2 sPosition)
        : base(sPosition)
{
    speed = 100;
}

public override void Update(GameTime gameTime)
{
    attackCooldown += (float)gameTime.ElapsedGameTime.TotalSeconds;

    // Reset the velocity to zero after each update to prevent unwanted behavior
    sVelocity = Vector2.Zero;

    // Handle user input
    HandleInput(Keyboard.GetState(), gameTime);

    if (sPosition.X <= 0)
    {
        sPosition.X = 10;
    }

    if (sPosition.X >= Screen.Instance.Width)
    {
        sPosition.X = 10;
    }

    if(sPosition.Y <= 0)
    {
        sPosition.Y = 10;
    }

    if (sPosition.Y >= Screen.Instance.Height)
    {
        sPosition.Y = 10;
    }

    // Applies our speed to velocity
    sVelocity *= speed;

    // Seconds passed since iteration of update
    float deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;

    // Multiplies our movement framerate independent by multiplying with deltaTime
    sPosition += (sVelocity * deltaTime);

    base.Update(gameTime);
}

private void HandleInput(KeyboardState KeyState, GameTime gameTime)
{
    if (KeyState.IsKeyDown(Keys.W))
    {
        //Speed up
        speed += 10;
        sVelocity.X = sRotation; // I know this is wrong
        sVelocity.Y = sRotation; // I know this is wrong
    }
    else
    {
        //Speed down
        speed += speed / 2;
    }

    if (KeyState.IsKeyDown(Keys.A))
    {
        //Turn left
        sRotation -= 0.2F;
        if (sRotation < 0)
        {
            sRotation = sRotation + 360;
        }
    }
    if (KeyState.IsKeyDown(Keys.D))
    {
        //Turn right
        sRotation += 0.2F;
        if (sRotation > 360)
        {
            sRotation = sRotation - 360;
        }
    }
}

Am I close, or seriously far from right?

Was it helpful?

Solution

sRotation is an angle, sVelocity is a velocity. You need trigonometry.

for instance, you could use something like that (I didn't test the signs for correctness):

 if (KeyState.IsKeyDown(Keys.W))
    {
        //Speed up
        speed += 10;
        sVelocity.X = Math.cos(sRotation * 2 * Math.PI / 360);
        sVelocity.Y = -Math.sin(sRotation * 2 * Math.PI / 360);
    }

Would that solve your problem?

EDIT: your "speed down" formula is wrong. You are currently adding speed/2 with speed, you should have something along:

speed = speed / 2; // note the "=", not "+="

Also, it would probably be preferable to use something like:

if (speed > 0) { 
    speed -= 5;
} else {
    speed = 0;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top