我想在我的游戏中制作悬停按钮。因为当我的光标触摸按钮时,它会立即转到另一个屏幕。我不太喜欢这个。我使用 xna 4.0 和 Visual Studio 2010 来制作这个项目。(使用不带 wpf 的 kinect)
在这种情况下如何使用计时器?请帮我
if (Hand.contian(Button) && holdtime == targetHoldtime)
{
}
我想在我的游戏中制作悬停按钮。因为当我的光标触摸按钮时,它会立即转到另一个屏幕。我不太喜欢这个。我使用 xna 4.0 和 Visual Studio 2010 来制作这个项目。(使用不带 wpf 的 kinect)
在这种情况下如何使用计时器?请帮我
if (Hand.contian(Button) && holdtime == targetHoldtime)
{
}
您必须根据每帧经过的时间自行管理时间:
ft = GameTime.Elapsed.TotalSeconds; // Xna
ft= 1/30f; // 30fps
并且可以以与此类似的方式完成:
class Button {
public float Duration = 1; // One second
public Rectangle Bounds; // Button boundaries
public float Progress { get{ return Elapsed/Duration; } }
float Elapsed = 0;
public void Update(float ft) {
if (Bounds.Contains( HandPosition ))
{
if (Elapsed<Duration) {
Elapsed += ft;
if (Elapsed>Duration) {
Elapsed = Duration;
OnClick();
}
}
} else {
Elapsed = 0;
}
}
}
我首先建议您查看 SDK 文档和内置KinectInteraction
控件。他们可能会为您提供您正在寻找的东西。最值得注意的是,SDK 1.7 删除了“HoverDwell”按钮,取而代之的是“按下”动作,这是手势系统中更自然的交互。您可能想考虑使用该动作。
如果您真的想要“单击悬停”类型的操作,您可以查看 SDK 1.6 中的代码作为示例。Kinect for Windows CodePlex存储库中在线提供了几个示例。您要查找的具体控件示例位于“BasicInteraction-WPF”项目中,名为HoverDwellButton
.
“按钮”实际上是一个ContentControl
,这意味着您可以在其中放置任何内容以使其成为按钮。它可以是简单的图像,也可以是复杂的Grid
. 当您悬停的计时器关闭时,它具有触发事件的所有挂钩。
此控件具有相当多的复杂性,这使其适用于广泛的应用程序。交互的核心是一个简单的DispatcherTimer
.
private void OnPreviewHandEnter(object sender, HandInputEventArgs args)
{
if (this.trackedHandHovers.FirstOrDefault(t => t.Hand.Equals(args.Hand)) == null)
{
// additional logic removed for answer sanity
var timer = new HandHoverTimer(DispatcherPriority.Normal, this.Dispatcher);
timer.Hand = args.Hand;
timer.Interval = TimeSpan.FromMilliseconds(Settings.Default.SelectionTime);
timer.Tick += (o, s) => { this.InvokeHoverClick(args.Hand); };
this.trackedHandHovers.Add(timer);
timer.Start();
}
args.Handled = true;
}
请注意,该Tick
事件正在调用InvokeHoverClick
,它(部分)如下所示:
public void InvokeHoverClick(HandPosition hand)
{
// additional logic removed for answer sanity
var t = new DispatcherTimer();
t.Interval = TimeSpan.FromSeconds(0.6);
t.Tick += (o, s) =>
{
t.Stop();
var clickArgs = new HandInputEventArgs(HoverClickEvent, this, hand);
this.RaiseEvent(clickArgs);
this.IsSelected = false;
};
t.Start();
}
现在,这会在设定的时间后触发一个事件。可以根据您的喜好捕获和执行此事件。
同样,我首先建议查看 SDK 1.7 中较新的交互。如果您仍需要定时悬停单击操作,请查看上面的链接。我HoverDwellButton
在几个不同的领域使用了很好的效果。