C# - 仅在执行时首先执行(XNA / Keypress)

时间:2017-07-27 17:14:11

标签: c# monogame

我在Monogame程序中创建自己的输入系统,现在 我在这里的if语句有问题:

public static void Input()
    {
        if (IsKeyPressed(Keys.Space))
        {
            Cursor.X += 25;
        }

        if (IsKeyPressed(Keys.Back))
        {
            Words.Last().RemoveLetter();
            Cursor.X -= 25;
        }

        if (IsKeyPressed(Keys.A))
        {
            Words.Last().AddLetter(new Letter(Letters.A, Cursor));
            Cursor.X += 25;
        }
    }

static bool IsKeyPressed(Keys key)
    {
        keyState = Keyboard.GetState();

        if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key))
        {
            prevKeyState = keyState;
            return true;
        }
        else
        {
            prevKeyState = keyState;
            return false;
        }
    }

好的,在我的方法中输入I检查按键,程序中的结果是我在第一个IF语句中放入的任何键,该键都可以工作,所以如果我改变'A'现在是'Space', A会工作而Space不会......

为什么其他ifs总是假的?

修改

好的,实际上,如果我的IsKeyPressed()方法看起来像这样(没有prevKeyState变量):

   static bool IsKeyPressed(Keys key)
    {
        keyState = Keyboard.GetState();

        if (keyState.IsKeyDown(key))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

然后它可以工作:/但是我需要那个preKeyState变量,因为我想,无论我持有多长时间,只需打印一个字母a,直到我释放该键:/

2 个答案:

答案 0 :(得分:0)

有类似的问题。通过将新旧KeyboardState传递给函数解决了这个问题。结束这样的工作正常。

public void HandleKeyStroke(KeyboardState ks, KeyboardState oldks)
{
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_0) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_0))
        UIManager.actionToBeTriggered("actionbar_0");
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_1) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_1))
        UIManager.actionToBeTriggered("actionbar_1");
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_2) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_2))
        UIManager.actionToBeTriggered("actionbar_2");
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_3) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_3))
        UIManager.actionToBeTriggered("actionbar_3");
    if (ks.IsKeyDown(GameplayButtons.CHARACTER) && oldks.IsKeyUp(GameplayButtons.CHARACTER))
        UIManager.ToggleWindowById("button_Character");
}

可能有一些更清洁的解决方案,特别是如果你有更多按钮需要处理。

答案 1 :(得分:0)

好的,所以解决这个问题并不难,我只是没想到,但是 使用Input方法而不是IsKeyPressed bool方法修改KeyboardStates修复了所有内容:

static bool IsKeyPressed(Keys key)
    {
        if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public static void Input()
    {
        keyState = Keyboard.GetState();

        if (IsKeyPressed(Keys.Space))
        {
            Cursor.X += 25;
        }

        else if (IsKeyPressed(Keys.Back))
        {
            Words.Last().RemoveLetter();
            Cursor.X -= 25;
        }

        else if (IsKeyPressed(Keys.A))
        {
            Words.Last().AddLetter(new Letter(Letters.A, Cursor));
            Cursor.X += 25;
        }

        prevKeyState = keyState;
    }

我不确定它有什么不同,如果有人可以详细解释那会很棒

PS。由于声誉不佳,我无法支持任何人,但感谢大家分享你的想法,这很有帮助