【问题标题】:MouseHandler Events and Delegates c#MouseHandler 事件和委托 c#
【发布时间】:2016-09-22 15:26:43
【问题描述】:

过去几天我一直在研究事件和委托,我决定尝试使用这两者创建一个 MouseHandler 类。

基本上我有这个问题,鼠标点击没有注册,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; }


}

鼠标测试

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 );
        }
    }

游戏 1 在更新方法内:

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

【问题讨论】:

    标签: c# events delegates xna mouse


    【解决方案1】:

    几个问题:

    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;
        }   
    }
    

    【讨论】:

    • 关于跟踪光标位置,这段代码是否准确:MousePoint = new Point(currentMouseState.X, currentMouseState.Y);,然后简单地string.Format()MousePoint 并绘制string?还有if (Rectangle.Contains(MousePoint)) { ... }的优势...
    • @JohnyP。当然,您可以使用 Point 而不是单独的 xy 变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多