1

ゲームのメイン メニューを作成しようとしていますが、領域をタップ (または左クリック) するとこれらの問題が発生します。WP7 の多くのゲーム メニューで、クリックを離すと何かが実行されるのを見てきました。押したときに画像を表示し、離したときに音を出そうとしています。

これはどのように可能ですか?

これが私のコードです:

//putoClick's = Mouse.GetState();
//clickarea = the same dimensions as putoClick; 
if (putoClick.LeftButton == ButtonState.Pressed)
{
    mouseClick = new Rectangle(putoClick.X, putoClick.Y, 30, 20);

    if (clickArea.Intersects(mouseClick))
    {
        spriteBatch.Draw(imgB, btnPos, Color.White);

        btnMenuClickSound.Play();

    }
    else
    {
        spriteBatch.Draw(imgBs, btnPosN, Color.White);
    }

    putoClick = Mouse.GetState();

    //....
}

代わりに、ボタンが押されるたびにサウンドが常に再生されます。プレスとリリースで作業しようとしましたが、うまくいきませんでした。私の変数名を許してください笑それは簡単なテストです。前もって感謝します

4

3 に答える 3

3

2 つのマウス状態を保持するマウス処理クラスを作成する必要があります。このフレームと前のフレーム。これら 2 つの状態の間のボタン状態の変化をチェックします。何かのようなもの

MouseState newState = Mouse.getState();    
if(oldState.LeftButton == ButtonState.Pressed && newState.LeftButton == ButtonState.Released){
    // click released
    // TODO : add your on released code here
}
if(newState.LeftButton == ButtonState.Pressed && oldState.LeftButton == ButtonState.Released)
{
    // pressed for the first time
    // TODO : add  your on clicked code here
}
if(newState.LeftButton == ButtonState.Pressed)
{ 
    // left mouse button is down
    // TODO : add your on left button down logic
}
// "remember" this frame's state for use in the next frame.
oldState = newState;

フレームごとにこのメソッドを呼び出して (更新)、完了です。(マウス ハンドラー クラスで内部ブール値を更新し、ゲーム コードが必要に応じてこのブール値を読み取るようにすることで、入力をロジックから完全に分離したい場合がありますが、それはゲームのニーズ次第です。

于 2013-04-02T06:00:40.640 に答える
1

音が鳴り続ける理由は、次の 2 つの条件のbtnMenuClickSound.Play();中で呼び出しが発生したためです。if

  • 左ボタンが下がっている
  • そして、クリック領域がクリックされました

したがって、これら 2 つの条件が真である限り、サウンドは再生されます。

そのため、コードを少し移動し、ブール値フラグを使用して、ボタンを押したかどうかを追跡し、その状態が変化した場合に解決策を見つけることができます!

// a private class member - NOT to be declared within the function
bool buttonClicked = false;

 

if (putoClick.LeftButton == ButtonState.Pressed)
{
    mouseClick = new Rectangle(putoClick.X, putoClick.Y, 30, 20);

    //if the button was clicked with the left mouse button
    //buttonClicked will be true, otherwise false.
    buttonClicked = clickArea.Intersects(mouseClick);
}
else if(buttonClicked && putoClick.LeftButton == ButtonState.Released)
{
    //The button was clicked last frame, but the mouse is now up
    //play the sound!
    btnMenuClickSound.Play(); 
}

//the mouse button is released, therefore the button is not clicked
if(putoClick.LeftButton == ButtonState.Released)
    buttonClicked = false;   

//draw the appropriate graphic depending on 
//whether or not the button has been clicked.
if(buttonClicked)
    spriteBatch.Draw(imgB, btnPos, Color.White);
else
    spriteBatch.Draw(imgBs, btnPosN, Color.White);

putoClick = Mouse.GetState(); //also, i presume this needs to be here instead?

ボタンがクリックされたかどうかを追跡することにしました。これは、再生されるサウンドは、ボタンをクリックした後にマウスを離したときにのみ再生される必要があることを理解しているためです。

于 2013-04-02T06:01:59.853 に答える
1

あなたがここに書いたのは:

ボタンが押されている場合は A を実行 ボタンが押されていない場合は B を実行

あなたが書きたかったのは

ボタンが押された場合は、ボタンが押されていないことを WAIT し、B を実行した場合のみ

秘訣は、ボタンを最後の状態に保つことです

于 2013-04-02T05:58:18.223 に答える