2013-03-31 9 views
7

Wykonuję grę Tic-Tac-Toe. Muszę sprawdzić, czy gracz kliknął na kwadrat, który już kliknął.XNA - Mouse.Left Button zostaje wykonany więcej niż raz w aktualizacji

Problem to błąd pojawia się w pierwszym kliknięciu. Mój kod aktualizacji:

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 jest ustawiony na 0, gdy lewy przycisk zostanie kliknięty. Moja macierz to macierz 3x3 do przechowywania informacji. Jeśli jest 0, co oznacza już clicked.So w pętli to było sprawdzić, czy store[i,j] == 0 następnie ustawić showerror do 1. Teraz w funkcji draw Zrobiłem to wezwanie do showerror

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

Problem jest, gdy klikam na pustym placu zamienia się w krzyżu, ale błąd dostaje shown.Please mi pomóc

Odpowiedz

10

Jak naprawić:

Dodaj nową zmienną globalną do przechowywania stanu myszy z poprzedniej ramki:

MouseState oldMouseState; 

Na samym początku (lub koniec) metodę aktualizacji, należy dodać to,

oldMouseState = mouse; 

I zastąpić

if (mouse.LeftButton == ButtonState.Pressed) 

z

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

Co to robi to sprawdź czy zrobiłeś jedno kliknięcie, po zwolnieniu klawisza i naciśnięciu, ponieważ czasami y możesz przytrzymać klawisz dla wielu klatek.

Podsumowując:

Ustawiając oldMouseState przed zaktualizować currentMouseState (lub po zakończeniu z nim), to Gwarantujemy że oldMouseState będzie jedna klatka za currentMouseState. Za pomocą tego można sprawdzić, czy przycisk był w poprzedniej klatce, ale już nie, i odpowiednio obsłużyć dane wejściowe. Dobry pomysł, aby rozszerzyć to napisać kilka metod przedłużających jak IsHolding(), IsClicking() itp

w prostych kodu:

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