問題

私はTic-Tac-Toeゲームを作っています。プレイヤーが既にクリックした四角形をクリックしているかどうかを確認する必要があります。

問題は、最初のクリック自体にエラーが表示されることです。 私の更新コードは:

     MouseState mouse = Mouse.GetState();
    int x, y;
    int go = 0;
    if (mouse.LeftButton == ButtonState.Pressed)
    {
        showerror = 0;
        gamestate = 1;
        x = mouse.X;
        y = mouse.Y;
        int getx = x / squaresize;
        int gety = y / squaresize;
        for (int i = 0; i < 3; i++)
        {
            if (go == 1)
            {
                break;
            }
            for (int j = 0; j < 3; j++)
            {
                if (getx == i && gety == j)
                {
                    if (storex[i, j] == 0)
                    {
                       showerror = 1;
                    }
                    go = 1;
                    if (showerror != 1)
                    {
                        loc = i;
                        loc2 = j;
                        storex[i, j] = 0;
                        break;
                    }
                }
            }
        }
    }
 

showerrorは、左ボタンをクリックするたびに0に設定されます。私の行列は情報を格納するための3x3行列です。それが0の場合、それはすでにclickedされていることを意味します。ループでは、store[i,j] == 0をチェックし、showerrorを1に設定します。 今描画関数で私はshowerrorのためにこの呼び出しを行いました

 spriteBatch.Begin();
if (showerror == 1)
{
    spriteBatch.Draw(invalid, new Rectangle(25, 280, 105, 19), Color.White);                                        
}
spriteBatch.End();
 

問題は、空の四角形をクリックするたびにクロスに変わりますが、エラーが発生します。

  ベストアンサー

修正方法:

前のフレームからマウス状態を格納する新しいグローバル変数を追加します。

 MouseState oldMouseState;
 

更新メソッドの最初(または最後)で、これを追加します。

 oldMouseState = mouse;
 

置き換える

 if (mouse.LeftButton == ButtonState.Pressed)
 

〜と

 if (mouse.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton == ButtonState.Released)
 

これは、キーをリリースしてから押すことを1回クリックしたかどうかをチェックすることです。なぜなら、複数のフレームのキーを保持することがあるからです。

Recapへ:

currentMouseStateを更新する前にoldMouseStateを設定することで、oldMouseStatecurrentMouseStateの背後に1つのフレームになります。これを使用すると、ボタンが前のフレームの下にあったかどうかを確認できますが、それに応じて入力を処理できます。これを拡張する良いアイデアは、IsHolding()IsClicking()などの拡張メソッドを書くことです。

簡単なコードでは:

 private MouseState oldMouseState, currentMouseState;
protected override void Update(GameTime gameTime)
{
     oldMouseState = currentMouseState;
     currentMouseState = Mouse.GetState();
     //TODO: Update your code here
}
 

  同じタグがついた質問を見る

c#inputxnaxna-4.0