我正在尝试找到一种方法来订阅 XNA 中的双击事件,并且谷歌搜索让我获得了与 winforms 相关的东西,但事实并非如此,我不能使用它。
在 PC 上使用Timespan
和猜测双击的超时时间不是很可靠。
默认的 XNA 输入系统也有这个小缺陷:有时按键或鼠标点击在更新之间会丢失,这会破坏游戏高负载时刻双击的可靠性。
如何在 .net 中订阅双击事件?
删除了“不使用Control
类事件”,因为实际上有一种使用该类的方法(请参阅我的答案)。
我正在尝试找到一种方法来订阅 XNA 中的双击事件,并且谷歌搜索让我获得了与 winforms 相关的东西,但事实并非如此,我不能使用它。
在 PC 上使用Timespan
和猜测双击的超时时间不是很可靠。
默认的 XNA 输入系统也有这个小缺陷:有时按键或鼠标点击在更新之间会丢失,这会破坏游戏高负载时刻双击的可靠性。
如何在 .net 中订阅双击事件?
删除了“不使用Control
类事件”,因为实际上有一种使用该类的方法(请参阅我的答案)。
您可以按照本文所述创建自己的双击检查器。
double ClickTimer;
const double TimerDelay = 500;
public override void Update(GameTime gameTime)
{
ClickTimer += gameTime.ElapsedGameTime.TotalMilliseconds;
if(Mouse.GetState().LeftButton == ButtonState.Pressed)
{
if(ClickTimer < TimerDelay)
//this is a double click
else
//this is a normal click
ClickTimer = 0;
}
}
在该代码中,500
设置为用户必须双击的最长时间(以毫秒为单位)。要获取用户设置为其系统的最大双击时间的毫秒数(而不仅仅是将其设置为任意值500
),您可以导入Windows.Forms
程序集并读取SystemInformation.DoubleClickTime属性,或者,如果您不想导入程序集,您可以 P/InvokeGetDoubleClickTime
方法。
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetDoubleClickTime();
所以在XNA代码中加入上面的方法,就可以像这样得到用户默认的双击时间
const double TimerDelay = (double)GetDoubleClickTime();
我只是想出了这个:
using wf = System.Windows.Forms;
wf.Form form = (wf.Form)wf.Control.FromHandle(this.Window.Handle);
form.MouseDoubleClick += new wf.MouseEventHandler(form_MouseDoubleClick);
所以确实有一种方法可以在 XNA 中使用Control
类 :)