调用方法的顺序 - 为什么在这个例子中重要?

时间:2014-02-20 22:56:59

标签: c# xna

我在更新循环中调用了以下方法来检查是否按下了两个按钮之一。

    private void CheckInputs()
    {
        if (CheckButton(startNewGameButtonTexture, startNewGameButtonPosition))
        {
           //break 1 is here
        }

        if (CheckButton(continueCareerButtonTexture, continueCareerButtonPosition))
        {
           //break 2 is here
        }
    }

按钮只是矩形,如果鼠标位于它们之上,并且释放了单击,则CheckButton bool返回true:

    public bool CheckButton(Texture2D texture, Vector2 vector)
    {
        MouseState CurrentMouseState = Mouse.GetState();
        bool outcome;

        if (CurrentMouseState.X > vector.X && CurrentMouseState.X < vector.X + texture.Width &&
            CurrentMouseState.Y > vector.Y && CurrentMouseState.Y < vector.Y + texture.Height)
        {
            if (CurrentMouseState.LeftButton == ButtonState.Released && PreviousMouseState == ButtonState.Pressed)
            {
                outcome = true;
            }
            else
            {
                outcome = false;
            }
        }
        else
        {
            outcome = false;
        }

        PreviousMouseState = CurrentMouseState.LeftButton;
        return outcome;
    }

在当前顺序中,startNewGameButton工作(即调试在中断1停止),但continueCareerButton不起作用(单击按钮不会触发中断2)。

但是,如果我将支票的顺序更改为:

    private void CheckInputs()
    {
        if (CheckButton(continueCareerButtonTexture, continueCareerButtonPosition))
        {
           //break 2 is here
        }

        if (CheckButton(startNewGameButtonTexture, startNewGameButtonPosition))
        {
           //break 1 is here
        }
    }

continueCareerButton现在正常工作(中断2),但startNewGameButton现在不起作用(中断1)。

我认为鼠标状态一定不能正常工作,但我找不到原因。

2 个答案:

答案 0 :(得分:3)

每次检查时都要设置PreviousMouseState。

你应该每帧设置一次,最简单的方法是在Update()函数内:

void Update(..) {
    CurrentMouseState := Mouse.GetState()

    // code...

    PreviousMouseState = CurrentMouseState
}

否则它只能用于CheckButton()功能的第一次呼叫,而不是每次通话。

答案 1 :(得分:2)

只要该按钮被释放,您就会在第一次调用PreviousMouseState时将ButtonState.Released设置为CheckButton。因此,对CheckButton的第二次调用永远不会返回true(因为PreviousMouseState几乎总是等于CurrentMouseState.LeftButton)。在两个if语句之后都不要设置PreviousMouseState