Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定是否单击按钮的更好方法_C#_Xna_Monogame - Fatal编程技术网

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

C# 确定是否单击按钮的更好方法,c#,xna,monogame,C#,Xna,Monogame,我正在用MonoGame开发一个游戏,并决定创建自己的button类。为了确定这些按钮是否被单击,我确定它们是否在按钮的范围内,以及鼠标左键是否按下。这导致了两个问题 鼠标点击不需要在按钮内部开始,它会立即注册,而不是在鼠标按钮在按钮边界内释放后注册。 当不同屏幕上的多个按钮位于同一区域时,会导致同时单击这两个按钮,因为鼠标按钮释放速度不够快。 如何使单击行为更像WinForm按钮?您可以使用RoutedEvent,它可以在元素树中的多个侦听器上调用处理程序,而不仅仅是在引发事件的对象上。您可以

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

鼠标点击不需要在按钮内部开始,它会立即注册,而不是在鼠标按钮在按钮边界内释放后注册。 当不同屏幕上的多个按钮位于同一区域时,会导致同时单击这两个按钮,因为鼠标按钮释放速度不够快。 如何使单击行为更像WinForm按钮?

您可以使用RoutedEvent,它可以在元素树中的多个侦听器上调用处理程序,而不仅仅是在引发事件的对象上。您可以阅读更多信息,因为附加事件的概念使您能够将特定事件的处理程序添加到任意元素中,而不是添加到实际定义或继承事件的元素中。当这些事件与元素无关时,就像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));

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

我们要做的第一件事是创建一个MouseInput类,它应该跟踪诸如mouseState、lastMouseState、MouseX、MouseY之类的内容。mouseState和lastMouseState一起处理一次单击。但现在,您可以将此类添加到项目中:

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语句只检查玩家是否按下了鼠标左键,您仍然需要检查鼠标位置是否在按钮内部

如果您有任何问题,请随时询问从头编写的XNA 4.0的UI

创建表单,点击按钮,调用表单。从游戏更新。更新方法。 在游戏中。先画呼叫表单。刷新,然后是表单。画


用于处理GameHelper.input library中的鼠标和键盘输入。

Wow。我听不懂。你能用更简单的话解释一下吗?你读过提供的链接了吗。尝试在一个测试项目中实现,看看它是如何工作的,我相信它也会对您的项目有所帮助。