2014-02-20 2 views
1

У меня есть следующий метод, вызванный в моем цикле обновления, чтобы проверить, нажата ли одна из двух кнопок.Порядок вызова методов - почему это важно в этом примере?

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

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

Кнопки просто прямоугольники, а если мышь находится над ними, и нажмите отпущена Checkbutton BOOL возвращает истинное:

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).

Я думаю, что состояния мыши не должны работать должным образом, но я не могу понять, почему.

ответ

3

Вы устанавливаете свой ПредыдущийMouseState каждый раз, когда вы проверяете.

Вы должны установить его один раз за кадр, самый простой способ сделать это внутри Update() функции:

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

    // code... 

    PreviousMouseState = CurrentMouseState 
} 

В противном случае он будет работать только для первого вызова вашей CheckButton() функции вместо каждого вызова ,

+0

Doh! Спасибо 15char – user2056166

+0

No problemo :) Я сделал это сам в прошлом ..: \ –

2

Как только кнопка отпущена, вы устанавливаете PreviousMouseState на номер ButtonState.Released при первом вызове CheckButton. Таким образом, второй вызов CheckButton никогда не может вернуть true (потому что PreviousMouseState почти всегда равен CurrentMouseState.LeftButton). Не устанавливайте PreviousMouseState до тех пор, пока оба оператора if.

+0

Спасибо - ответ на scott только потому, что он ответил первым – user2056166

Смежные вопросы