こんにちは、kenoです。
引き続きまして、インターンシップのよもやまおはなしを。
どうピクミンを使役するかってさ。
前回まででピクミンをランダムで生成して捕まえるところまで行きました。
ここまででおおよそ3日間が経過しています。
ここからはどうピクミンを使役していくかを考えていきました。
一番イメージに近いのは、巨大なリンゴがあってそれにピクミンを必要数投げると、えっほえっほとみんなで運んで行ってくれるという動きです。
必要数集まるまではうーんうーんとかわいい声でうなりながら集まるのをまつイメージでした。
しかしね、音声までつけてると今回は時間ないのでそこは実装できませんでした。今後つけたい!
まずは丸いオブジェクトをBlenderで作成し、ステージに置いてみます。
しかしそれだけではだめなので専用のクラスを作成しました。やってることはとりあえずオブジェクトをちょうど囲えるような立方体のフレームを表示して、その範囲に捕獲したピクミンを投げ入れたらオブジェクトのもとに集まってくれるというふうな感じ。
ピクミンの配置にちょっと工夫。今回は丸いオブジェクトだったので、それを囲むように配置されてほしかった。360°をあつまったピクミンの数で割り、均等に並ぶようなプログラムにしてみました。
また、おなじクラスの中でピクミンの集まった数をカウントしておき必要数集まったら移動という形にしました。しかし移動先を設定するのはちと面倒。
ということで必要数集まったらプレイヤーにむかって移動するようにしました。
これだったらこのオブジェクトを好きな位置に持っていくこともできるし、移動先を設定する必要もない。
また、ちょっと躓きましたがオブジェクト運搬中のピクミンをもう一度三角錐でつかまえたら運搬から外すことが出来るようにもしたんです。
これでピクミンを使役する機能完成!
ゲームを広く!ステージ拡張の4日目
4日目。折り返し地点になります。
ここで困ったことになりました。
もともと僕が考えていたゲームの全体像はこんな感じ↓
・最初はメインの大きな部屋からスタート
・メイン部屋の四つ角にそれぞれ小さな部屋があり、そこでひとつずつピクミンをつかった仕掛けを解く。
・最後にメイン部屋の真正面にあるボス部屋へ行きボスを倒してクリア
いやー、なめてましたね。自分の実力。
こんなの1週間で終わるわけない!終わるわけないんですよね。
友人からもいくつか指摘をいただき、いまできうる最大限を目指すべきと方向性を変えました。
結局つくったゲームの全体像はこんな感じ↓
・ステージは全3部屋(+1部屋)により成り立っている
・それぞれの部屋は縦に連結しており最初の部屋から順番にクリアしていく形
・それぞれの部屋でピクミンをつかった仕掛けがあり、それを解いて最後の部屋まで向かう。
これだったら部屋の形も使いまわせるし、どの順番で行くかプレイヤーを悩ませる必要もない。ちょっと面白味には欠けますけどね。
いままでは大きな部屋のステージを使用していたのですが、それを改良して中規模の部屋にしてそれを3連結したステージのモデルに切り替えました。
そして、それぞれの部屋で仕掛けを作りました。
最初につくった運搬オブジェクトのクラスを継承して、2つ目の部屋のオブジェクト、3つ目の部屋のオブジェクトを作成しました。
ここもちょっと躓いたポイント。C++をしばらく使ってなかったのでやり方を忘れていました。下のように継承を書いていたんですが・・・
class Second_Object : First_Object{
...
}
これだと継承元のクラス(今回の例ではFirst_Object)の変数や関数を使えなかったんですね。あれー?つかえるって話じゃなかったっけ?と思ってたんですが・・・
class Second_Object : public First_Object{...}
publicかー!ぬけてたー!
これをつけないと継承元のものを使えないようですね。
もちろん継承元クラスのprivateはprotectedに変える必要アリですけど。
2つ目、3つ目の部屋の仕掛け(5日目、6日目)
2つ目の部屋の仕掛けは(ありきたりですが)大きなスイッチにしました。上から押すタイプのスイッチで、スイッチのうえに必要数ピクミンを投げると重さで押されてとざされた門が開くといった形。
1つ目のオブジェクトとまた仕掛けの形式が違うのでちょっと時間かかったりしてるんですがあまり面白くないので割愛。
また、この時点で1つ目の部屋、2つ目の部屋とステージが進むごとに登場するピクミンの種類を増やそうと画策しました。
三種類ピクミンを作ったのはこういう意味があったんですね。
そして3つ目の部屋では、この3種類のピクミンをそれぞれ当てはまる壺に必要数投げ入れるという仕掛けにしました。
それぞれの壺は各ピクミンの姿を形どったもので、直感的にどれに投げ入れればよいか分かるようにしました。
また、Dxlibの公式ではインポートした3Dモデルのワイヤーフレームだけ表示するという関数はなかったようなんですが、調べたところ隠し関数をまとめたサイトのほうにこんなものがありました。
int MV1SetWireFrameDrawFlag( int MHandle, int Flag ) ;// モデルをワイヤーフレームで描画するかどうかを設定する
実際にこれを使ってみると渡したハンドルのモデルがワイヤーフレームになりました!
ピクミンを投げ入れる壺はワイヤーフレームで中身が見えるとよいなと思っていたので今回はこれを使いました。
3つ目の仕掛けではそれぞれの壺に必要数ピクミンを投げ入れると2つ目の仕掛けと同じように閉ざされた門が開く仕掛けにしました。
最後の部屋にたどり着くとゲームクリアという形になります。
じつは、1週間とタイトルにも入っているんですが正確には6日目が応募の提出最終日でした。つまり僕はこの3つ目の仕掛けを提出前ギリギリまでやってたことになるんですね。
ほんとに大変でした。提出したのは最終日の23:30ごろ。
ギリギリに提出するのが良くないこととわかってはいるんですが、今回は気づいたのが遅すぎた。ギリギリまで作業しないと完結しなかったんです。
しかし! 逆に言えば僕は6日間でゲームを作り上げたわけです。
ほめてほしい。
ゲームを作っている人はみんな共感してくれると思いますがそもそも完成させるってなかなかできないことだと思うんですよ。
ひとまず自身の技術力がある程度伝わるゲームにはなったかなと思います。
インターンシップの結果は6月中旬に出るそうなので気長に待ちたいと思います。
いや!やるべきことはまだまだあるけど!
kenoでした。