2016-09-22 161 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