ゲームにホバリングボタンを作りたいです。カーソルがボタンに触れると、すぐに別の画面に移動するためです。私はこれがあまり好きではありません。このプロジェクトを作成するには、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
はいくつかの異なる分野で大きな効果を発揮しました。