第2.12話 共同作業
職員室で鍵を貰ってから、第二コンピュータ室に行く。
いつも先に来ていた秋晴さんが見当たらなかったので、今日は休みかと思ったが、掃除当番だったらしい。SNSで現役のプログラマーの呟きを見ているときにやってきた。
軽く挨拶をして、作業に取り掛かる。
今日は、キーボード入力の取得についてのプログラムをまとめる。
まず、キーボード取得のプログラムの追加だ。ファイル名を、InputManagerと名付け、InputManagerというクラスを作る。そして、インプットマネージャーの情報を、使うキー毎に用意するのだが、そのキーのプログラム自体を自作することにする。キーが押されているかどうかの関数自体は、ライブラリで用意されている。自作するのは、その関数を使って、押した瞬間と、押すのを止めた瞬間も、取得できるようにするプログラムだ。
インプットマネージャークラスと同じファイルに、Keyというクラスを作る。キークラスでは、押された瞬間かどうか、押しているかどうか、押すのを止めた瞬間かどうかの情報に加えて、どのキーを判定するかの、四つの情報を用意する。押された瞬間をisKeyDown、押されているかをisKey、押すのを止めた瞬間をisKeyUpと名付けた。bool型である。bool型の変数は、trueかfalseのどちらかしか入らない。そうであるか、そうでないかの二択を扱うときに便利な型だ。
キークラスの中で、アップデート関数を作り、押しているかどうかの判定の処理を書く。その判定自体は、ライブラリで用意されている関数を使う。キーが押されている時に当然、isKeyにtrueを入れるのだが、そこにもう一つ判定を作る。isKeyがまだfalseであれば、この瞬間が押された瞬間なので、isKeyDownにもtrueを入れる。もちろん、isKeyにtrueが入っているのであれば、isKeyDownにはfalseを入れる。同じ要領で、押すのを止めた瞬間の判定も作る。キーが押されていないときは、当然isKeyにfalseを入れるのだが、押されていなときにisKeyにtrueが入っている時は、前回のフレーム時はキーが押されていたということのなので、同時に、isKeyUpにtrueを入れる。後は、それぞれの判定の結果を返す関数と、判定するキーを指定する関数を作るだけだ。
次に、インプットマネージャークラスを作る。現在使っているキーは、A、W、D、S、Spaceの四つあるので、キークラスを四つ用意する。そして、それぞれのキークラスを返す関数を作る。それぞれのキークラスに、どのキーを割り当てるのかは決まっているので、コンストラクタで指定する。アップデート関数を作り、全部のキークラスのアップデート関数をそこに書く。
メインループの中で、飛行機のアップデート関数の上に、インプットマネージャーのアップデート関数を書く。飛行機のアップデート関数の引数として、インプットマネージャーを増やし、飛行機クラスのプログラムのキー取得で、インプットマネージャーを用いる。ついでに、キャラクタークラスで仮想関数として宣言したアップデート関数を消す。クラスによって、アップデート関数の引数が異なるようになるからだ。もっといい方法があるのかもしれないが、今の自分はその知識を持ち合わせてない。
実行して、動くかを確認する。今回はプログラムをまとめただけなので、結果は変わらないはずだ。
次に、弾の発射の間隔を指定するプログラムを書く。
バレットマネージャーに新しく、射撃ボタンを押している経過時間と、何秒ごとに発射するのかの、二つの変数を追加する。
アップデート関数の中で、発射ボタンであるスペースキーを押している間、経過時間を加算していくのだが、加算する前に、経過時間が0かどうかを判定する。0であれば、弾を発射するのだ。そして、加算されていった経過時間が、何秒ごとに発射するかのタイミングになれば、0を入れる。これで、指定した間隔で、弾が発射される。
発射ボタンを連打すると、間隔と関係無く弾が出てしまうが、そこはゲームっぽさというものだ。
実行してみて、期待通りの結果になったことに満足していると、秋晴さんが画面を見ていることに気づいた。
「あ、ごめん」
秋晴さんはすぐに、作業に戻ろうとする。
自分の絵が使われてるのだ、どう動いているのか気になるのだろう。
「やるか?まだ敵は倒せないが」
もう一回実行して、パソコンを秋晴さんのほうに向ける。飛行機が左の方にいて、羽が生えた蛇が右からやってくる。
「蛇、適当すぎたかな」
飛行機を動かす前に、羽が生えた蛇の改善点を探していた。飛行機と敵の当たり判定はまだ作っていないので、重なっても通り過ぎていく。右から現れた蛇を目で追っては、左に消えていくのを見送り、そしてまた、新しく生まれる蛇を目で追い始める。
どこのキーで動かすのかを確認し、飛行機を動かしたり、撃ったりし始めた。
「おー」
他にリアクションを見つけられなかったのだろう。少し遅れて口を閉じた。仕方あるまい、絵は動いたが、それだけである。
どうだった、と聞くことはせず、無言でパソコンを自分の前に戻した。秋晴さんは作業に戻る。
俺はこのシューティングゲームで、他に作るものを考えることにした。パソコンのメモ帳を開き、そこにリストアップする。
当然、次に作るのは、弾と敵、敵と飛行機の当たり判定であり、当たったときにどうするかの処理も書く。弾と敵が当たれば、両方消える。ボスに関しては、HPが0になるまでは、弾だけが消える。
飛行機と敵が当たったときはどうしようか、一発当たっただけでゲームオーバーにするのか、何発か当たってからゲームオーバーにするのか。まぁ、一発だけであれば、HPを1に設定すればいいだけだ。敵も飛行機も、当たってHPが0になった時に消すようにしよう。
次にUIだが、スコアとHPバーを設けるかどうかだ。スコアに関しては、あったほうがいいだろう。弱い敵を倒すメリットがなければ避けるだけでよくなってしまう。HPバーに関しては試しに作ってみよう。あればゲームっぽい画面になる。
他にゲーム中で欲しいものは、背景と一時停止機能あたりか。
後は、クリアした時の画面と、ゲームオーバーになったときの画面、それにスタート画面も必要だろう。
箇条書きでリストアップを終え、共有フォルダにアップロードする。これで家のパソコンからも確認することができる。ついでに、シューティングゲームのプロジェクトも圧縮して、アップロードした。
座ったまま腕を伸ばし部屋を見渡す。そういえば、まだ岡林先生を見ていない。今日は来ないのかもしれない。
パソコンを閉じて、秋晴さんにお疲れ様と挨拶をする。たまには早く帰るのもいいだろう。何せ今日は金曜日だ。家でゆっくりと土日に何するか悩もうではないか。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます