第2.3話 共同作業

 授業の内容は、特に覚えてない。とりあえず黒板に書いてあることをノートに写し、先生が言っていることや、教科書に書いてあることを、大雑把にノートの端に書きこみ、まとめてる風に仕立てた。

 今日から部活見学が始まる。一緒に行こう、この裏切り者がーなど、楽しそうな声が聞こえてくる。

 シューティングゲームの完成を目指すために、まずは打ち合わせである。

 隆也からは、楽しみにしてるぜ、とだけ言われた。

 職員室に行き、第二コンピュータ室を使う許可を貰いに行く。鍵を貰い、第二コンピュータ室の前に行くと、すでに秋晴さんが着いていた。

「どうも」

首だけでお辞儀する。それにつられて秋晴さんも同じように会釈する。

「鍵ありがとう。帰りは私が持っていく」

お気遣いどうも。

 カチャリと鍵を開ける。他の教室に比べると少し狭いが、二人しかいないということを考えると、丁度いいのかもしれない。うむ、ドアは開けておこう。

 何も置かれてない長机にスクールバッグを置く。もう片方の長机の方に座り、ノートパソコンを開く。秋晴さんが持ってきたUSBメモリを挿し込み、描いてくれた絵を確認する。

「使えそう?」

右隣に座った秋晴さんが聞いてくる。先日、ラフを送ってもらったが、よく描けてると思う。

「上手いな、高校生でここまで描けるものなのか?」

「どうだろう、他の人の見ると、私はまだまだだなって思うけど」

知り合って長くはないが、秋晴さんが謙虚なのはすぐにわかることだ。こういう聞き方をすれば困るというのは容易に想像できる。反省が必要だ。

 画像をパソコンに移した後、USBメモリを抜き、自分のUSBメモリを挿し込む。必要なデータだけをパソコンに移し、そして引き抜く。データは圧縮してあるので、展開する。

 この後は環境の構築だ。元々ゲーム制作部が使っていたパソコンだけあって、プログラムを書くためのソフトは入っている。ソフトを起動し、移したデータの中から、土曜日に作成したプロジェクトを開ける。ライブラリを用いるので、設定を行う。何度もやった作業ではないので、メモを見ながらになる。設定を終えたところで実行してみる。無事に動くことが確認できた。こういうときは1度目は上手くいかないことが多いのだが。

 四角が動いているだけで、秋晴さんにとってパッとしないだろう。早速、秋晴さんの描いた絵を動かしてみることにする。

 プロジェクトファイルの入ったフォルダの中に画像を入れるためのフォルダを作成する。そのフォルダの中に秋晴さんの描いた絵を移動させる。

 次はプログラムの方だ。画像を読み込んでいるところを修正する。修正といっても、テスト用に使っていた画像のファイル名を書いていたのを、新しく使う画像のファイル名に変更するだけだが。

 実行してみると画像は表示されず、画像のファイル名を確認すると、形式がpngではなく、jpgになっていた。すぐに修正して実行する。

ん?ちょっと待てよ。

 画像は表示されたが、飛行機の周りが白色で塗りつぶされている。おそらく秋晴さんは飛行機の背景を透明にしたのだろう。しかし、JPGは透明に対応していないため、白で塗りつぶされたのだ。透明度の情報が無い分、pngよりも少しデータ量を抑えられるが。

横から、あ、忘れてた、と聞こえてきた。

「修正頼めるか?」

「帰ったらすぐに」

 背景が白くても、テストプレイはできる。すでに飛行機のジェットのアニメーションは確認できていて、ボウボウと燃えている。キーボード操作で動かしても違和感は無い。

「大丈夫そ?」

秋晴さんが聞いてくる。

「いい感じだ」

これだけ描けるのだ、もう少し自信を持ってほしいものだ。これだと何も描けない俺が小さく思えるじゃないか。

「飛行機の背景直したとして、次は何描けばいい?」

