C# Xna事件忽略左键单击,然后立即双击
我有一个方法,可以将鼠标事件分派给侦听器列表。问题是如果我只使用C# Xna事件忽略左键单击,然后立即双击,c#,xna,mouseevent,C#,Xna,Mouseevent,我有一个方法,可以将鼠标事件分派给侦听器列表。问题是如果我只使用 [Obsolete] private void DispatchOld(MouseEvent e) { foreach (var listener in _listeners) { listener.OnMouse(e, _currentState); } } 然后,当我双击鼠标时,会立即触发左键单击,然后双击。我正在努力使它
[Obsolete]
private void DispatchOld(MouseEvent e)
{
foreach (var listener in _listeners)
{
listener.OnMouse(e, _currentState);
}
}
然后,当我双击鼠标时,会立即触发左键单击,然后双击。我正在努力使它,如果我双击,这是唯一的
事件,无需左键单击。所以基本上,如果检测到左键单击,我想推迟发送该事件,直到我知道是否下一个是双击,否则
只需处理事件,如中键单击、右键单击等,通常不会有任何延迟或修改。在我的新代码中,除了我刚离开的时候,这几乎是可行的
单击,该事件不会触发,而是等待并触发双击。有人能提出一种解决这个问题的方法吗?我想检测一下左键点击和双击,但是
未检测到左后紧跟双精度。所以一个lrld应该是lrld。事件是一个堆栈
。添加事件后,将在更新循环中调用Dispatch
private void Dispatch()
{
bool wait = false;
foreach (var item in Events)
{
if (!wait)
{
if (item == MouseEvent.LeftClick) { wait = true; } // Delay the left click
else
{
foreach (var listener in _listeners)
{
listener.OnMouse(item, _currentState);
}
}
}
else
{
if (item == MouseEvent.DoubleClick)
{
foreach (var listener in _listeners)
{
listener.OnMouse(MouseEvent.DoubleClick, _currentState);
}
}
else
{
foreach (var listener in _listeners)
{
listener.OnMouse(MouseEvent.LeftClick, _currentState); // The delayed event
listener.OnMouse(item, _currentState);
}
}
wait = false; // Delt with wait, continue as normal
}
}
Events.Clear();
}
我无法找到解决这个问题的方法,而且我的代码感觉混乱且重复,我可以重命名并使用dispatchOld来消除一些重复,但我希望将所有内容都放在一个方法中。事件流由我的程序的另一部分触发,该部分工作正常,检测事件并发送它们
\\\\\\\\\\\\\\\\\\\\\\\ 回答 \\\\\\\\\\\\\\\\\\\\\\\ 编辑:我似乎已经使用
System.Diagnostics.StopWatch()解决了这个问题
使用System.Diagnostics中包含的秒表,我能够获得所需的行为
private Stopwatch _delayTimer = new Stopwatch();
private void Dispatch(MouseEvent e)
{
foreach (var listener in _listeners)
{
listener.OnMouse(e, _currentState);
}
}
private void Dispatcher()
{
const long maxDelay = 200;
foreach (var item in Events)
{
if (_delayTimer.IsRunning) // Running because Left trigger
{
if (item == MouseEvent.DoubleClick)
{
_delayTimer.Reset();
Dispatch(MouseEvent.DoubleClick);
return; // Delt with
}
if (_delayTimer.ElapsedMilliseconds >= maxDelay) // Waited too long, must be a real left click
{
_delayTimer.Reset();
Dispatch(MouseEvent.LeftClick);
Dispatch(item);
return; // Delt with
}
}
else
{
if (item == MouseEvent.LeftClick) // Ignore and return, but start timer from zero
{
_delayTimer.Restart();
return;
}
Dispatch(item);
}
}
}
它仍然有点混乱,我将Dispatch重命名为Dispatcher,并将DispatcheOld Dispatch重命名为Dispatcher。以避免在Dispatcher方法中重复我自己。我还意识到我可能不需要使用堆栈,因为每次在更新代码中检测到事件时,都会调用Dispatcher,因此永远不会有累积的堆栈。我正在优化代码。目前,上述内容如广告所示有效,我再次提出了一个问题,并亲自回答。您应该发布解决方案作为您问题的答案。你的问题下方有一个按钮,上面写着发布你的答案
。你也可以使用这个答案的代码来进行更可靠的点击检测