2015-04-24 3 views
1
public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    Texture2D walkRight, walkUp, walkLeft, walkDown, currentWalk, TitleScreen, stand; 
    Rectangle destRect; 
    Rectangle sourceRect; 
    KeyboardState ks; 
    Vector2 position = new Vector2(); 
    bool isGrounded; 
    bool isStanding; 
    float fallSpeed = 5; 

    enum GameStates { Titlescreen, Playing, PlayerDead, GameOver }; 
    GameStates gameStates = GameStates.Titlescreen; 

    float elapsed; 
    float delay = 200f; 
    int frames = 0; 

    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 
    } 

    protected override void Initialize() 
    { 
     destRect = new Rectangle(50, 50, 50, 50); 
     base.Initialize(); 
    } 

    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 

     walkRight = Content.Load<Texture2D>("walkRight"); 
     walkUp = Content.Load<Texture2D>("walkUp"); 
     walkLeft = Content.Load<Texture2D>("walkLeft"); 
     walkDown = Content.Load<Texture2D>("walkDown"); 
     TitleScreen = Content.Load<Texture2D>("TitleScreen"); 
     stand = Content.Load<Texture2D>("SpriteStill"); 
     currentWalk = walkRight; 
    } 

    protected override void UnloadContent() 
    { 
    } 

    private void Animate(GameTime gameTime) 
    { 
     elapsed += (float)gameTime.ElapsedGameTime.TotalMilliseconds; 

     if (elapsed >= delay) 
     { 
      if (frames >= 3) 
      { 
       frames = 0; 
      } 
      else 
      { 
       frames++; 
      } 
      elapsed = 0; 
     } 
     sourceRect = new Rectangle(50 * frames, 0, 50, 50); 
    } 

    protected override void Update(GameTime gameTime) 
    //{ 
     //switch (gameStates) 
    { 
     if (position.Y >= Window.ClientBounds.Height - 50) 
     { 
      position.Y = Window.ClientBounds.Height - 50; 
      isGrounded = true; 
     } 
     if (position.X >= Window.ClientBounds.Width - 50) 
     { 
      position.X = Window.ClientBounds.Width - 50; 
     } 
     if (position.X <=0) 
     { 
      position.X = 0; 
     } 
     if (position.Y <= 0) 
     { 
      position.Y = 0; 
     } 

     ks = Keyboard.GetState(); 

     if (ks.IsKeyDown(Keys.Right)) 
     { 
      position.X += 3f; 
      currentWalk = walkRight; 
     } 
     if (ks.IsKeyDown(Keys.Left)) 
     { 
      position.X -= 3f; 
      currentWalk = walkLeft; 
     } 

     if (ks.IsKeyDown(Keys.Down)) 
     { 
      position.Y += 3f; 
      currentWalk = walkDown; 
     } 

     Animate(gameTime); 

     destRect = new Rectangle((int)position.X, (int)position.Y, 50, 50); 

     FallManagement(gameTime); 

     base.Update(gameTime); 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 

     spriteBatch.Begin(); 
     spriteBatch.Draw(currentWalk, destRect, sourceRect, Color.White); 
     spriteBatch.End(); 

     base.Draw(gameTime); 
    } 

    void FallManagement(GameTime gameTime) 
    { 
     position.Y += fallSpeed; 
     if (isGrounded == false) 
     { 
      fallSpeed = 5; 
     } 

     if (ks.IsKeyDown(Keys.Up) && isGrounded) 
     { 
      fallSpeed -= 40; 

      isGrounded = false; 
     } 
    } 
} 

В настоящее время я создаю очень базовую платформу XNA для одного курса колледжа. В настоящее время я пытаюсь добавить заявление, в котором говорится, что если никакие клавиши не нажаты, загрузите текстуру 2d для символа, стоящего неподвижно, но я не уверен, как проверить, нет ли нажатых клавиш вообще. В основном, я хотел бы проверить, движется ли персонаж, и если текстура для персонажа не будет установлена ​​на постоянный png, кто-нибудь знает, как я могу это сделать. Я поставил весь код в этот вопрос, потому что я не использую класс символов, и мой уровень кодирования является чрезвычайно простым в текущем.Как проверить, нет ли входов ключей на xna

ответ

1

Может быть что-то, как это будет работать для вас:

ks = Keyboard.GetState(); 
bool isMoving = false; 

if (ks.IsKeyDown(Keys.Right)) 
{ 
    position.X += 3f; 
    currentWalk = walkRight; 
    isMoving = true; 
} 
if (ks.IsKeyDown(Keys.Left)) 
{ 
    position.X -= 3f; 
    currentWalk = walkLeft; 
    isMoving = true; 
} 

if (ks.IsKeyDown(Keys.Down)) 
{ 
    position.Y += 3f; 
    currentWalk = walkDown; 
    isMoving = true; 
} 

if (!isMoving) 
{ 
    //Do whatever you need to do when the player is still here 
} 

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

Или, если вы хотите, чтобы убедиться, что ни одна клавиша не будет нажата какая-так всегда:

if (ks.GetPressedKeys() == null || ks.GetPressedKeys().Length == 0) 
{ 
    //No keys pressed at all. (not sure if GetPressedKeys returns null 
    //or zero length array, check when in debug then remove one. 
} 
+0

Большое спасибо, это работает как сон, у меня есть проблема, что при загрузке текстуры он все равно мигает и включается, но это, вероятно, до тех пор, пока не будут выполнены измерения спрайтов на png. Мне нравится учиться C# в колледже, но многие люди думают, что вы идиот, если вы не знаете, как его кодировать. Спасибо, что оставили комментарий, который относится ко мне как к другому человеку, я очень ценю его –