第 3 回 PSM 講習会 2014 年 6 月 10 日 分散システム学研究室 平野 翔一朗 1 2 3 はじめに 4 5 6 今回はゲームを作る上で, ほぼどんなゲームでも必要に 7 8 なるシーケンス遷移について解説する. シーケンス遷移 9 10 とは, 要するにタイトル画面からゲーム画面に移るような 11 12 ゲームの流れに関する処理である. 13 14 15 16 17 文でやる 18 1 2 if enum Sequence { SEQUENCE_TITLE , SEQUENCE_GAME , }; Sequence sequence ; public static void switch( sequence ) { case SEQU ENCE_T ITLE : Title () ; break; case SEQUENCE_GAME : Game () ; break; } } 一番簡単なのは,「今タイトル画面かどうか」を意味する 図 2 switch 文によるシーケンス処理 変数を用意しておいて, 毎回 if 文で分ける方法である. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 bool isTitle ; // 今タイトル画面かどうかを意味する変数 public static void Update () { これならシーケンスが 3 つ以上になっても対応できる. Update () switch は if-else に比べて自由度が低いので,if-else よりは { // 今タイトル画面なら if( isTitle ) { // タイトル画面で必要な処理を行う Title () ; } else{ // ゲーム画面で必要な処理を行う Game () ; } 整理されたコードになりやすい. ただし,break を忘れない こと. break 忘れの可能性を重く見るなら if-else を使うの も 1 つの選択だろう. それくらい break 忘れは重大かつ見 つけにくいバグとなる. } 1 2 3 図 1 if 文によるシーケンス処理 4 5 6 7 さて, 馬鹿正直に if 文と bool 変数で書いてみたわけだ 8 9 が, このやり方はどう考えてもまずい. まず bool では 2 個 10 public static void Update () { switch( a ) { case 1: Console . WriteLine ( " 1\ n " ) ; 2: Console . WriteLine ( " 2\ n " ) ; break; case } } しか判別できないから, シーケンスがもう 1 個増えただけ 図 3 break 忘れの例 で対応できなくなってしまう. もちろん int や enum を使 えばその問題は解決するが, それでも if-else がひたすら並 ぶことになってしまい, ソースコードが読みづらくなって a が 1 だと 1 と 2 が両方表示される.a が 1 の場合に しまう. 少し考えるとわかることだが, 普通のゲームでは break がないことがすぐにわかっただろうか. もっとコー シーケンスは少なくとも 10, 多ければ 100 を越えることも ドが長くなれば, このバグを見つけることは容易ではなく ある. これらのことを考慮すると, もっとよりよい方法を なるだろう. 考える必要がある. 4 課題 3 switch を使う それではできれば次回までに図 4 に示すようなシーケ もう少しマシな方法として, 適当な enum 型にシーケ ンスを実際に作ってみてほしい. 実際に作ってみることで ンス番号を入れておいて switch で分岐するという方法が シーケンス遷移が面倒なものであることが理解できるから ある. だ. 実際にやらないまでも, 頭の中で考える程度はやって 1 ほしい. 仕様を以下に示す. • タイトル 起動するとここにくる. 何か押されたらステージセレ クトへ行く. • ステージセレクト 3 つ程度のうちから 1 つを選択するとロードへ行く. • ゲームロード 「Now Loading」と表示しつつステージを初期化する. • ゲーム ゲームをする. ステージ名を表示するくらいでいいだ ろう. ○が押されたらメニューへいく. ×が押された らクリア画面へいく. • メニュー やりなおし, ステージセレクトへ行く, タイトルへ戻 る, 続ける, の 4 つの選択肢を用意する. 適当な画像を 用意してゲーム画面の上に重ねる. やりなおすならステージの状態を最初に戻してゲーム を再スタート. ステージセレクトへ行くならステージ セレクトへ. タイトルへ戻るならタイトルへ. 続けるな らそのままゲーム画面へ戻る. • クリア クリアと画面に表示する.1 秒経過したらタイトルに 戻る. 図4 シーケンス図 2
© Copyright 2024 ExpyDoc