2012-04-09 38 views
3

後,我有一個奇怪的問題。我正在爲應用程序創建一個NUI,並將一些簡單的手勢綁定到左右箭頭。問題是當我啓動應用程序。當我第一次做手勢時,我的應用程序連續擊中兩次。之後,它可以100%地工作。問題只有一開始。多命中break命令

我加入兩個關節和時間戳到我的歷史結構如果它擊中我瞬間被放入ArrayList中

 this._history.Add(new HistoryItem() 
      { 
       timestamp = timestamp, 
       activeHand = hand, 
       controlJoint = controlJoint 
      } 
     ); 

然後在foreach循環我比較數據

if (Math.Abs((hand.Position.X - item.controlJoint.Position.X)) < MainWindow.treshold && Math.Abs((hand.Position.Y - item.controlJoint.Position.Y)) < MainWindow.verticalTreshold) 

打破lopp

break; 

之後,我清除歷史ArrayList

this._history.Clear(); 

所以我不明白這一點。爲什麼在開始後它連續擊中兩次?

環路

//編輯

歷史ArrayList的初始化

private List<HistoryItem> _history = new List<HistoryItem>(16); 

現在

foreach (HistoryItem item in this._history) 
     { 
     if ((hand.Position.X - item.controlJoint.Position.X) < MainWindow.treshold) 
          { 
           float tmp = (hand.Position.X - controlJoint.Position.X); 
           MainWindow.slideNumber++; 
           this._logger.Log("Next slide: " + MainWindow.slideNumber); 
           this._logger.Log(hand.Position.X + " - " + controlJoint.Position.X + " = " + tmp + " | " + MainWindow.treshold); 
           this.startTime = 0; 
           this.gestureStart = false; 
           answerFlag = true; 
           System.Windows.Forms.SendKeys.SendWait("{Right}"); 
           break; 
          } 
       } 

。正如你所看到的我打破了這裏。所以這個代碼不應該連續

這怎麼清除的東西被調用第二次

//編輯2

我還要補充一點,進入代碼gestureStart標誌需要這部分設置爲true。正如您在進入'if'部分後可以看到的,我將它設置爲false。所以這是不可能的,代碼立即可以得到這部分

//編輯3 工作替代方法

我已經創建了一種變通方法。我增加了時間控制。我比較了調用上次手勢識別的代碼和時間戳的時間戳。如果它的速度太快(我無法制造幾個毫秒),我不允許擊中箭頭。我不知道,如果它是一個完美的解決方案,但它是一個可行的解決方案

+0

這不是很容易跟着你,但什麼是錯與初始化代碼通常這樣的事情發生。 – 2012-04-09 20:57:54

+0

@AndriyBuday難以休耕導致問題很奇怪,很難形容它。如果您需要更多信息,請說出您需要的內容,然後嘗試添加它。關於初始化。 ArrayList的是在節目開始初始化:私人列表 _history =新名單(16);沒有其他 – Fixus 2012-04-09 21:00:16

+0

你應該粘貼更多的代碼來顯示轉換。另外,由於問題可能出現在init代碼中,你能總結一下你在那裏放的東西嗎? – PPC 2012-04-09 21:01:00

回答

1

好我的問題是代碼。 Ofc是一個在調試中不可行的小錯誤。我使用了一個函數來分析幀的歷史。

的方法在2種模式工作。 I`ve分離是創造2層不同勢的方法,每一個爲每個任務,現在,它的偉大工程