見出し画像

方向入力をスマートに補助する仕組みの解説 ローグライク(仮)

今日のゲーム制作作業は入力補助の改善だけにしました。昨日言っていたものに加えて更に改善もしました。

あ、それとフォロワーさんが500人を突破しました!ありがとうございます。どんどん増えてまして、有り難いことです。もっと多くの人に見ていただけるように、日記とはいえ身のある話もきちんと書けるように善処します。

方向入力の補助

ぼくが作っているローグライクゲームはマスを移動するターン制のゲームです。

そして先日新たに斜め移動や斜め攻撃の機能が導入されたので方向入力の機能の改善を昨日から行っていました。昨日実装したのは「斜め入力しか受け付けなくなる補助ボタン」でしたが、今日は「補助ボタンを使わなくても斜め入力しやすくする機能」を作りました。

まず、課題を説明します。例えば右上を入力するときには「→」と「↑」を同時に押す必要がありますが、実際はゲームコントローラでそれを同時に押すことは難しいのです。というのも1秒間に60回状態監視をするため、0.017秒という短い間にその2つのボタンを押していない状態から同時に押した状態にするわけです。人間の手がそれを正確に行うのは非常に難しいのです。

この課題を解決するために昨日作ったのが「斜め入力しか受け付けなくなる補助ボタン」です。このボタンを押している間は、入力した方向が確定するときに「↑↓←→」を除外してくれるので、必ず斜め4方向のどれかしか入力されないわけです。

この補助機能はチュンソフトの不思議のダンジョンシリーズ、風来のシレンやトルネコの大冒険などを含め、和製ローグライクでは定番になっていて、ローグライク系のゲームをプレイする人にとって既に当たり前の機能となっています。ですのでこのゲームでも最低限の機能として導入しています。非常に便利な一方で、存在を知っている必要があったり、そもそも斜め入力って何故そんなに難しいの?という根本的な問題が存在しますので、そこも解決しておきたい点なのです。

では今回実装した「補助ボタンを押さなくても斜め入力がしやすくなる機能」とは何でしょうか。それは2つに分解して説明しなければなりません。

入力開始時の補助

先程は、0.017秒の間に2つのボタンを同時押ししなければならないが、人間がそれを正確に入力することは難しい、という問題を説明しました。ですが、ここに「猶予時間」というものを設けることでその短い時間を少し長くすることができます。

まず何も工夫をしていない場合、最初に「方向ボタンを何も押していない状態」があり、そこから「↑」を押して、0.017秒以上後に「→」を押すと、最初に押された「↑」に即座に反応してしまい、上へ移動してしまいます。この「何も押していない状態」から「入力が確定する」までの時間を「猶予時間」と呼びましょう。例えばそれを0.2秒にしてみましょう(実際はもっと短く、0.08秒くらいで良い)。

猶予時間の間は入力が確定されません。ですので0.2秒間は押したボタン「↑」が移動に反映されません。その0.2秒の間に「→」の入力が間に合うと晴れて「↑→」の同時押しが成功します。このまま0.2秒経つと、この入力は最終的な状態「↑→」として確定され、斜め右上の方向へ移動する、というわけです。

また猶予時間の間にすべての方向ボタンを離した場合、猶予時間の最後の状態が即座に反映されます。「↑」を押してすぐ(0.2秒経つ前)離した場合、上方向に移動します。この機能も忘れず実装しなければ、移動ボタンを一定以上の時間押し続けなければ移動が反映されない問題を生みます。

これがまず1つ目です。

入力終了時の補助

次に2つ目です。

今度は入力終了時のお話になりますが、先程とほとんど同じ問題を似たように解決しています。

「↑→」を同時押ししているときに手を離したら「↑」と「→」のどちらかが一瞬(0.017秒ほどの間)でも早く離れてしまうと、残ったほうの入力が反映されてしまいます。離した瞬間も人間の入力にはズレが生じるわけです。

そして、この問題の解決のためにも「猶予時間」を使っており、先程とよく似ています。まず「何かを入力している状態」から「その入力内容が変化したとき」にその猶予時間が開始されます。猶予中は変化の内容が反映されず猶予開始時点の入力内容が反映されたままとなります。また猶予中に「何も入力されていない状態」になると、その猶予時間は終了します。猶予時間は時間経過でも終了しますが、時間経過によって終了した場合は「現時点の入力内容」が反映されます。

ちょっとわかりにくいと思いますが、猶予期間中に入力が変化しても知らんぷりする、といえば分かりやすいかなと思います。

以上、2点で十字ボタンによって斜めを含めた8方向入力を「補助ボタンなし」でそれなりに正確で意図通りに反映するアルゴリズムの説明となります。もし悩んでおられる方がいらっしゃれば、ご参考いただければと思います。

入力補助の必要性

ゲーム機やパソコンは電子機器ですから高速かつ正確に動いています。人間のように曖昧な動作を素直に受け付けると、曖昧な状態を細かく分解して解釈してしまいます。しかし、人間は電子機器に意図を理解してもらいたいわけですから、そこに乖離が存在しているということになります。

自然で違和感のないコンピュータとのコミュニケーションは、人間が発生させるノイズをいかに人間に気付かれないようにコンピュータが誤魔化すかに掛かっています。

今回はその一例として、方向入力時に発生するノイズを、人間に気付かれない程度の短い「猶予時間」を用いて解決しました。他にも方法はありますし(入力フレームレートを下げるという安直な方法もあったりします)、その他にもゲームには色々なノイズがあって(3D酔いを防ぐとか、音が割れないようにするなどなど)それぞれに対しても様々な対処法があります。やることがたくさんあるということですね。

しかし、このように細かいことでも、施さないとプレイヤーが意図通り操作できず、イライラしてしまうわけですから、どんなに細かいことでも丁寧に実装していかなければ、製品品質のゲームとは言えません。

人間から見たコンピュータのインターフェイスは、実は人による繊細な工夫によって上手く誤魔化されているものなのです。

応援してくださると嬉しいです。よろしくお願いいたします!