2013-03-31 41 views
7

Tôi đang tạo trò chơi Tic-Tac-Toe. Tôi cần kiểm tra xem người chơi có đang nhấp vào một hình vuông mà họ đã nhấp vào không.XNA - Nút Mouse.Left được thực thi nhiều lần trong Bản cập nhật

Lỗi sự cố được hiển thị trong chính lần nhấp đầu tiên. mã cập nhật của tôi là:

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 được đặt thành 0 bất cứ khi nào nút trái được nhấp. Ma trận của tôi là ma trận 3x3 để lưu trữ thông tin. Nếu nó là 0 có nghĩa là nó đã được đã clicked.So trong vòng lặp để kiểm tra xem store[i,j] == 0 sau đó thiết lập showerror để 1. Bây giờ trong chức năng vẽ tôi đã thực hiện cuộc gọi này cho showerror

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

Vấn đề là bất cứ khi nào tôi bấm trên vuông rỗng nó biến thành cross nhưng lỗi được shown.Please giúp tôi ra

Trả lời

10

Làm thế nào để Fix:

Thêm một biến toàn cầu mới để lưu trữ trạng thái chuột từ frame trước:

MouseState oldMouseState; 

Lúc đầu (hoặc cuối) của phương pháp cập nhật của bạn, thêm này,

oldMouseState = mouse; 

Và thay

if (mouse.LeftButton == ButtonState.Pressed) 

với

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

Điều này không là kiểm tra xem bạn đã thực hiện một cú nhấp chuột chưa, sau đó nhấn phím, vì đôi khi y Bạn có thể giữ phím cho nhiều khung hình.

Để Tóm tắt:

Bằng cách đặt oldMouseState trước khi bạn cập nhật các currentMouseState (Hoặc sau khi bạn đang thực hiện với nó), bạn garantee rằng oldMouseState sẽ là một khung đằng sau currentMouseState. Sử dụng điều này bạn có thể kiểm tra xem một nút đã được xuống khung trước đó, nhưng không phải nữa, và xử lý đầu vào cho phù hợp. Một ý tưởng tốt để mở rộng này là viết một số phương pháp khuyến nông như IsHolding(), IsClicking() vv

Trong mã đơn giản:

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