2013-04-03 2 views
-3

Я недавно задал вопрос, но до сих пор не понимаю, я имею в виду ответы были замечательными, но я просто не понимаю. Я пытаюсь заставить игрока прыгать выше, чем дольше удерживается пробел. Там также должен быть максимум на высоте.XNA - Держите дольше, чтобы прыгать выше (пример прилагается)

У меня есть пример класса игрока, и я пытаюсь добавить к нему такую ​​функцию. Если кто-то может взглянуть на этот класс, добавьте функцию, а затем, возможно, добавьте некоторые комментарии, чтобы помочь мне, я был бы очень признателен. - Спасибо.

Player.cs

namespace Jumping 

{

class Player 
{ 
    public Texture2D Texture; 

    public Vector2 Velocity; 
    public Vector2 Position; 
    public float ground; 
    private float Speed; 

    private Rectangle screenBound; 

    public bool isJumping; //are we jumping or not 
    public bool goingUp; //if going up or not 

    public float u; //initial velocity 
    private float jumpU; 
    private float g; //gravity 
    public float t; //time 

    private KeyboardState prevKB; 

    public Player(Texture2D Texture, Vector2 Position, float Speed, Rectangle screenBound) 
    { 
     this.Texture = Texture; 
     this.Position = Position; 
     ground = Position.Y; 
     this.Speed = Speed; 
     this.screenBound = screenBound; 
     Velocity = Vector2.Zero; 
     isJumping = goingUp = false; 
     jumpU = 2.5f; 
     g = -9.8f; 
     t = 0; 
    } 

    public void Update(GameTime gameTime) 
    { 

     Position.X += (Velocity.X * Speed); 
     //Set the Y position to be subtracted so that the upward movement would be done by decreasing the Y value 
     Position.Y -= (Velocity.Y * Speed); 

     goingUp = (Velocity.Y > 0); 

     // TODO: Add your update logic here 
     if (isJumping == true) 
     { 
      //motion equation using velocity: v = u + at 
      Velocity.Y = (float)(u + (g * t)); 
      //Increase the timer 
      t += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     } 
     if (isJumping == true && Position.Y > screenBound.Height - Texture.Height) 
     { 
      Position.Y = ground = screenBound.Height - Texture.Height; 
      Velocity.Y = 0; 
      isJumping = false; 
      t = 0; 
     } 

     if (Position.X < 0) 
     { 
      //if Texture touches left side of the screen, set the position to zero and the velocity to zero. 
      Position.X = 0; 
      Velocity.X = 0; 
     } 
     else if (Position.X + Texture.Width > screenBound.Width) 
     { 
      //if Texture touches left side of the screen, set the position to zero and the velocity to zero. 
      Position.X = screenBound.Width - Texture.Width; 
      Velocity.X = 0; 
     } 
     if (Position.Y < 0) 
     { 
      //if the Texture touches the top of the screen, reset the timer and set the initial velocity to zero. 
      Position.Y = 0; 
      t = 0; 
      u = 0; 
     } 
    } 

    public void Input(KeyboardState keyState) 
    { 
     if (keyState.IsKeyDown(Keys.Space) && (isJumping == false || Position.Y == ground)) 
     { 
      isJumping = true; 
      u = jumpU; 
     } 
     if (keyState.IsKeyDown(Keys.Left) && !keyState.IsKeyDown(Keys.Right)) 
     { 
      if (keyState.IsKeyDown(Keys.A)) 
      { 
       if (Velocity.X > -2.0f) 
       Velocity.X -= (1.0f/10); 
      } 
      else if (Velocity.X > -1.0f) 
      { 
       Velocity.X -= (1.0f/10); 
      } 
      else 
      { 
       Velocity.X = -1.0f; 
      } 
     } 
     else if (!keyState.IsKeyDown(Keys.Left) && keyState.IsKeyDown(Keys.Right)) 
     { 
      if (keyState.IsKeyDown(Keys.A)) 
      { 
       if (Velocity.X < 2.0f) 
       Velocity.X += (1.0f/10); 
      } 
      else if (Velocity.X < 1.0f) 
      { 
       Velocity.X += (1.0f/10); 
      } 
      else 
      { 
       Velocity.X = 1.0f; 
      } 
     } 
     else 
     { 
      if (Velocity.X > 0.05 || Velocity.X < -0.05) 
       Velocity.X *= 0.90f; 
      else 
       Velocity.X = 0; 
     } 

     prevKB = keyState; 
    } 

    public void Fall() 
    { 
     t = 0; 
     u = 0; 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(Texture, new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height), Color.White); 
    } 
} 

}

+0

Согласен, не начинайте задавать другой вопрос. – Clint

+0

Итак, я решил не спешить и помочь вам по последнему вопросу, но вместо этого вы просто дублируете то, как ваши последние ответы не помогли? Как это вас доставит? Если вы оставите комментарий по моему ответу на свой последний вопрос, я могу помочь исправить вашу проблему. – Cyral

ответ

2

Чтобы помочь вам и не запутать вас, я предложу подход, но он должен быть переработан позже.

В вашем методе ввода, добавляет:

public void Input(KeyboardState keyState) 
{ 
    newIsJumping = keyState.IsKeyDown(Keys.Space); 

    ... 

И в методе Update, можно использовать:

// TODO: Add your update logic here 
if (isJumping == true) 
{ 
    if (newIsJumping) u += 0.5f; // use some constant here 

    ... 

Я надеюсь, что это решит вашу проблему.

+0

Спасибо за помощь, но я добавил это в player.cs, и я получаю ошибку: Имя «newIsJumping» не существует в текущем контексте. Что я объявляю newIsJumping как? – user1631026

+1

Я думаю, что это то же самое, что isJumping. Итак, bool – phadaphunk

+0

Спасибо robson roase | PhaDaPhunk верхняя часть. – user1631026

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