アクションゲームにおけるキー入力について

先日から開発をしているゲームライブラリ(http://www.takaaki.info/gamelib/)ですが、キー入力については、スプライトの動きと同期させるために一度フレームワークで吸収して、指定したキーが押されているかどうかをチェックするAPIを提供するようにしています。先日はじめに公開したときの実装では、KeyDownイベントだけを拾って、そのキーが押されているという情報をArrayに格納していました。そのキー押下情報は、タイマーイベントが発生して、すべてのスプライトの処理が終了するたびにフラッシュしていたのですが、これだとキーを押しっぱなしにした場合に、キーを押した瞬間のKeyDownイベントと、キーリピートが効き出して2回目以降のKeyDownイベントの発生に間が空いてしまってゲームとしてはよろしくない状態でした。

そこでKeyDownイベントを拾ってArrayに格納したあと、定期的なキー押下情報のフラッシュは行わず、KeyUpイベントが発生したときに、そのキーの情報を消す、という方式に変えてみました。で、一応いい感じで動作するようになったんですけど、KeyUpイベントってキーを押したままウインドウのフォーカスが他に移ったらどうなるんだろ、と思って実行してみたらやっぱりキーを離してもKeyUpイベントは発生しませんでした。つまり矢印キーで何かを移動した状態でフォーカスが移るとキーが離されてもそれが認識されずに押しっぱなしと判断されてしまう。もう一回同じキーを押して離せばクリアされますが、どうしたものか。しばらくKeyDownイベントが無くてさらに押しっぱなしだと、キーが離されたと認識されるという仕組みも考えたんですけど、まだうまく調整できていません。とかいろいろ思ったのですが、「Javascript Gamelib」を見ても、ほとんど同じ実装になっていて、KeyUpが拾えないときの実装もあまり変わっていなかった。だから、とりあえずこれでいいか。

ところでKawa.netの川崎さんが、http://www.kawa.net/works/js/animation/raster.html:tltle=ラスタースクロールさいころ回転エフェクトとかを公開していた。すごい。これってゲームでつかえたらすごいなあ、ということで研究させていただきたい感じ。

今日はShibuya.jsですね。たのしみ。