2015-09-08 15 views
1

我在MonoGame中開發遊戲並決定創建自己的按鈕類。爲了確定這些按鈕是否被點擊,我確定它們是否在按鈕的邊界,並且如果鼠標左鍵被按下。這導致了兩個問題。確定點擊按鈕的更好方法

  1. 鼠標點擊不需要的按鈕內啓動,並立即登記,而不是鼠標按鈕被釋放後(按鈕的範圍內。)
  2. 在不同的屏幕當多個按鈕在同一區域,由於鼠標按鈕釋放速度不夠快,導致點擊它們。

如何使點擊更像WinForm按鈕?

回答

0

爲了使mouseclicking有效地工作,你應該做到以下幾點:

,我們首先要做的是創建一個MouseInput類,它應該跟蹤像mouseState,lastMouseState,MouseX,MouseY等東西。 mouseState和lastMouseState一起工作來處理1次單擊。但現在你可以這個類只需添加到您的項目:

class MouseInput 
    { 
     private static MouseState mouseState; 
     private static MouseState lastMouseState; 


     public static MouseState MouseState 
     { 
      get { return mouseState; } 
      set { mouseState = value; } 
     } 

     public static MouseState LastMouseState 
     { 
      get 
      { 
       return lastMouseState; 
      } 
      set 
      { 
       lastMouseState = value; 
      } 
     } 

     public MouseInput() 
     { 
     } 
     public static int getMouseX() 
     { 
      return Mouse.GetState().X; 
     } 

     public static int getMouseY() 
     { 
      return Mouse.GetState().Y; 
     } 
    } 

後,你這樣做,你要開始loooking一個鼠標點擊您的每次更新方法被執行:

MouseInput.LastMouseState = MouseInput.MouseState; 

    // Get the mouse state relevant for this frame 
MouseInput.MouseState = Mouse.GetState(); 

你之後「已經完成任何你想要這樣的這2個關鍵步驟,你可以繼續並使用代碼:

if (MouseInput.LastMouseState.LeftButton == ButtonState.Released && MouseInput.MouseState.LeftButton == ButtonState.Pressed) { 
//Execute code here 
} 

Ofcourse if語句只檢查,如果玩家按下左畝以上se按鈕,您仍然需要檢查鼠標位置是否在按鈕內。

如果您有任何疑問,請隨時問

0

您可以使用RoutedEvent可以在元素樹中的多個偵聽器上調用處理程序,而不僅僅是引發事件的對象。您可以閱讀有關RoutedEvents的更多信息,因爲附加事件的概念使您可以將特定事件的處理程序添加到任意元素,而不是添加到實際定義或繼承事件的元素。當這些事件與元素無關時(例如MouseDown),都會引發和傾聽事件。

所以RoutedEvents可以幫助你解決你的問題

這裏是一個示例代碼

public static readonly RoutedEvent SelectedEvent = 
    EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble, 
    typeof(RoutedEventHandler), typeof(MyCustomControl)); 

// .NET wrapper 
public event RoutedEventHandler Selected 
{ 
    add { AddHandler(SelectedEvent, value); } 
    remove { RemoveHandler(SelectedEvent, value); } 
} 

// Raise the routed event "selected" 
RaiseEvent(new RoutedEventArgs(MyCustomControl.SelectedEvent)); 
+0

哇。那超出了我的頭。你能以更簡單的方式解釋嗎? – jklsfdgs

+0

您是否閱讀過提供的鏈接?試着在一個測試項目中實現,看看它是如何工作的,我相信它也會幫助你的項目。 –

0

UI的XNA 4.0 like WinForms,從頭寫起。

創建表單,按鈕,從Game.Update()方法調用Form.Update()。 在Game.Draw()中首先調用Form.Refresh(),然後Form.Draw()。

用於處理來自GameHelper.Input庫的鼠標和鍵盤輸入使用的管理器。