Как использовать таймер в C# для зависания кнопки?

Я хочу сделать кнопку зависания в моей игре. Потому что когда мой курсор коснется кнопки, он сразу же перейдет на другой экран. Мне это не очень нравится. Я использую xna 4.0 с visual studio 2010, чтобы сделать этот проект. (используйте kinect без wpf)

Как использовать таймер в этом случае? пожалуйста, помогите мне

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

}

2 ответа

Решение

Вы должны сами управлять временем, основываясь на затраченном времени на кадр:

 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 для 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 с большим эффектом в нескольких разных областях.

Другие вопросы по тегам