機能紹介~KeyTrackerクラス~

どうも!Senkokusyaです!

今回は第三弾である、KeyTrackerクラスの解説になります!
では。

1.開発経緯

ゲームを開発してある程度たつと必要になってくる入力処理。キーボードにせよ、コントローラーにせよ必要になってきます。

DirectXTKではなんとそれぞれクラスで準備されています!
便利!それ使えばいいやん!…とはいかず、いろいろな問題があったのであった…

それらを使いやすく、見やすくするため開発したのがKeyTrackerクラスとなります。

2.機能

今回も項目をさらに分けますね。


1.シングルトンで作成

前回と同様Singletonで作成しています。
今回に関しては
”SingletonをさらにラップしてSingletonを作成”
しているので、2つ以上生成できてしまうとエラーではじかれてしまいます。

2.長押しと単発押しで関数を分割

今回、keyboardクラスをラップしましたが長押し処理と単発押し処理で呼び出すものが違うという問題がありました。
今回このクラスを作成した最大の理由ですね。毎回毎回呼び出すの本当に大変。
そこで、以下の画像のように関数を分割しました。

上と下で内容が異なることがわかるだろう。

これを入力を必要とするクラスで関数を呼び出せば解決………
(各シーンクラスでPressKeyの引数にEnterを入れたやつを書けばいい。
これでEnterキーを押せば次のシーンに移行するな…)

と、なりますが、それだと普通ですね。ですが、自分はもうひと手間加えます。

3.キーの種類を制限

上の関数の引数に注目してほしい。これはもともとDirectXTKで定義されているKeyの種類ではない。

privateで新たに列挙型を作成しているのである。
又、ここにあるキーしか、実行ファイルには処理が書いていない。

上の列挙型にないキーの種類(数字キーやQキーなど)
は全てここを通るようになっている。

ゲームはキー入力など、入力するボタンは少なければ少ない方がいい。使うボタンが増えれば増えるほど、ゲームは複雑化するといっても過言ではない。

なので、
使うKeyの種類は増やしにくく
(いちいちSwitch文の中にCaseを作成し、その中に処理を書く。めんどくさい。)
同じKeyの入力は増やしやすい
(後に解説するが、関数をコピペするだけでいい。)

ように設計してある。


4.呼び出す項目ごとに関数を作成!

これ!これを言いたいがためにこのページを書いたといっても過言ではない。

C++で書いてある。
見切れているが、上のPushKey、PressKeyはprivateで宣言してある。

コメントにもある通り、実際にキー入力が必要な場所では、

キーの入力の項目ごとに関数を作成している。

上の画像は例だが、Decision関数とJump関数は”今は”同じ内容の関数である。今は。大事なことだからもう一度言うが、”今は”である。

ここで思い出してほしい。ゲームはチーム制作である。仕様変更に柔軟に作らなければならないし、コードは見やすい方がいい。

簡単なプログラムを組んでみた。

このように、PushKeyを直で書いてしまうとどうだろうか。

【やっぱりジャンプキーはEnterじゃなくてSpaceにしようか!】

なんて仕様変更が飛んできたとする。上の画像だけなら治す場所がMain内、Update関数内の2か所だけだが、大規模なプロジェクトになればなるほど、書く各場所は多くなるだろう。そうなってしまっては地獄である。それこそ、1つ直し忘れなんてあって日には…考えたくもない。

なので、関数を関数でラップする。こうすることで、先ほどの処理が飛んできたとしても、KeyTrackerクラスの中の引数だけを変えれば、処理を変えることができる。又、ヘッダーファイルにまとまっているため、キー被りがとても見やすいのも特徴である。
現在はkeyboardでの操作のためこれだけだが、この考え方はControllerで作成する際も通用する考え方だと思う。ぜひ使っていただきたい。


終了!長くなってしまった…
ひとまずこれで機能紹介はいったん終了になるのかな…?

次何書こっかなぁ~

ではでは。


いいなと思ったら応援しよう!