2014-02-24 2 views
1

소행성을 기반으로 2D 게임을 만들고 있습니다. 그리고 그 경기에서 저는 배를 어떤 방향으로 밀어 넣을 필요가 있습니다.Monogame 방향으로 이동

우주선을 그릴 수있어 선회합니다. 그러나 그것이 앞으로 나아가는 것에 관해서는 내 문제가 계속된다.

저는이 문제에 대해 머리를 맞출 수없는 것 같습니다.

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

내가 닫거나 심각 오른쪽에서 오전 (이 모든 결정의 게임 것은 나를 ^^ 새로운이다)?

+0

'sVelocity * = speed' : 또한

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

를, 아마 같은 것을 사용하는 것이 바람직 할 것 :'speed'가'10'이고'sVelocity'가'(0,1)'이라면'(0100000000000000)'(''3,00 프레임)에서''* 프레임 당 100 만 단위). 그 라인이 예기치 않은 움직임의 측면에서 가장 큰 범인이라고 생각합니다 ... –

+0

@DanPuzey 그는 또한 모든 프레임에'sVelocity = Vector.Zero'를 가지고 있습니다. 그것은 아마 제어 할 수없는'속도'가치 그 자체 일 것입니다. – dureuill

+0

@dureuill : 아, 그 리셋을 놓쳤습니다. 당신은 아마도 맞을 것입니다. 과도한 속도를 제어하면 회전과 관련된 현상을 볼 수 있습니다. –

답변

3

sRotation은 각도이며, sVelocity은 속도입니다. 삼각법이 필요합니다.

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

가이 문제를 해결할 : 예를 들어

, 당신은 (내가 정확성에 대한 표지판을 테스트하지 않은) 그런 일을 사용할 수 있습니다?

편집 : "속도 저하"공식이 잘못되었습니다. 당신은 speedspeed/2를 추가, 당신을 따라 뭔가가 있어야합니다 매 프레임마다

당신이 할
if (speed > 0) { 
    speed -= 5; 
} else { 
    speed = 0; 
} 
+0

방금 ​​해 보았습니다. 하지만 여전히 작동하지 않습니다. 우주선이 프레임 밖에서 빠르게 움직이는 것 같아서 1000으로 나눠서 시도했지만 변화는 없었습니다. –

+2

흠 ... 아마 cos과 sin이 라디안을 사용하고도를 사용합니까? 또한 몇 번 반복 한 후에 디버거에서'speed' 값을 얻을 수 있습니까? 필자가 큰 가치가 있다고 생각하는 느낌이 들었습니다 ... 아마 몇 가지 테스트에서 1로 고정시킬 수 있습니다. – dureuill

+0

내가 사용하고있는 것을 어떻게 확인할 수 있습니까? 속도가 마이너스에서 플러스 값 사이에서 점프합니다. –