如何检查xna上是否没有键输入

时间:2015-04-24 18:03:25

标签: c# xna-4.0

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,有没有人知道我怎么做。我已将整个代码放入这个问题,因为我没有使用字符类,而且我的编码水平在当前是非常基本的。

1 个答案:

答案 0 :(得分: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.
}