たとえば、2 つのキーを使用する必要があり、各キー (たとえば、LEFT キーと RIGHT キー) の押された時間が累積されるので、そのうちの 1 つをクリックするたびに、押された時間が累積されます。同じキーをもう一度押すと時間が加算され、最後に各キーの合計時間が表示されます。
これはどのように行うことができますか?
たとえば、2 つのキーを使用する必要があり、各キー (たとえば、LEFT キーと RIGHT キー) の押された時間が累積されるので、そのうちの 1 つをクリックするたびに、押された時間が累積されます。同じキーをもう一度押すと時間が加算され、最後に各キーの合計時間が表示されます。
これはどのように行うことができますか?
プラットフォームによってかなり異なります。しかし、イベント ドリブン プラットフォームでは、キーダウンとキーアップをイベントとして扱う場合 (.net、Java、Windows を含むほとんどの場合)、簡単です。
キーダウン イベントをリッスンし、それが発生した時間を記録します。同じキーのキーアップ イベントを取得した場合は、記録した時間から発生した時間を差し引くだけです。2 つの違いは、そのキーを押している時間の長さです。
問題は、プラットフォームがキーの繰り返しを処理する方法によっては、キーアップを取得する前に、同じキーに対して複数のキーダウンを取得する場合があることです。各キーの最初のキーのみを追跡します (もちろん、最後のキーアップまたはアプリの起動以降)。一度に複数のキーを押すことができるので、これを正しく行いたい場合は、複数のキーのキーダウン時間を覚えておくことができます。
合計時間を追跡したい場合は、キーアップで見つけた時間差を取り、そのキーの現在の合計に追加します。
JS で:
(function() {
var output = document.getElementById('output'),
totalTime = {},
pressed = {};
window.onkeydown = function(e) {
if (e.which in pressed) return;
pressed[e.which] = e.timeStamp;
};
window.onkeyup = function(e) {
if (!(e.which in pressed)) return;
var duration = ( e.timeStamp - pressed[e.which] ) / 1000;
if (!(e.which in totalTime)) totalTime[e.which] = 0;
totalTime[e.which] += duration;
output.innerHTML +=
'<p>Key ' + e.which + ' was pressed for ' +
duration + ' seconds this time' +
'(' + totalTime[e.which] + ' total)</p>';
delete pressed[e.which];
};
})();