C# c上奇怪的输入错误#

C# c上奇怪的输入错误#,c#,multithreading,input,xna-4.0,C#,Multithreading,Input,Xna 4.0,呃……让我看看……我的项目有一个……奇怪的bug。 我正在制作一个怪物训练游戏,当它进入战斗模式时,在你进入战斗之前,一旦你按下控制按钮左侧或右侧的键,可能会发生错误。 这个错误很简单,例如,如果你按下一个按钮(又名左按钮),当它让你选择你将要采取的行动时,游戏会继续识别,就好像A按钮仍然被按下一样,即使它没有被按下。 这是导致错误的代码: public static int ChooseAction() { int choosen = 0; Ba

呃……让我看看……我的项目有一个……奇怪的bug。

我正在制作一个怪物训练游戏,当它进入战斗模式时,在你进入战斗之前,一旦你按下控制按钮左侧或右侧的键,可能会发生错误。

这个错误很简单,例如,如果你按下一个按钮(又名左按钮),当它让你选择你将要采取的行动时,游戏会继续识别,就好像A按钮仍然被按下一样,即使它没有被按下。

这是导致错误的代码:

    public static int ChooseAction()
    {
        int choosen = 0;
        Battle.CanAct = true;
        Battle.ChoosenAction = -1;
        while (Battle.ChoosenAction == -1)
        {
            if (Battle.KeyDelay == 0)
            {
                if (Procedures.ButtonPressed(Procedures.KeyCodes.KeyRight))
                {
                    Battle.KeyDelay = 64;
                    int a = Battle.SelectedAction;
                    a++;
                    if (a >= BattleActions.Length)
                    {
                        a -= BattleActions.Length;
                    }
                    Battle.SelectedAction = a;
                }
                else if (Procedures.ButtonPressed(Procedures.KeyCodes.KeyLeft))
                {
                    Battle.KeyDelay = 64;
                    int a = Battle.SelectedAction;
                    a--;
                    if (a < 0)
                    {
                        a += BattleActions.Length;
                    }
                    Battle.SelectedAction = a;
                }
                else if (Procedures.ButtonPressed(Procedures.KeyCodes.Action))
                {
                    Battle.ChoosenAction = Battle.SelectedAction;
                }
            }
            if (KeyDelay != 0 && !Procedures.ButtonPressed(Procedures.KeyCodes.KeyRight) && !Procedures.ButtonPressed(Procedures.KeyCodes.KeyLeft))
            {
                KeyDelay = 0;
            }
            if (Battle.KeyDelay > 0)
            {
                Battle.KeyDelay--;
            }
        }
        choosen = Battle.ChoosenAction;
        Battle.CanAct = false;
        return choosen;
    }

在下载XNA并设置好所有内容后(是的,我对工作感到厌烦),我在一个简单的菜单上尝试了代码,它工作得完美无缺

问题在于,出于某种原因,XNA的输入不可线程化。当我用输入创建另一个线程时,它对我根本不起作用。我试过各种按键,没有一个按键处于按下状态,但字母“R”一旦按下,就会保持这种状态

我还试着用R保存原始键盘状态,一旦状态改变,就用原始键盘来比较R是否被按下,它是否工作。然而,你只会知道R被按下一次,你不知道它是否再次被按下

在做了所有这些之后,我在谷歌上搜索并找到了一些建议,建议您在更新方法的主线程上始终检查您的输入(正如我最初所做的那样)


希望这能有所帮助=)

您可以不按按钮而利用按钮的上/下活动吗?一旦按钮被释放-退出循环。我认为它不起作用,而且,玩家会发现它很烦人,按向上或向下按钮调试它,如果这样做是解决方案,但肯定不是…而且,你的建议没有起作用。我们能得到程序代码吗。按钮按下?也许虫子在那里。我们还可以使用另一种方法来更改该方法,以检查是否有键控,并查看这是否解决了问题,签出主帖子。哇,这是出乎意料的。顺便说一句,我必须找到一种使用非线程方式检查输入的方法。感谢您的帮助。修复了错误,在绘图脚本上,这不是在线程上,我添加了控制脚本,现在唯一的问题是fps太极端了,菜单切换太快了,但是这个我能处理,再次感谢你的帮助。没问题!很高兴我能帮忙。这对我来说也是出乎意料的。您可能知道这一点,但可以使用Gametime类限制特定的内容。检查游戏时间的增量,如果它太小,你可以忽略输入动作。
public static bool ButtonPressed(KeyCodes buttonKey)
{
    bool pressed = false;

    switch (buttonKey)
    {
        case KeyCodes.MenuKey:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.M) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.Start))
                pressed = true;
            break;

        case KeyCodes.RunKey:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.LeftShift) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.RightShift) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.B))
                pressed = true;
            break;

        case KeyCodes.KeyUp:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.W) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadUp))
                pressed = true;
            break;

        case KeyCodes.KeyDown:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.S) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadDown))
                pressed = true;
            break;

        case KeyCodes.KeyLeft:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadLeft))
                pressed = true;
            break;

        case KeyCodes.KeyRight:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadRight))
                pressed = true;
            break;

        case KeyCodes.Action:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Enter) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.A))
                pressed = true;
            break;

        case KeyCodes.Return:
            if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.B))
                pressed = true;
            break;
    }
    return pressed;
}