1

エラー...見てみましょう...私のプロジェクトにあるバグは...奇妙です。

モンスタートレーニングゲームを作っていますが、バトルモードに入ると、コントロールの左右のキーを押すと、バトルに入る前にバグが発生する場合があります。

バグは単純です。たとえば、A(別名左ボタン)を押すと、実行するアクションを選択できるようになると、ゲームは、Aボタンが押されていなくても、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;
    }


これが役立つかどうかはわかりませんが、C#コンソールにあった公式スクリプトの変更に基づいて作成されているため、そのスクリプトはスレッド上で実行されます。
また、ButtonPressプロシージャは、ボタンが押されると戻りますが、呼び出されるたびに新しいブール値を作成します。

何がバグを引き起こしているのかについての手がかりはありますか?

Procedures.ButtonPress(KeyCodes)スクリプト。

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;
}
4

1 に答える 1

0

XNA をダウンロードしてすべてをセットアップした後 (はい、私は仕事に飽きています)、シンプルなメニューでコードを試してみましたが、問題なく動作しました。

問題は、何らかの理由で XNA の入力がスレッド化できないことです。入力で別のスレッドを作成すると、まったく機能しません。さまざまなキーを試してみましたが、どれも押された状態になりませんが、文字「R」は一度押されるとそのままになります。

また、R を使用して元のキーボードの状態を保存しようとしました。状態が変化したら、元のキーボードを使用して、R が押されて機能したかどうかを比較しました。ただし、R が押されたことは一度だけわかり、もう一度押されたかどうかはわかりません。

私がグーグルで検索したすべてのことを行った後、更新メソッドのメインスレッドで常に入力を確認するための推奨事項を見つけました(最初に行ったように)

これが役立つことを願っています=)

于 2013-03-06T19:35:59.487 に答える