2015-10-22 4 views
0

Недавно я попал в моногейм, и я столкнулся с проблемой.Изменение спрайта игрока при нажатии клавиши

Я загрузил игровой спрайт, и у меня есть движение, но я хочу, чтобы изменить спрайт, когда я нажимаю вправо/влево. Я хочу, чтобы игрок опустился влево/вправо в соответствии с нажатием клавиши.

Это то, как выглядит мой текущий код, как вы можете видеть, я попытался добиться желаемого эффекта с помощью инструкции if, но я не был успешным.

class Player 
    { 
     public Texture2D PlayerTexture; //Animation representing the layer 
     public Texture2D moveLeft; 
     public Texture2D moveRight; 
     public Vector2 Position; //Position of the Player relative to the upper left side of the screen 
     public bool Active; //State of the player 
     public int Health; //Amount of hit points the player has 
     public int Width { get { return PlayerTexture.Width; } } //Get width of the player ship 
     public int Height { get { return PlayerTexture.Height; } } //Get height of the player ship 

     //Keyboard states used to determine key presses 
     KeyboardState currentKeyboardState; 
     KeyboardState previousKeyboardState; 

     //Mouse states used to track Mouse button press 
     MouseState currentMouseState; 
     MouseState previousMouseState; 

     float playerMoveSpeed; 

     //Player moving left or right 
     bool movingLeft; 
     bool movingRight; 

     public void Initialize(Texture2D texture, Vector2 position) 
     { 
      PlayerTexture = texture; 
      Position = position; //Set the starting position of the player around the middle of the screen and to the back 
      Active = true; //Set the player to be active 
      Health = 100; //Set the player health 

      //Set a constant player move speed 
      playerMoveSpeed = 8.0f; 
     } 

     public void PmovingLeft(Texture2D pmoveleft, Vector2 position) 
     { 
      moveLeft = pmoveleft; 
      Position = position; 
     } 

     public void PmovingRight(Texture2D pmoveright, Vector2 position) 
     { 
      moveRight = pmoveright; 
      Position = position; 
     } 

     public void Update() 
     { 
      //Save the previous state of the keyboard so we can determine single key presses 
      previousKeyboardState = currentKeyboardState; 

      //Read the current state of the keyboard and store it 
      currentKeyboardState = Keyboard.GetState(); 
     } 

     public void UpdatePlayer(GameTime gameTime) 
     { 
      //Keyboard controls 

      if (currentKeyboardState.IsKeyDown(Keys.Left)) 
      { 
       Position.X -= playerMoveSpeed; 
       movingLeft = true; 
      } 
      else { movingLeft = false; } 
      if (currentKeyboardState.IsKeyDown(Keys.Right)) 
      { 
       Position.X += playerMoveSpeed; 
       movingRight = true; 
      } 
      else { movingRight = false; } 
      if (currentKeyboardState.IsKeyDown(Keys.Up)) 
      { 
       Position.Y -= playerMoveSpeed; 
      } 
      if (currentKeyboardState.IsKeyDown(Keys.Down)) 
      { 
       Position.Y += playerMoveSpeed; 
      } 

      //Make sure that the player does not go out of bounds 
      Position.X = MathHelper.Clamp(Position.X, 0, Game1.screenWidth - Width); 
      Position.Y = MathHelper.Clamp(Position.Y, 0, Game1.screenHeight - Height); 
     } 

     public void Draw(SpriteBatch spriteBatch) 
     { 


      if (movingLeft) 
      { 
       spriteBatch.Draw(moveLeft, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); 
      } 
      else { spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } 
      if (movingRight) 
      { 
       spriteBatch.Draw(moveRight, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); 
      } 
      else { spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } 
      }   
     } 

Что делает этот код, так это перемещение игрока влево/вправо, но спрайт игрока не изменяется правильно. Если кто-то может помочь мне решить эту проблему, это будет фантастично. Заранее спасибо!

Game1.cs (основной класс игры) могут быть предоставлены по запросу

+0

Что происходит, когда вы нажимаете влево/вправо? Можете ли вы также указать код, в котором вы ссылаетесь на класс Player? – GMich

ответ

1

Вместо того, чтобы дело со всеми этими BOOLS, что я хотел бы сделать, это сделать Enum.

Таким образом, вы могли бы иметь Enum SpriteState с различными состояниями, а затем переменную для хранения currentSpriteState

Enum SpriteState 
{ 
    Left, 
    Right, 
    Straight 
} 

SpriteState currentSpriteState = SpriteState.Straight; 

Пример изменения состояний

//generic condition and state change 
if (condition) 
{ 
currentSpriteState = SpriteState.Left; 
} 
else if(condition) 
{ 
currentSpriteState = SpriteState.Right; 
} 
else currentSpriteState = SpriteState.Straight; 

Тогда есть случай переключения в Draw () на основе currentSpriteState

switch(currentSpriteState) 
{ 
    case SpriteState.Left: 
    spriteBatch.Draw(moveLeft, Position, null, Color.White, 0f, 
    Vector2.Zero, 1f, SpriteEffects.None, 0f); 
    break; 

    case SpriteState.Right: 
    spriteBatch.Draw(moveRight, Position, null, Color.White, 0f, 
    Vector2.Zero, 1f, SpriteEffects.None, 0f); 
    break; 

    case SpriteState.Straight: 
    spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f, 
    Vector2.Zero, 1f, SpriteEffects.None, 0f); 
    break; 
} 

Bools could technica lly work, но это намного чище и легко читается и может просто решить вашу проблему.

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