2016-09-22 159 views
0

我一直在尋找事件和委託在過去的幾天,我決定嘗試使用這兩個使MouseHandler類。MouseHandler事件和代表c#

基本上我有這個問題,鼠標點擊沒有註冊,並且x軸和y軸的位置回到0,通過不註冊我只是指通過console.WriteLine()顯示在輸出控制檯中。我一直在研究一段時間,但我沒有運氣,所以我想知道你們中的任何一個人是否可以將我指向正確的方向,這將不勝感激。

預先感謝您。

MouseHandler.cs

class MouseHandler 
    { 

     public delegate void MouseEventHandler(object source, MouseEventHandlerArgs 

     public event MouseEventHandler MouseLeftClick; 
     public event MouseEventHandler MouseRightClick; 
     public event MouseEventHandler MouseMoved; 

     public MouseState mouseState = Mouse.GetState(); 

     protected virtual void OnMouseLeftClick(MouseState m) 
     { 
      mouseState = m; 
      if(MouseLeftClick != null) 
      { 
       MouseLeftClick(this, new MouseEventHandlerArgs() { MouseButtonPress = m }); 

      } 
     } 

     protected virtual void OnMouseMoved(MouseState m) 
     { 
      if (MouseMoved != null) 
      { 

       MouseMoved(this, new MouseEventHandlerArgs(){MouseButtonPress = m }); 
       Console.WriteLine(mouseState.Position.X); 
      } 
     } 

     public void Update(GameTime gt) 
     { 
      OnMouseLeftClick(mouseState); 
      OnMouseMoved(mouseState); 
     } 
    } 

MouseEventHandlerArgs

class MouseEventHandlerArgs : EventArgs 
{ 
    public MouseState MouseButtonPress { get; set; } 


} 

MouseTest

class MouseTest 
    { 
     public void OnMouseLeftClick(object source, MouseEventHandlerArgs e) 
     { 
      Console.WriteLine("Mouse Left click" + e.MouseButtonPress.LeftButton); 
     }   

     public void OnMouseMoved(object source, MouseEventHandlerArgs e) 
     { 
      Console.WriteLine("you moved mouse to x " + e.MouseButtonPress.Position.X + " Y pos " + e.MouseButtonPress.Position.Y); 
     } 
    } 

的Game1 之內的更新方法:

mouseHandler.MouseLeftClick += mouseTest.OnMouseLeftClick; 
mouseHandler.MouseMoved += mouseTest.OnMouseMoved; 
//mouseHandler.Update(gameTime); 

回答

0

兩個問題:

1)它看起來像你檢查,如果被點擊的按鈕或鼠標移到之前觸發事件。

2)當類實例化時,你只會獲得一次鼠標狀態。您需要在Update()方法中撥打Mouse.GetState()

// New class fields 
private ButtonState _previousButtonState = ButtonState.Released; 
private int _previousMouseX; 
private int _previousMouseY; 

// New Update() method 
public void Update(GameTime gt) 
{ 
    MouseState mouseState = Mouse.GetState(); 

    // Check if the left button was clicked (pressed now, but not last Update()) 
    if (mouseState.LeftButton == ButtonState.Pressed && _previousButtonState != ButtonState.Pressed) 
     OnMouseLeftClick(mouseState); 

    _previousButtonState = mouseState.LeftButton; 

    // See if the mouse has moved since the last Update() 
    if (mouseState.X != _previousMouseX || mouseState.Y != _previousMouseY) 
    { 
     OnMouseMoved(mouseState); 
     _previousMouseX = mouseState.X; 
     _previousMouseY = mouseState.Y; 
    } 
} 
+0

關於跟蹤光標的位置,是該代碼精確: 'MousePoint =新點(currentMouseState.X,currentMouseState.Y);',然後簡單地'的String.format()''的和MousePoint'繪製'string'?它還具有'if(Rectangle.Contains(MousePoint)){...}'...... –

+0

@JohnyP的優點。當然,你可以使用'Point'而不是單獨的'x'和'y'變量。 – itsme86