他に必要な絵をピックアップしとくか。シューティングゲームに必要なものは、プレイヤーが操作する飛行機以外に、敵、弾、背景だ。他にUIも必要だろう。

 UIというのはユーザーインターフェースの略であり、ユーザーとサービスの間を取り持つためのもの。らしい。HP、経過時間、一時停止している時なら続行するか終了するかの選択肢、そういったゲーム内の情報をできるだけ見えるようにするのは、必要不可欠だろう。しかし、UIは最後だ。何せどこまで作り込むかをまだ決めていない。

「そうだな、飛行機から発射される弾とかどうだ?まっすぐ出るのが標準だとしたら、他に、敵を追いかけるミサイルとか、考えればいくらでも作れるぞ」

仕様書の書き方を調べて、必要な絵をまとめる必要があるな。

 ちょっと調べてみると言って、秋晴さんはスマートフォンを開けた。

「ミサイルはわかるんだけと、まっすぐ出る弾っていうのがわからなくて、こういうの?」

秋晴さんのスマートフォンには、しずく型をした弾が横を向いて写っていた。右側が太く、左側が尖がっているので、右向きなのだろう。

「俺のイメージ的にはそうだ」

まずいな、俺の意見だけで進んでいる。

「秋晴さんは何かあるか?こんな弾があれば面白そうだとか、弾で無くても、こんな敵がいればいい世界観が出来そうだとか」

うーんと、秋晴さんが考え込む。

「あんまりシューティングゲームやらないから、どういうのがいいか」

聞き方が悪いのだろうか、こういうときどんな聞き方をすればいいのかわからない。そもそも、アイデアはすぐに出てくるものではない。

「じゃあ、シューティングゲームに関係なくていい、何を描きたい?」

初心者にとってシューティングゲームを作るメリットの1つが、どんなものでも使えるということだろう。落書きのような絵でも、すごく良くできた絵でも使えるし。画像から人の顔を切り取って使うこともできる。ゲームのアイデアを元に絵を描いてもいいし、絵を元にゲームを考えてもいいのだ。

「やっぱり人かな、既存のキャラクターでも、オリジナルでも、楽しそうな表情を描くのが好き」

一辺倒なだけだけどと、秋晴さんは少し笑った、ような気がする。

 楽しそうな人を出すとしても、それは敵キャラである。味方キャラがいれば、ゲームとしてのクオリティを上げやすいが、作るものは出来るだけ増やしたくない。二人だけのチーム、最低限必要なものを考えなければ。

「楽しそうな表情をしてる人を、敵キャラとして描いてくれないか?できれば強そうに描いてほしい。ボスにしたい」

頭の中で不敵に笑う魔王的なキャラクターが浮かぶ。

「それならメドゥーサなんてどう?髪が蛇の女王様なんだけど」

メドゥーサか、確か見たものを石化するとか、髪は毒蛇だとか、何かで聞いたような見たような気がする。石化と毒、ボスキャラとしては申し分ないだろう、良い案だ。雑魚キャラも蛇でいけそうだ。

「それでいこう。雑魚キャラは蛇でどうだ?羽があればそれっぽくなると思うんだが」

「わかった、羽の生えた蛇。描いてみる」

秋晴さんは頷くと、リュックからスケッチブックを取り出した。全体的に黒色でファスナーが金色である。俺の好きな色が2つも使われている。格好いい。

「あと1時間くらい大丈夫?一旦こっちでラフ描いてみようと思うんだけど」

「ああ、大丈夫だ」

