イベント処理( 5 )
最終更新日:

前へ 目次 次へ

 イベント処理もとうとう第5回です。

 前回まではマウス関連のイベントに関する話でしたが 今回はキーイベントについてです。 そして、イベント処理の最後( だと思う )です。


 JavaScriptゲーム を作成する際、 入力手段にキー操作を使いたいと思う ことはよくあることです。

 キー操作イベントには大きく onKeyPress, onKeyDown/up の2系統の入力 があります。

onKeyDown/up はキーを押した時に通知されるイベントで、 onKeyPress はキーが押されている間通知される ( 押し続ければ、連続して通知される )イベントです。

 シューティングゲームによくあるように、キーを押し続けている間、 打ち続ける処理をする場合は onKeyPress を使用した方が 良さそうに思えます。 然し、 実際にやってみると 、実行しているマシンの性能に大きく影響することに 気がつくでしょう。

つまり、キーリピート間隔の時間内に全ての処理が終了しない場合、 ゲーム全体の動きが凄く遅くなります。 ロースペック( CPU性能やメモリ容量 )のマシンだと処理全体に時間がかかりますから、 処理できる許容量はかなり小さくなります。

この傾向は皮肉にも NN の方が大きいです。 f(^^;

 なにかと性能でけなされる IE でこの傾向が顕著にならない理由としては 以下の項目が考えられます。

1)
元々 IE は負荷が高くなるとイベント抜けが発生する。 ( 性能が良いと言っているのではなく、これ以上悪くならない )

2)
キーリピート間隔は絶対時間ではなく、負荷と共に遅くなる。 ( 結果的に良い方向ですが、通常はおかしいと言われる )

3)
ベースとして IE は最初から性能が出ない。 f(^^;

せっかくゲームを作るのですから色々な環境でも、 できるだけ同じ条件でスコアを競って欲しいものです。

 この意味では onKeyPress イベントはゲーム向きではないと言えます。

 そこで、キーリピートの処理をするために onKeyDown/up イベントで 同様の機能を実現するには、 キーの状態を内部で保持しておき、 自分の都合で( 通常は setTimeout でしょうか )この状態を見に行きます。


activeKey = null;       // キーの状態( キーコード )
function keydown(e){
  if(nn) activeKey = e.witch;
  if(ie) activeKey = event.keyCode;
}
function keyup(e){ activeKey = null; }

 でも、onKeyDown を使用する場合には注意が必要です。

上のサンプルではキーコードを activeKey に設定していますが、 実際は操作されたキーが何か判断する必要があります。 この判断は通常 fromCharCode関数を使用しますが、 IE では keydown イベント時に取得できるキーコードは keypress で設定されるコードとは異なります。

このため、activeKey で記憶したコードを fromCharCode で変換しても 期待する値が取れません。 マイクロソフト社のドキュメントでもこの違いについて説明している箇所は 見当たりませんから多分バグと思われますが、 一向に直す気配もありませんから仕様かもしれません。 ( 毎度、 IE の仕様に関しては歯切れが悪い... f(^^;;; )

と、なんだかんだ言っても目的は達成できませんから、 ここでは一筋縄では行かないとだけ思って、しょ〜がないので、 自分で変換しちゃいます。


    activeKey = null;     // キーの状態
    function keydown(e){
      if(nn) activeKey = String.fromCharCode(e.which);
      if(ie){
        switch(event.keyCode){
        case 52: case 37: case 100: activeKey = '4'; break;
        case 53: case 12: case 101: activeKey = '5'; break;
        case 54: case 39: case 102: activeKey = '6'; break;
            :
        default: activeKey = String.fromCharCode(event.keyCode);
        }
      }
    }
    function keyup(e){ activeKey = null; }
switch文の 52〜54 はキーボードの "4" 〜 "6" で、
37,12,39 はテンキーで「Num Lock」解除時の、
100〜102 はテンキーで「Num Lock」時の "4" 〜 "6" です。

う〜む恐るべし IE 。悪魔の如きトラップの数々。な〜んちゃって。 f(^^;

前へ 目次 次へ


Copyright(c) 1999 ShinSoftAll rights reserved.