繰り返される動作イベントではなく、押下を状態として追跡します
キーダウン時に、関連するキーをセットに追加します。更新ステップ中に、そのセットを読み取って移動を決定します。キーアップ時に削除します。これにより、オペレーティング システムのキーリピート イベントをゲームの動作クロックとして扱うことがなくなります。また、チャージショットを 1 回発射するなど、アクションを 1 回だけ開始する必要がある場合は、すでに保持されているキーの 2 回目のキーダウンも無視します。 MDN では、キーを押し続けると繰り返しキーダウン イベントが生成される可能性があり、KeyboardEvent.repeat はサポートされているブラウザーでそれらの繰り返しイベントを識別できると説明しています。
どのキーをゲーム コントロールとしてカウントするかを選択し、テキスト フィールドはそのままにしておきます。プロンプトまたは名前入力フィールドにフォーカスがある場合、移動ハンドラーは同じ文字を消費しないでください。本当にその動作が必要なコントロールに対してのみページ スクロールなどのブラウザのデフォルトを防止し、プレーヤーがゲーム領域を出るときに通常のページ動作を復元します。
割り込みおよび状態変化時にセットをクリアする
ウィンドウがぼやける、ドキュメントが非表示になる、一時停止オーバーレイが制御する、または実行がリセットされると、保持されている入力がクリアされます。 Visibilitychange ハンドラーは document.hidden をチェックし、それが true になったときにセットをクリアできます。フレームやポインターの移動ごとにやみくもにクリアしないでください。キーアップが到着しない可能性がある場合、クリアを割り込みに結び付けます。ゲームが古い動作を自動的に再開するのではなく、再開後に新たなキーダウンを要求するようにします。
中断パスを再現する
左方向キーを押したままタブを切り替え、ジャンプを押したままメニューを開き、再起動中に方向を押します。プレイに戻ったら、もう一度意図的に押すまでキャラクターが静止していることを確認します。右 + ジャンプなどの 2 つの同時キーで繰り返し、一方のキーをクリアしてももう一方のキーがラッチされたままにならないようにします。ゲーム コントロールとテキスト入力の間のキーボード フォーカスの変更を含めます。
ブラウザゲームでキーが動かなくなるのを防ぐについての質問
キーを放した後もキーが保持されたままになるのはなぜですか?
フォーカスが変更されるか、オーバーレイが制御を握ると、ゲームは一致するキーアップを受信または処理できない場合があります。これらの中断パス上の保持状態をリセットすると、プレーヤーは正常に再開されます。
キーリピートでキャラクターの動きを制御すべきでしょうか?
継続的なモーションの場合、保持状態を追跡し、ゲーム ループ内の動きを更新します。 「Repeat」は、アクションが 1 回発生する必要がある場合に、繰り返されるキーダウン イベントと最初の押下を区別する場合により便利です。
関連情報
古い情報を見つけましたか? 訂正を連絡