2012年5月7日月曜日

( Game ( C++ ) )状態遷移について その2

はい、ゴールデンウィークあっという間でしたね。ほんと短かったですね。

それでは前回のつづき 状態遷移について書いていこうと思います。前回の問題やってみましたか? どうです簡単にできましたか?

「なぁに簡単だろ。 main かいて、cin 書いてswitchで分岐させてcoutさ!」


まぁそう書いた方はいないと思いますが、一応書いておきます。激しく違います。ゲームは当分無理でしょう。

まぁ多分ほとんどの方はこんな感じ書いたんじゃないですか?

//例です。
switch( STATE )
{
case TITLE:
    TitleClass.Scene();
    break;
case GAME_1P
    GameClass.Scene( GAME_1P );
    break;
case GAME_2P
    GameClass.Scene( GAME_2P );
    break;

....
}
んでもって
「あれっポーズした後、どのシーンに戻るんだ? case足して...フラグ用意して、ifで分岐と...さらに関数でくくってと...これで完成!!...汚っ!」
ですか...そんなあなたは私と同レベルです。(勉強が足りません。お互い精進しましょう。)

 なんでこれがダメなのか?小規模なゲームだとか趣味ならこの方法で許されるでしょう。しかし、大規模かつ金銭が絡む場合にはこの方法ではまずいでしょう。
 何がまずいのか?市販のゲームを思い出してください。ポーズ画面からオーディオ設定画面やらに飛べて便利な造りになっています。んでこの方法とると凄まじい 条件処理が必要となります。統一的な処理とは程遠いものができあがってしまうのです。これは関数にまとめたって変わりません。switch{...}内はスッキリしますが まとめた関数内は依然カオスのままです。セーブ、ロードなんかも加わると汚くてもうやってられません。

また、ロジックをまったく使いまわせないという問題もあります。ゲーム毎にいちいちオリジナルのswitch分岐を書かなければなりません。分業も無理ですね。

 じゃあどうするのがいいのかというと私にはわかりません。私にはそんな実力はありません。(笑)

「は!? じゃあどうすんだ?オラァァ!!得意げに語ってるんじゃねぇよ。答えださんかいっ!コ・タ・エェェ!」

と思った方。まぁ落ち着いてください。私の中からは何にもでてこないので「ゲームプログラマになる前に覚えて起きたい技術」を参考にしていきたいと思います。

 この本の内容全部書くのはマズいんで簡単な考え方だけを書いていきます。
 1.各シーケンスはクラス化すること
2.継承をうまく使い、各シーケンス処理を統一化すること
3.各シーケンス管理クラスを作成すること

以上です。まぁ後は本買ってくださいとしか言えませんが、まぁ勘のいい人ならひらめくのではないでしょうか。 一応ゲームプログラマになる前に覚えて起きたい技術本のサポートでサンプルコードが公開されているようなのでこれをダウンロードしてみるのもいいのかもしれません。 (本付属のディスクと同じ内容です。)

コード説明すると長くなるので私が本を参考にして作ったサンプルプロジェクトをフリーソフト公開ページからダウンロードできるようにしておきました。 どんな感じのコードなのか見たいかたはそちらを見てみてください。DebugフォルダのSequenceSample.exe起動すると一応動作も確認できます。
(ただ、これは本で言うと、まだまだ改良ができるレベルのコードだそうです。更に改良の方法について 知りたい方はあきらめて本を買ってください。)

 あぁ長かった。以上です。