ゲーム作るくんのサイト
ゲーム作るくん
Twitter

ゲーム制作における「モード」「シーン」「画面遷移」について

ゲーム制作に関する記事を読むと「モード」「シーン」「画面遷移」みたいな言葉が出てきて、何か近いようなことを言ってる気がするんだけど、もう一つ違いが分からない、ともやもやしてたんですね。

そのもやもやを抱えながらゲームを作っていく中で、こういう実装にしたらわりと整理できるのでは? というパターンが掴めてきたので個人的なメモとして残しておきます。

すべてを「モード」として扱う

これが一番しっくりきました。シーン、画面遷移、という概念をなくし、「モード」に統一する、という考え方です。

具体的には以下のようなモードを用意します。

type Mode = 'PleaseInsertCoin' // ページを開いたときの初期状態
  | 'ShowMyPrizes'             // 景品一覧画面を表示
  | 'CraneMoveRight'           // クレーンが右に移動しているとき
  | 'CraneMoveDown'            // クレーンが下に移動しているとき
  | 'CraneCatch'               // クレーンが景品を掴もうとしているとき
  | 'CraneMoveUp'              // クレーンが上に移動しているとき
  | 'CraneMoveLeft'            // クレーンが左に移動しているとき
  | 'CraneDrop'                // クレーンが景品を落としているとき
  | 'GetNewCoin'               // コインがなくなって新しいコインをゲットするとき

これはこちらの『ピクセルキャッチャー』というブラウザゲームを作ったときに用意したモードになります。

ピクセルキャッチャー

「画面遷移」という考え方をベースにしてしまうと、この「クレーンがどの状態にあるか」というのが表現できなくなってしまうんですよね。

「現在のモード」は常にひとつだけにする

こうすることで話が単純になって理解が追いつくようになります。

複数のフラグで状態を管理しようとすると頭が追いつかなくなって破綻します。私の場合。

「画面の切り替え」ではなく「ウィンドウの出し入れ」と考える

「画面遷移」とか「シーン」とかいう言葉に引っ張られがちなんですが、例としてドラクエ1で考えると、コマンドメニューを開いたときでもマップはそのまま映ってるし、お城から外に出たときも「コマンドメニュー」という仕組みはそのまま持ち越してるし、戦闘中もマップは映っているし、という感じで、「切り替え」というよりは「出し入れ」と考えた方がしっくりくるんですよね。

また「ウィンドウの出し入れ」という概念は PC を使うときに慣れているものなので、そういう意味でも混乱が少ないです。

みたいな感じです。