1時間か、俺のほうも少しはプログラムが組めそうである。

 まずは、ボスキャラであるメドゥーサと、雑魚キャラである羽の生えた蛇の、どちらも共通して持っている情報を考える。もう少し考えると、プレイヤーの操作する飛行機も合わせて、すべてのキャラクタに共通する情報を考える。

 位置、大きさ、向き、移動スピード、HP、アニメーションのスピード、画像データ、画像データの中で現在表示する画像を指定するための値、あたりだろうか。石化などの状態異常系の攻撃をメドゥーサだけでなく、飛行機もするのであれば、状態に関する情報も共通して入れるべきだが、それはまた後から決めても大丈夫だろう。

 早速、Characterという名前のクラスを作る。位置やスケールなど、必要な変数も入れていく。

 次に、変数を扱うための関数を作っていく。キャラクタが複数いても、それぞれ独立して自身の変数の値を扱えるようにする。これをメンバ関数という。

 まずは値の初期化を行う関数を作る。基本的には生成時の一度だけ行えばいいので、コンストラクタというものを用いる。コンストラクタは、キャラクタ及びオブジェクトが生成されたときのみの最初だけ呼び出される関数だ。引数が同じでなければ、同じ名前の関数を複数作れる。すべての値を初期化したい時も、位置とHPだけ初期化したいという時も、同名の関数を呼び出して使えるのだ。画像データの読み込みは必ずしないといけないので、すべてのコンストラクタで行わせる。

 初期化を行うだけでは、動かすことはできない。常に位置や大きさなどの値を更新し続けないといけないのだ。この常に更新する関数はUpdate関数と呼ばれている。アップデート関数があることはキャラクタ全てで共通なのだが、飛行機やメドゥーサ、羽を生やした蛇はそれぞれ違う動きをするので、中には異なるプログラムを書く必要がある。とりあえず、キャラクタークラスではアップデート関数の宣言だけを行う。

 そして、どれだけキャラクターを動かしても、画面に映らなければ意味が無い。描画関数を作る。といっても、描画に関しては、ライブラリが面倒な部分をやってくれているので、簡単である。Drawと名付けた関数の中に、指定した画像を指定した位置、大きさ、向き通りに表示してくれる関数を書くだけである。指定する画像や位置などは、さっき用意した変数である。

 一旦これでキャラクタークラスを書き終える。位置など、他からでも確認したい情報を取得するための関数も必要なのだが、それはまた後にする。

 キャラクタークラスを元に、まずは飛行機のクラスを作っていく。キャラクタークラスのような元になるクラスを基底クラスといい、基底クラスを元に作る飛行機クラスのようなクラスを派生クラスという。また、キャラクタークラスのアップデート関数は未完成なため、このクラスのみでは使えない。派生クラスでアップデート関数の中身を実装しないといけないのだ。アップデート関数のように、派生クラスで実装しないといけない関数を純粋仮想関数といい、純粋仮想関数を持つキャラクタークラスのようなクラスを抽象クラスという。

 飛行機の動きはこの前作ったのと一緒であり、とりあえずはそのまま使う。キーボード操作で動き、画面からはみ出さないよう調整するというだけの処理だ。

 描画も一緒で前に書いたコードをそのまま描画関数の中に持ってくるだけである。

 また、飛行機には状態という情報を独自に持たせる。今のところは、何もなし、石化、毒だけだが、簡単に増やせるようにすれば、後が楽である。マクロというものを使えば、メモリを節約したり、処理が早くなると見かけたことがあるが、今回は列挙型というものを使う。例えば、整数を入れる変数を作り、状態を数字で代替したとする。何もなしを0、石化を1、毒を2といった具合だ。しかしそれだと、10や100など他の値が入れてしまう。それではバグの原因になる。そこで、決まった値だけを入れる変数を作る必要がある。それが列挙型である。Conditionという列挙型を作り、Well、Stone、Poisonという定数を定義する。定数というのは変数とは違い、途中で値を変えることができない入れ物である。

 飛行機に必要な情報は用意できた。初期化を行うコンストラクタ、飛行機の情報を更新するアップデート関数、飛行機を描画する関数もできた。後はこれを使うだけである。

 前に書いた飛行機に関するコードは消してしまう。

 飛行機の画像は複数枚あるので、動的配列として変数を作り、そこに読み込みを行う。

 飛行機の変数を作り、コンストラクタに必要な値を入れていく。必要な値には画像もある。大きさ、移動スピード、アニメーションのスピードには0を入れないことを注意する。大きさが0であれば消えてしまうし、移動スピードが0では動かず、アニメーションのスピードが0だと画像が切り替わらない。

 飛行機の初期化が終われば、メインループの中に、アップデート関数と描画関数を書く。前に飛行機の処理を書いていたところにアップデート関数を書き、その下に描画関数を書く。

 実行してみて動くことを確認する。

 区切りがいいので、ここで作業を終わりにする。

 横を見ると、秋晴さんはラフが描かれたスケッチブックと睨めっこしていた。

