Heliodor 2020/04/03 20:21

キー入力について

ゲームを作るうえで超基本的な要素。キー入力。
たかがキー入力、されどキー入力です。
真面目に作り始めると、意外と引っかかる場所なんですよね。

まず、「あるデバイス(キーボードやジョイスティックなど)からの入力を受け付けるかどうか」という超根本的なところからしていろいろ条件が付きます。

キーボードのからの入力

  • ウィンドウがフォーカスを持っている場合のみ受け付ける
  • ゲーム内GUIにフォーカスがあるときはキャラクター入力としては使わない
  • 修飾キーのチェック。例えば Shift+Ctrl+S と入力した場合に、S や Ctrl+S というコマンドと誤爆してはいけない
  • 同時押しの対処。例えば矢印キーの↑と↓を同時に押した場合にどちらを優先するか
     

    ジョイスティックから入力

  • ウィンドウがバックグラウンドにあるときでも入力を受け付けたい
    (デバック時に片手でジョイスティックを操作しながら片手でプログラム修正するときなんかに便利)
  • ノイズ入力に対する許容(例えば「右」という入力を期待しているときに、「右上」の入力を受け入れるかどうか)

マウスからの入力

  • ウィンドウがフォーカスを持っている場合のみ受け付ける
  • ただしマウスホイールだけは、ウィンドウがバックグラウンドになっていても受け付ける

まあこのあたりはウィンドウメッセージなどを素直に使っていれば OS 側が勝手に振り分けてくれますからあまり問題はないと思います。



あとはタイミングの問題ですね。

ゲームでよく使うのは「ボタンを押した瞬間かどうか」の判定ですけど、これもよく考えると面倒なんですよね。
「ボタンを押した瞬間かどうか」を問い合わせた丁度その時に、ピンポイントでボタンを押した…なんてことは現実的にはあんまりないことです。
だいたいは「押してから既に数ミリ秒経過している」わけですから、ある程度の余裕を持って、「この時刻からこの時刻までに押されたボタンを『たった今押されたボタン』と判断する」事になります。

一番簡単なのは、更新フレームの先頭でボタンの状態を調べ、前回更新時に押されていなかったボタンが今回押されていたら「ボタンを今押した」と判断する事です。
だいだいこれで問題ありません。

・更新1
・Aボタン押す
・更新2
・Aボタン離す

のように時間が流れた場合、更新2の時点でAボタンが押されているので、「更新2の瞬間にAボタンが押された」と判断します

が、問題もありまして、例えば次のような場合はボタン入力の検出ミスが発生します。


・更新1
・Aボタン押す
・Aボタン離す
・更新2

この場合、更新1でも更新2でもAボタンは押されていません。
ものすごい速さでボタンを押して離すとボタン押しが認識できないのです。

60fpsのゲームで更新を毎秒60回行っているなら、少なくとも1/60秒(0.016秒)以上はボタンを押したままにしないと検出されない可能性が出てきます。
(そんな操作できるヤツ居ないだろって? いやー……)

30fpsで動いているゲームなら 1/30秒以上押さないと検出できない可能性があるので、さらにこの問題が出やすくなりますね。

これを解決する簡単な方法は、入力の更新回数を増やしてしまう事です。そうすれば

・更新1
・Aボタン押す
・更新1.5
・Aボタン離す
・更新2

のようになるのでボタン入力の取りこぼしも減ります(なくなるとは言っていない)

恐らく、超シビアな入力を求められるゲーム(音ゲーとか対戦格闘ゲームとか)ではこういう部分が重要になるのだと思いますが、たかだかエロ同人アクションゲームでそこまで考慮する必要も無いだろう(暴言)ということで、ヴィータ大脱出は60fpsで入力を処理していました。「操作の反応が悪い!」という苦情は特に無かったので、普通はこれで大丈夫だと思います。




そして現在製作中のゲーム、あやかし紅白戦。

個人的に、ボタンたくさん使うゲームは苦手なレトロゲーム脳なので、本作は方向キー+ボタン3つ(刀、蹴り、ジャンプ)しかありません。
そのせいでダッシュ、バックステップ、大ジャンプなどは若干忙しい操作が必要になります。

実際このゲームでそこまでやる必要はあんまり無いのですが(主に自己満足用)、連続攻撃→キャンセルバックステップ→ダッシュ攻撃みたいなスタイリッシュな動きをしようとすると案外シビアな入力が必要になります。

結局本作では、入力受付だけを専門に行うスレッドを作って、8ミリ秒ごと(約120fps)に入力状態を確認することにしました。
別スレッドを作って入力を監視することにより、処理落ちなどでゲーム全体の速度が落ちたとしても入力テンポを変えずにすみますし、安定して入力できるようになりました。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索