■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第58夜:起動時メニュー いよいよ本講座も今回で最終回です。ここでは、プログラム起動時に表示されるスタートメニューを作成します。内容的にはシステムメニューとほぼ同じなので、ここでもコピペ改造でお手軽に済ませてしまいましょう(…ってどこまでもコピペかーっ:爆 ^0^) とゆーことで、ソースはこちらです。 ■起動時メニューとは 市販/同人を問わず、ゲーム起動時に「はじめから」「LOAD」「EXIT」などと表示される、いわゆるひとつの起動時メニューです。ゲームによってはBGMモードやCG鑑賞モードがついている場合もありますが、ここではそこまでの機能は追及しないことにします(→だって要するに簡易メディアプレーヤと画像ブラウザを作るってことですからねぇ +▽+)。 起動時メニューは、処理そのものは通常のシステムメニューと同じです。違うのは、キャンセルでメニューを抜けることが出来ないことと、「最初からスタート」があることでしょうか。またメニューの起動もマウスの右クリックなどではなくプログラム起動時に自動的に表示されるという性格のものになります。スクリプターの意図によっては、タイトルロゴや簡単なオープニング処理の後に表示したい場合もあるでしょうから、スクリプトの中に埋め込めるような仕様であることが望ましいでしょう。 そのような次第で、ここでは起動時メニューをスクリプトコマンドとして作成します。コマンドの書式は以下のようなものにしちゃいましょう(・ω・)
メニュー表示項目はシステムメニューに倣って「LOAD]「EXIT」、そして「最初から」にします。
…こんな単純なのでいいの? と抗議の声が聞こえてきそうですが、これで十分です。なぜならLOADを選択すればゲームはSAVE時の状態からそのまま継続という流れになるのでメニューの終了方法についてはほとんどノーケアですし、EXITは文字通りプログラムの終わりですからやはりノーケアで十分なのです。では「最初から」が選ばれたときはどうすれば良いかというと、なにもしないでテキスト処理を再開すればよいのです。なにもしないでテキスト再開…ということは #start_menu コマンドの直後から普通にテキスト解釈が始まるということで、コマンドの直後からそのままゲームの冒頭部分を続けて記述していけば面倒は要らないということになります。まるで何も考えていないような仕様ですが、変に凝ったものを作って使いにくくなるより100万倍くらいマシではないかと…(爆死 ^^;) ちなみにBMPは以下のようなものを使用することにします。
■Mode_stat 通常のシステムメニューと動作は似ているのですが微妙に異なるところもあるため、ここでは別個のタスクとして実装しましょう。Mode_statには flag_start_menu という名前でフラグを追加します。起動時メニューのあらゆるタスクはこの1個のフラグでループを切り替えながら排他的に動作します。 |
struct _Mode_stat {
extern _Mode_stat Mode_stat; |
■コマンド解釈部 いつもの要領でコマンド名と処理関数を追加します。 |
void Command_call() {
|
■Mainloop システムメニューと同じ要領で、各タスクを呼ぶ部分を追加します。ここではBGM再開のMainloopカラ回りタスクはシステムメニューの一部を流用しているので(まあソースを見ていただければ最後にフラグをすりかえてシステムメニューのタスクを回してポイ、としているのが分かると思いますが ^^;)除いてあります。 |
void Mainloop(void) {
|
■コマンド起動部分(撃つ) 処理関数 Com_start_menu() では、パラメータ解釈をして窓を開く座標を取得したのち、座標をグローバル変数 _start_menu_pos_x、_start_menu_pos_y に格納して窓を開く関数 _start_menu() を読んでいます。このようにスクリプトのパラメータ解釈をする部分と実際の処理部分(タスクを「撃つ」部分など)を分離して記述すると、スクリプトからだけでなくプログラム上からもタスクの起動ができて便利です。スタートメニューは子ウィンドウ上でキャンセルが選択されてもメニューモードは抜けないで、また親メニューの表示に舞い戻らなくてはいけないので、そのへんを記述するためにこんな書き方にしてあります。さてそれで窓の開き方ですが、これまでのメニュー処理と要領は一緒なので、とくに難しいところはないと思います。 |
//===================================================== _Menu_Win StartMenu_main; //メインメニューの窓情報用 //名前が長いと面倒なので短縮表記を定義(^^;) int _start_menu_pos_x; int _start_menu() //システムメニュー窓を開く
int Com_start_menu() //システムメニュー窓を開く(スクリプト版)
|
■回す これも従来と要領は同じなのであまり解説する意味がありませんね(^^;) 注目してほしいのは「最初から」が選択されたところで、さきほどの _Start_menu_task_end() を呼んでそのまま終わって(=フラグを戻してテキスト処理を再開)います。つまり、#start_menu コマンドの直後から普通に従来どおりのテキスト解釈が再開するわけで、「最初から」に相当する特別な処理をする訳ではありません。この世界の神であるくににんは、とても安直なルールを適用した訳です(笑) |
int Start_menu_task() //システムメニューのタスク部分 {
|
■締める これも従来と要領は同じですね。もう、こぴぺぺぺぺっ・・・と(爆) |
void _Start_menu_task_end() //タスクの終了処理部分を分離したもの {
} |
■LOAD&EXIT LOADとEXITに関してもループフラグの名前が違うくらいでシステムメニューと内容は一緒だったりしますので、さすがにこれ以上の解説は省略させていただきます(だってリストを載せても毎度毎度コピペばかりなんですものっ…@▽@)。ここはひとつ、処理の流れはソースを読んで自力で処理を追いかけてみてください。ここまで読み進んでこられた根性のあるみなさんなら、ワンパターンな記述に始終している選択窓処理の流れは分かっていただけるだろうと思います♪ さて、それではいよいよソースをコンパイルして実行してみましょう。気の抜けたようなタイトル画面で申し訳ありませんが(笑)、ちゃんと起動時メニューは機能していますね。メニュー表示座標はスクリプト上から引数で自由に設定できますので、タイトル画面のデザインに応じて前後左右に寄せて表示することも可能です。いろいろ遊んでみてください。 |
|
起動時メニューはスクリプトコマンドですので、ちょっとしたドラマとか演出を行ったあとでカッコいいタイミングで表示することができます。今回のサンプルスクリプトでは真っ白な起動画面にソフトハウス名「Hobby
Land Soft.」を表示ししてタイトル画面にフェードインするだけですが、スクリプターのセンス次第でこのへんの演出はいかようにも工夫できるのではないかと思います(・ω・)ノ さて…ともかくこれでオーソドックスなノベルプレイヤーとしての基本要件は一通り満たすことができ、ました。ひとまず完成です。・・・「完成」っ! ・・・ああ、なんと素晴らしき甘美な響きの言葉でしょう!(T▽T) ・・・とはいえ、どんなバグが出るか怖いところもありますので、いきなり Ver 1.00 とはしないで Ver 0.10 くらいで控えめにリリースすることに致しましょうか(汗 ^^;) ちなみに、今回のソースをコンパイルして実行すると、なんと本講座のエンディング(…なんだよそれ:笑)が流れたりします。スケルトンから始まって最終回までの開発過程を追いかける単純なものですが、あらためて開発過程が走馬灯のように浮かんでちょっとばかり、じ〜ぃぃぃんときてしまいました。まあ、この種の感慨は開発者にのみ許される特権ですのでゆっくりと味わうことに……え?不具合報告ですかっ!?そーゆーことは、内密にメールでももももっ!(爆汗 ^^;) |