「一応描けたんだけど、どう?」

俺が作業を終えたことに気づき、秋晴さんが聞いてきた。一応と言っているだけに、あまりしっくりはきてないようだ。

 スケッチブックに描かれたメドゥーサは、不敵な笑みを浮かべつつ上から目線で、敵のボスだとすぐにわかる。髪として描かれた蛇達は、こちらを向いて口を開けていたり、メドゥーサ本人にまとわりついていたり、別の蛇と喧嘩していたりと、それぞれが意思を持っている。まだ色はついていないが、それでも十分だと言いたくなる絵だ。

「いいと思うが、しっくりきていないのか?」

描いた本人だからこそ、思う事があるのだろう。いや、俺に絵心が無いだけなのか。

「手と足が、なんかいいの思いつかなくて」

もう一度絵を見せてもらう。右手は左の方、飛行機が飛んでいる方を指し、左手は腰に当てていた。足は横座りの姿勢だ。飛行機が飛ぶということは、舞台は空だ。メドゥーサがどういう原理で空を飛んでいるのかはわからないが、これはシューティングゲームであり、そういうものなのである。

 ふむ、素人目に見れば、悪いところは見つからない。もちろん細かく見れば無い事も無いのだが、結局それはラフだからで片付く。

「でも時間もないし、これでいこうかな」

創作において最も必要な心構えは妥協だろう。まぁでも、

「納期があるわけじゃない。やれるだけやってくれ」

このシューティングゲームは自己満足のためのものだ。それに絵をすぐに描かれると、俺が忙しくなる。

「わかった、でもこれでいこうかな。他に思いつかないし」

秋晴さんはそういうとスケッチブックをリュックにしまい込んだ。

 時刻は5時を少し過ぎたところ。まだ下校時刻ではないが、作業には区切りというものがある。秋晴さんは敵のボスであるメドゥーサのラフを仕上げ、俺はシューティングゲームを作り上げるための準備を行った。俺自身はまだ勉強を始めて間もなく、周りにご教授を願える人もいないので、あれでいいのかはわからないが。

 スクールバッグを背負い、部屋から出る。秋晴さんも出てきたことを確認すると、鍵を閉める。秋晴さんが、帰りは自分が鍵を返しに行く、と言っているので、お言葉に甘える。

「じゃ、気を付けて」

鍵を渡し、軽い挨拶を交わして、さっさと帰る。

 日が沈むのが遅くなってきたとはいえ、まだ少し寒い。人といるのが好きなわけではないが、こういうとき一人だと、寒さが少し増しているような気がする。

 第二コンピュータ室のある特別棟を出て、校門に向かう途中、体育館の前を横切る。普段は他の生徒の活動にはあまり興味を持たないのだが、今はなぜだか、横目に見るくらいには気になる。扉が開いていて、中が見えた。掛け声と床を叩きつける音が、ひっきりなしに聞こえてくる。茶色の丸い物がとんでいた。今まで自分とあれらは違う生き物のように思っていたのだが、そうではないのかもしれない。寒さがまぎれたような気がした、ほんの少しだけ。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る