レトロゲームプロジェクトの研究④Sokoban編
「今日調べるのは、倉庫番っぽいゲームプロジェクトのSokoban」
内容
タイルベースのフィールド上に置かれた箱を、全て目的地に移動させることを目的にしたパズルゲーム。
上下左右のカーソルキーで移動。
箱を押すことは出来ても引っ張ることは出来ない。
箱の色と、置く場所のマークの色は同じでなければいけない。
レベル構成
Mainmenu
開始画面・マップ選択画面。
全てウィジェットのみで進行。
Level1~4
難易度ごとのマップ
TileMapで壁と床と背景を表現する。
自機用のCharacterPawn_BPを配置。
箱はCrate_BP、目的地にはStrongePoint_BPを配置。
ブループリント
GameCamera_BP
カメラの他に、マップ上のポイント数と、ゲームインスタンス(GameInstance_BP)の初期化呼び出しも行っている。
Creat_BP
箱(荷物)のスプライト。
押せる状態かどうかの判定。
色設定と、同じ色の目的地と重なっているかどうかで画像を切り替える。
StoragePoint_BP
箱と重なった場合に同じ色か判定して、一致している目的地の数を更新。
GameInstance_BP
ゲームをクリアした状態かどうかの判定を行う。
クリアした状態と判断した時はウィジェットを表示。
CharacterPawn_BP
移動処理・移動先に箱がある場合は押す処理。
1手前の状態に戻すやり直し処理。
(毎回移動する前に現在位置を保存して、やり直しボタンを押すとその地点に戻る)
(箱を押す場合は押す前の箱の場所も記憶)
方向ごとのアニメーションを切り替える。
「これも有名なゲームで、色んなところで使われているゲームルール」
妹「押すのは物理とかでやったら駄目なんだよね?」
「それでもいいけど、ピッタリ動かすのは無理だから、それでもクリア出来るようなマップ構造にする必要がある。このプロジェクトではTileMapを使っていて、1マスが100cmという設定になっている」
妹「じゃあもし100の倍数じゃなくて、微妙にズレてたら……」
「なんだか変な感じになる。キャラクターや箱もピッタリ同じ大きさで、Locationも縦と横が100の倍数になるようになってる。ルールの改造は難しいけど、ルール通りのマップを作るのはわりと簡単に出来る。TileMapを編集して、箱や目的地のアクターをコピーしていくだけでOK」
妹「箱があるのとかは?」
「LineTraceで調べてる。このゲームもAIとかはないから、コリジョンの判定が一番むずかしい。箱を押せるのかどうかというところ。タイルべースのゲームだから、コリジョンを無視してLocationの位置関係だけで調べても良さそうな気がする。自分とLocationが100違うやつは隣にあるってことだから。コンストラクションの段階で100の倍数に揃える処理も入れておけばズレもなくせる」