質問: ❶の[]内を変数cに置き換えるとキー操作が適切に動かない理由が知りたいです... var gKey=new Uint8Array(100); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ window.onkeydown=function(e){ var c=e.keyCode; gKey[c]=1; } window.onkeyup=function(e){ gKey[e.keyCode]=0;//❶ } function TickField(){ if(gKey[37]) gPlayerX--; if(gKey[38]) gPlayerY--; if(gKey[39]) gPlayerX++; if(gKey[40]) gPlayerY++; }
回答: 変数のスコープが異なるからです。つまり、提示コード内の変数`c`は`onkeydown`にバインドした関数内からのみアクセス可能で`onkeyup`にバインドした関数からはアクセスできません。 かわりに、たとえば`c`をそれぞれ`window.c`(`window`はブラウザにおけるグローバルスコープです)に置換した場合(`var`は消す必要があります)を考えてみると、一応動くようにはなるでしょうがこれは意図しないものになるはずです。また、`var gKey=new Uint8Array(100);`の直下に`var c`をして代入時の`var`を消しても同様の挙動が得られるでしょう。 意図しない挙動とは? 複数のキーを同時押しした場合を考えてみてください。どちらのキーをはなしても、先に押したキーのみが判定解除されることになります。