第3回PSM講習会資料 - 分散システム学研究室

第 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