前回に引き続き、menu:コマンド関連の話を進めます。今回はちょっと特殊な派生コマンドについての解説です。
【9-1】Map.Menu:コマンド
ADVゲームで、アイテムの隠し場所をクリックさせたりする用途を想定しています。
コマンド
Map.menu:[タイムアウト秒数]
メッセージ
<x1,y1,w1,h1>
->ジャンプ先
<x2,y2,w2,h2>
->ジャンプ先
~以下繰り返し
記述例1
Map.menu:10
画面をタップしてください。
<200,100,120,100>
->Segment:100
<400,100,120,100>
->Segment:200
座標は初期のキャラフレと互換性を維持するため、幅600pixel、高さ340pixelの物理座標を指定してください。
x,yは、クリックさせたい位置の左上座標。w,hは幅と高さになります。右下の絶対座標ではない点にご注意ください。
上記の例では画面中央付近のやや右とやや左の位置で、マウスカーソルが指の形にのハンドカーソルに代わり、クリックできることがわかります。
宝探しゲームなどで、クリックできる場所をわからせたくない場合もあると思います。その場合は、画面全体をクリックエリアとする座標を追加して、ハズレ処理へ飛ばすように記述しましょう。
記述例2
Map.menu:10
画面をタップしてください。
<0,0,600,340>
->Segment:900
<200,100,120,100>
->Segment:100
<400,100,120,100>
->Segment:200
下に記述した選択肢が優先順位が高くなりますので、ハズレ処理を一番上に記述します。
こうすることで、画面全体どこでもハンドカーソルになり、クリックエリアをわからなくすることができます。
【9-2】randmenu:コマンド
menu:のようにクリックを待って分岐するものではありませんが、似た構文のコマンドで、randmenu:というものがあります。
指定した確率に従って、ランダムに分岐するためのコマンドです。
コマンド
randmenu:
メッセージ(ダミーですが構文を揃えるため必須になります)
<比重値>
->ジャンプ先
<比重値>
->ジャンプ先
~以下繰り返し
記述例
randmenu:
ランダムに分岐(ここで指定する文字列は表示されません)
<1>
->Segment:100
<2>
->Segment:200
この記述例では、1/3の確率でSegment:100へ。2/3の確率でSegment:200へ分岐します。
比重値を総和で割った確率で分岐しますので、50%の確率で2分岐させたい場合は、<1><1>と指定してもいいですし<50><50>と指定しても構いません。
ランダム分岐がなぜmenu構文をとっているかというと、デバッグをしやすくするためです。
デバッグの時に、すべての飛び先が正しいかどうかを確認するには総当たりでテストせねばならず、レアな確率を指定すると、どうしても膨大なテスト回数が必要になってきます。
randmenu:コマンドを使って確率分岐するようにスクリプトをくんでおけば、テスト時に以下のように書き換えるだけで、簡単に総当たりができます。
テスト時の記述例
menu:
ランダムに分岐(ここで指定する文字列は表示されません)
<1>
->Segment:100
<2>
->Segment:200
randmenuの部分をmenuに書き換えるだけで、そのまま画面にメニューが表示され、任意の選択肢を選んでテストすることができます。総当たりテストが終わったら、menuのところをrandmenuにするだけで、本番バージョンになります。
ランダム分岐のあるゲームのテストを簡単にする、キャラフレスクリプト特有のテクニックとして覚えておいてください。