确定是否单击按钮的更好方法

时间:2015-09-08 02:40:31

标签: c# xna monogame

我正在MonoGame开发游戏,并决定创建自己的按钮类。为了确定是否单击了这些按钮,我确定它们是否在按钮的边界内,以及是否按下了鼠标左键。这导致了两个问题。

  1. 鼠标单击不需要在按钮内部启动,它会立即注册而不是在释放鼠标按钮后(在按钮边界内)。
  2. 当不同屏幕上的多个按钮位于同一区域时,由于鼠标按钮的释放速度不够快,因此会同时点击它们。
  3. 如何使点击行为更像WinForm按钮?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

要使鼠标点击有效,您应该执行以下操作:

我们要做的第一件事是创建一个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;
        }
    }

在您完成此操作后,每次执行更新方法时,您都想开始点击鼠标:

 MouseInput.LastMouseState = MouseInput.MouseState;

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

在您完成这两个关键步骤后,您可以继续使用您想要的任何代码:

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

当然如上面的if语句只检查玩家是否按下了鼠标左键,你还是要检查鼠标位置是否在按钮内。

如果您有任何疑问,请随时提出

答案 2 :(得分:0)

XNA 4.0的用户界面like WinForms,从头开始编写。

创建表单,然后按钮,从Game.Update()方法调用Form.Update()。 在Game.Draw()中首先调用Form.Refresh(),然后调用Form.Draw()。

用于处理来自GameHelper.Input库的鼠标和键盘输入管理器。