2013-03-31 13 views
7

Ich mache ein Tic-Tac-Toe-Spiel. Ich muss prüfen, ob ein Spieler auf ein Feld klickt, auf das er bereits geklickt hat.XNA - Mouse.Left Button wird mehr als einmal in Update ausgeführt

Problem ist Fehler wird im ersten Klick selbst angezeigt. Mein Update-Code ist:

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 auf 0 gesetzt wird, wenn die linke Taste angeklickt wird. Meine Matrix ist eine 3x3-Matrix zum Speichern von Informationen. Wenn es 0 ist, das heißt, es bereits clicked.So in der Schleife prüfe ich war, wenn store[i,j] == 0 dann showerror auf 1 Jetzt in der Zeichenfunktion eingestellt habe ich diesen Aufruf für Error-

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

Problem ist, wenn ich klicken auf leeren Platz verwandelt es sich in Quer aber Fehler wird mir

Antwort

10

Wie shown.Please helfen beheben: eine neue globale Variable

Fügen sie den Mausstatus von dem vorhergehenden Rahmen zu speichern:

MouseState oldMouseState; 

Gleich am Anfang (oder Ende) Ihres Update-Methode, fügen Sie diese,

oldMouseState = mouse; 

Und

if (mouse.LeftButton == ButtonState.Pressed) 

mit

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

ersetzen Was das bedeutet ist überprüfen Sie, ob Sie einen Klick gemacht haben, lassen Sie die Taste los und drücken Sie dann, weil manchmal y Sie können den Schlüssel für mehrere Bilder halten.

Zur Rekapitulation:

von oldMouseState Einstellung, bevor Sie die currentMouseState aktualisieren (oder nachdem Sie mit ihm fertig sind), können Sie garantieren, dass oldMouseState einen Frame hinter currentMouseState sein wird. Mit diesem können Sie überprüfen, ob eine Schaltfläche den vorherigen Frame nicht mehr gedrückt hat, und die Eingabe entsprechend bearbeiten. Eine gute Idee, diese zu erweitern ist, einige Erweiterungsmethoden wie IsHolding() schreiben, IsClicking() usw.

In einfachen Code:

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