第2.0話 共同作業
母親は帰りが遅くなるらしい。家に帰り風呂を洗おうとしたところで、お米を洗っといてと電話がかかってきた。
お米を先に洗う。焚いている間に適当な野菜炒めを作り、風呂も洗う。炊飯器とは便利なもので、早く焚こうと思うと30分ほどで焚けるのだ。
風呂を貯めている間に食事を済ませ、少しゆっくりした後に風呂に入る。風呂から上がるころには、20時になっていた。少し勉強するかと、自室に行き勉強机に座ったところで、放課後に寄ったコンピュータ室でのことを思い出す。
今のうちにやっておくか。
春休み中に買ったノートパソコンを起動し、頭の中を働かせる。
頼まれたことは難しいことじゃない。絵を画面に表示して動かすことだ。自分から、キーボード操作で上下左右に動かせると言ったので、それは最低限やらないといけないことだ。
とりあえず飛行機の代わりになる画像を用意する。そういえば、アニメーションは必要だろうか。飛行機自体が変化することはないだろうが、後ろにエンジンのジェット噴射を描くなら必要である。
連絡先を交換しておいてよかった。すぐに確認ができる。
「描いてもらう飛行機ですが、ジェット噴射等のアニメーションはありますか?」
無いほうがプログラムが少なく済むので、無いことを願う。
返信がすぐにくる。
「あったほうがよさそうですね。お願いします」
願いは行動しないと叶わないと聞くが、今回は行動しないほうがよかったのかもしれない。
とりあえず、アニメーションのテスト用として、四角形の画像を4枚用意した。真っ白な背景に黒色で0、1、2、3と数字がそれぞれに書いてあり、これを順番に表示することで、アニメーションができているかの確認をするのだ。パラパラ漫画みたいなものである。
プログラムを書くためのソフトを起動して、新しいプロジェクトを作る。プログラミングといっても種類は様々で、今回使うのはC++という言語だ。標準の機能だけでは画像を表示することすら出来ないので、ライブラリというものをインクルードする必要がある。無料のライブラリでも機能が充実しているので、ありがたいことだ。
さっそくプログラムを書いていく。最初から全部書こうとするのは大変なので、いくつかに分けて書いていく。
まずは画像の表示からだ、と言いたいところだが、メインループというものを先に書いていく。
プログラムは基本的に上から下に実行される。そして、一番下にいけばプログラムは終了する。しかしそれだと、1フレームしか動かないことになり、一瞬でプログラムが終了してしまう。アプリケーションを起動しても、一瞬で閉じてしまうのだ。それではゲームにならない。
そこで、処理を終えたら上に戻ってまた処理を繰り返していく、といった感じにプログラムを書いていく。この繰り返しをループといい、プログラム全体の繰り返しをメインループという。
メインループを抜け出す処理も必要だ。ずっと処理が繰り返されては、ゲームを終えることが出来ない。
とりあえず今回は、Escapeキーが押されたらループを抜け出すようにしよう。こういう何をされたらというのを条件式という。
メインループとそれを抜け出す処理が書けたら、一旦動かしてみる。黒い画面が出てきて、Escapeキーを押したら、画面が消えることを確認する。
ここでやっと画像の表示だ。それには当然、画像データの読み込みが必要だ。読み込みも表示も、ライブラリのおかげで簡単に出来る。
今回はアニメーション処理をするので、画像データを複数読み込まないといけない。こういう時に便利なのが配列というものだ。同じ種類のデータを連続して扱うことができる。それぞれ順番に番号が振られているので、表示するときにはその番号の順番で呼び出すと、アニメーションをすることが出来る。もちろん、最後の画像を呼び出したら、また最初に戻るようにする。
画像を表示するには、画像データ以外に、画面のどこに表示するかの位置情報が必要である。この位置情報を変化させていくことで、画面の中で動かすことが出来るのだ。
とりあえず、画面の真ん中に表示するように、値を直接入れた。
他にも、回転させるなら角度の情報、大きさを変えるならそれの情報も必要だが、今回はいらないだろう。
頭の中である程度考えてから、実際にプログラムを書いていく。プログラムが書けたら、実行して動かしてみる。
白い四角形に数字が書かれた画像が出てくる。そして、次の画像に切り替わる、が、想定通りにはいかなかった。画像は綺麗に切り替わることなく、まるで、混ざりあったように出てきた。
どうしたものかと、腕を組もうとした瞬間に思い出す。画像を表示させてから次のフレームに移るときに、画面を綺麗にしないといけないのだ。じゃないと、どんどん上から画像が塗られていき、混ざってしまうのだ。
もちろん、この画面を綺麗にする処理も、ライブラリのおかげで簡単にできる。さっそく、画面を綺麗にする処理を書いて、再度実行して動かす。次は想定通り、画像が綺麗に切り替わりながら表示された。
最後にやるのは、キーボード入力で、画像を上下左右に動かせるようにすることだ。
まずは画像表示の位置情報を用意する。2Dゲームなので、横と縦の2つだ。もう1つ、どれくらいの速さで進むのかの情報も用意する。
次に、メインループの中で、特定のキーが押されていれば画像を動かす、というプログラムを書く。
右矢印キーが押されていれば、位置情報の横の値を増やし、左矢印キーが押されていれば、減らしていく。上下移動も同じように書いていく。
一旦プログラムを実行して動かしてみる。
想定通り、矢印キーを押して画像を動かす事ができた。
これでひとまず終了、といきたいところだが、もう1つやることがある。
プログラムの処理速度は、パソコンの性能によって変わる。画像が動く速さが変わってしまうのだ。
それに対処する方法は、現在の時刻と前フレームの時刻を用意して、差分を求める。そして、その差分を画像を動かす速さに掛けるのだ。これをデルタタイムという。
さっそくデルタタイムを実装して動かしてみる。
同じパソコンでそのまま動かしても処理速度は変わらないため、デルタタイムの確認はしにくい。そこで、疑似的に処理速度を落とすために、Sleepという一定時間プログラムを止める関数をメインループの中に追加した。
Sleepで止める時間を色々試してみる。ある程度の時間を止めると画面がカクついたが、飛行機が動く速さは一定になった。成功だ。
これで頼まれたことは終わった。画像を表示し、キーボード操作で上下左右に動かせる。任意のタイミングで画像を変えられるようにし、簡単なアニメーションもできた。
時計を見ると、まだ21時にはなっておらず、勉強をする前に少し休憩しようと、スマートフォンを取り出した。勉強机から離れ、ベッドで横になる。レンダリングとは何か、パディングとは何かと、気になっていた用語の意味を調べていると、隆也から通知が来た。
「調子はどうだ相棒」
お調子者に調子を聞かれるのはあまりいい気がしない。どうせ悪いなんて返事が返ってくることを、微塵も考えてないのだ。
とりあえず、お願いされたプログラムは一通り終えたということを伝える。
すぐに返信をしたつもりだったが、既読がつかないので、スマートフォンをベッドに適当に置いた。
寝転んで目をつぶり、今日は何を勉強しようか考える。sin、cosを使い、画像を円運動させることを春休みにやった。このままシューティングゲームを作るとすれば、ボスの周りを回り続ける敵を作ることができるだろう。
ゲーム1つ作ってくれよ。隆也に言われた言葉がふと浮かぶ。今なら作ってもいいかもなと少しだけ思う。今まではネットで拾ってきた絵を使いまわしていたため、不格好なものしか作れなかった。もしも秋晴さんが描いてくれるのなら、ゲームと呼べるものが出来るかもしれない。
勉強を始めるために、ベッドから立ち上がり勉強机に向かう。スリープモードになっているパソコンをたたき起こし、ウェブブラウザを開ける。sin、cosを使い、いろんな軌道をする弾でも作ろうかと思ったが、それはシューティングゲームを作ることになったらやろう。数学で他に勉強したいのは行列と微分積分だが、その前にやってみたいことがある。
ゲームエンジンというゲームを簡単に作れるものがあるのだが、ダウンロードしたきり一度も触っていない。このゲームエンジンを使えば、スマートフォンで動くアプリケーションも簡単に作れるらしい。
このゲームエンジンを開発した会社は親切で、公式サイトに豊富なチュートリアルがある。まずは初心者用の入門編を覗く。
とりあえず、3Dの玉転がしをやることにした。いずれはこのチュートリアルでやったものをスマートフォンでも動かせるようにしてみよう。
小さな箱の中で玉を転がし、コインに見立てたブロックを取っていく、という簡単なゲームを作り終えたころには、10時過ぎになっていた。すでに母親と父親が帰ってきていたらしく、リビングから話し声が聞こえる。
明日は休日だが今日は早めに寝よう。リビングに行き、おかえりとおやすみの挨拶を済ませ、水を一杯飲む。洗面所で歯磨きをした後、トイレで用を済ます。ベッドに行き、20分ほど本を読んでから部屋の電気を消す。
そういえば、隆也から返信は来てるだろうか。来ていたとして、明日返せばいいだろうか。すごく眠いわけではないが、スマートフォンに手を伸ばそうとは思わない。明日の自分に任せよう。いつものように明日がやってくるはずだ。きっと明日の自分は、今の自分と同じ自分のはずだ。どうでもいいことを考えながら寝れるのが、平和というものかもしれない。
俺は平和を噛みしめながら、明日の自分に生まれ変わろうとした。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます