奇妙な問題があります。アプリケーション用の NUI を作成しており、簡単なジェスチャーを左右の矢印にバインドしました。問題は、アプリケーションを起動するときです。初めてジェスチャを行うと、アプリケーションが 2 回連続してヒットします。その後、私が望むように100%動作します。スタートだけが問題。
ArrayList に入れられる履歴構造体に 2 つのジョイントとタイムスタンプを追加しています
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)
ヒットしたら即座にドロップをブレイク
break;
その後、履歴ArrayListをクリアします
this._history.Clear();
だから私はそれを取得しません。開始後、2回連続でヒットするのはなぜですか?
// 編集
履歴 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 回続けて呼び出すべきではありません
これが何かをクリアする方法
//編集2
また、コードのこの部分に入るには、gestureStart フラグを true に設定する必要があることも付け加えておきます。ここで「if」の部分に入るとわかるように、false に設定しています。したがって、コードがこの部分にすぐに到達できることは不可能です
// 3 つの作業回避策を編集します
一種の回避策を作成しました。タイムコントロールを追加しました。コードを呼び出したタイムスタンプと最後のジェスチャ認識のタイムスタンプを比較しています。速すぎる場合(作成できない数ミリ秒を意味します)、矢を打つことはできません。それが完璧な解決策かどうかはわかりませんが、実用的な解決策です