サンプリングの妙

ui.enchant.jsのバーチャルパッドを使ってみました。マウスや方向キーで画像を自在に移動させるときは非常に便利です。今回、方向キーの押下で動作を起動し、さらに再度の押下で動作を停止する処理の問題点を整理します。

下の図は太い線がキーの押下状態を表し高さがキーオン状態を示します。縦細線はサンプリングのタイミングです。赤丸がキーオン状態の検出を示します。

Sample1方向キーを処理のトリガーに使うことは稀ですがうまく使うと効果的です。上図の上矢印(↑)に示すように、かつては状態がオフからオンに変わるエッジ状態を検出することができ割り込み処理で確定的な処理を実行しました。今では高度なOS(オペレーティングシステム)が関与し割り込み処理という考え方はなくなったのでプログラミングに配慮が必要です。

sampling0

enchant.jsではキーの押し下げと離される時を区別できるようですが、us.enchant.jsではそれに代わる手法がないようです。

当初、図のA方式で66.67msの間隔でキー状態をサンプリングしたところ、1回のキー押下で2回キー押下を検出しました。B方式で間隔を2倍にしサンプリングを遅くしたところ、キー検出は1回になり制御は改善されました。

この方式はキーオン状態が短くなると検出されなくなるという不安定性が残ります。サンプリング間隔は信号オンの長さよりも小さくすることが必須条件です。

KeyInputA方式を改良したのがC方式であり、前回キーサンプリング状態を記憶し状態がオフからオンに変わった時をキーの押下があったとします。A方式の2と4は状態変化がないのでキーの押下ではないと判断します。

C方式で制御が安定しました。この処理はプログラミングの初歩的な手法ですが、知っていると知らないでは大違いです。窮地に陥った時は知恵を出しましょう。

コメントを残す

下記項目は必須ですがメールアドレスは公開されません。名前はニックネームをお使いください。

CAPTCHA