0

ゲームにホバリングボタンを作りたいです。カーソルがボタンに触れると、すぐに別の画面に移動するためです。私はこれがあまり好きではありません。このプロジェクトを作成するには、xna 4.0 と Visual Studio 2010 を使用します。(wpfなしでkinectを使用)

この場合のタイマーの使い方は?私を助けてください

if (Hand.contian(Button) && holdtime == targetHoldtime)
{

}
4

2 に答える 2

0

フレームあたりの経過時間に基づいて、自分で時間を管理する必要があります。

 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;
          }
     }      
 }
于 2013-09-09T15:11:08.727 に答える
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はいくつかの異なる分野で大きな効果を発揮しました。

于 2013-09-09T15:36:44.243 に答える