レトロゲームプロジェクトの研究③Snake編
「今日は妹が特に困ってないので、先日のレトロゲームプロジェクトの研究の続きを」
妹「いや非常に困ってはいるんだけどね。複数コリジョンのやつとか……」
ゲーム内容
赤いブロックを上下左右に動かして、星型のアイコン(食料)にぶつけると得点。なるべく早く当てると高得点。
食料を食べると黄色いブロックがお尻のところに追加されて、だんたんブロックがとぐろをまいた蛇のようになっていく。
一度移動するとその方向に動き続けるので、方向転換をしないと壁に当たってゲームオーバー。
壁だけでく、蛇のしっぽにも当たってもゲームオーバーなので、後半は食料を取った後に上手く次につなげられるような動き方も大事になる。
構成
カメラが1つと、背景画像、それとMainGame_BP
GameModeは設定だけでブループリントは無し
ブループリント
レベルブループリント
レベル上のカメラを使用する
MainGame_BP
ゲームを管理しているブループリント。GameModeのような使い方をされている。
ある程度のまとまりごとにグラフを折りたたまれていて、全体像が把握しやすい。
BeginPlay -> ウィジェットを有効化。四方の壁、蛇の頭ブロック、最初の食料のスポーン
Tick -> 一定時間Delayする。壁などに接触したかを判定。食料を取った場合は加点と尻尾追加、新しい食料をスポーン。蛇の移動
妹「こういう感じのゲームは何かでやったことある気がする」
「スネークゲームとかヘビゲームとか言われるタイプのゲーム。これもPongと同じく古いゲームだけど、蛇の部分はどんな絵にしても成立するから、ゲーム内でのミニゲームとしても使われてることもある。妹も多分そういうので見たんだと思う」
妹「これだと対CPUとかはないよね」
「それはないね。ちょっとむずかしそうなのは蛇の動きのあたり。Tickのところに折りたたんである、MoveSnakeというのがその実装部分だけど、頭は今まで動いてたのと同じ方向に動いて、後ろの胴体とか尻尾とかは、1つ前のやつと同じ位置に移動する。こうするとにょろにょろ動く感じになる」
妹「前の場所を覚えておかないといけないの? 例えば1つ目のブロックを、先頭があった位置に動かそうとするでしょ? でもその時先頭が動いた後だと、先頭が動く前の位置がわからないし。逆に後ろからやると移動前のやつと重なっちゃいそうだし……」
「そのへんは何も対処されてない。SetActorLocaionしてもすぐに移動するわけじゃなくて、そのイベントが終わったり、Delayした後にしか反映されない。だからGetActorLocationすると、動く前の位置が出てくる。蛇を構成するアクターは配列に入れてあって、配列の自分の番号から1引くと、自分の前のアクターがわかるようになっている」
妹「これはこれでなかなか難しそう……」
「1つ前に居るアクターの、直前の位置に動く、つまり先頭と同じルートを後続も通っていくやり方は、RPGの隊列移動でも使われてる。なにかと応用が効く仕組み」