2016-09-22 2 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) Когда создается экземпляр класса, вы получаете только состояние мыши. Вам необходимо позвонить Mouse.GetState() в ваш метод Update().

// 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

Смежные вопросы