■ボタン
「select」命令などによる選択肢では、文字による選択肢しか作ることができませんでした。
しかし、ボタンというものを利用することで、自分で用意した画像を選択肢等に使うことができます。
また、select命令ではラベルに飛ばすことしかできませんでしたが、ボタンでは分岐にif文を使うため、好きな処理をさせることができます。
(
「selnum」命令(マニュアル 実行制御系 E)を使うことで、selectのような選択肢でありながらボタンと同じようにif文を使って分岐をさせることはできます)
■スクリプトの流れ
スクリプトの流れとしては、だいたい次のようになります。
1.ボタンに使う画像を読みこむ
2.ボタンの画面上の配置を決める(ボタン定義)
3.ボタン待ち(代入用の数字変数の用意)
4.ボタンが押されると、ボタンに対応した数字が数字変数に代入される
5.if文を使って分岐
ボタンでは、どのボタンが押されたかを知るために数字変数を一つ用意しなければなりません。
■スクリプト
では、実際のスクリプトを見ていきましょう。
btndef "botan.jpg"
btn 1,10,10,50,50,0,0
btn 2,10,70,50,50,50,0
btn 3,10,130,50,50,100,0
*loop
btnwait %0
if %0 == 0 goto *loop
if %0 == -1 goto *loop
if %0 == 1 bg #FF0000,1
if %0 == 2 bg #00FF00,1
if %0 == 3 bg #0000FF,1
|
このスクリプトは、三つのボタンが用意されていて、ボタンを押すと背景の色が変わるというスクリプトです。
ボタンを作る場合、複数のボタン用命令を組み合わせなければなりません。
■ボタンに使う画像を読みこむ
ボタンでは、まずボタンに使う画像を読みこまなくてはなりません。
ここでは、下のような画像を用意しています。
botan.jpg 150×50
ボタンに使う画像は、一つの画像の中にボタンが全て含まれている画像を読みこみます。上の画像では、三つのボタンが一つの画像としてまとめられています。
読みこむためには
「btndef」命令を使って読みこみます。
「btndef」に続き、画像ファイルを指定するだけです。
■ボタンの画面上の配置を決める(ボタン定義)
ボタンに使う画像を読みこんだら、次はボタンのゲーム画面上での配置を行います。配置と同時に、読みこんだ画像のどの部分をボタンにするかというものも決めます。これらを、
ボタン定義と呼びます。
ボタン定義には
「btn」命令を使います。
btn命令では、それぞれのボタンに
ボタン番号をつけます。これはスプライト番号のようなものだと思ってください。ボタン番号は、必ず1以上の数字を指定します。
「btn」のすぐ次の数字がボタン番号で、その次の二つの数字がゲーム画面上のボタンの位置(x,y)、さらに次の二つの数字がボタンの横幅、縦幅です。
最後の二つの数字は何かと言うと、ボタン用に読みこんだ画像のどの部分をそのボタンに使うかの位置指定です(x,y)。
つまり、その位置から、指定した横幅と縦幅の分だけの画像が、ゲーム画面上にボタンとして表示されます。
上のスクリプトのボタン番号1番のボタン定義を見てください。ゲーム画面上10,10の位置に、読みこんだ画像の0,0の位置から横幅50・縦幅50の画像が表示されることになります。
このゲーム画面上の50×50の範囲だけが、クリックして反応する範囲となります。
■ボタン待ち(代入用の数字変数の用意)
btn命令によるボタン定義をしたら、次はクリックされるまで待つことを示す命令を記述します。
それが
「btnwait」「btnwait2」命令です。上のスクリプトでは「btnwait」を使っています。これら二つの違いは、後で説明します。
btnwaitとbtnwait2共に、数字変数を指定します。これは、クリックされた時にどのボタンがクリックされたかを知るために用意します。その数字変数に値が代入されるため、if文を使って分岐ができるのです。
それぞれのボタンをクリックすると、数字変数(上のスクリプトでは0番)にはそれぞれのボタン番号が代入されます。
それ以外では、どのボタンでも無いところをクリックした場合、数字変数には「0」が代入されます。さらに、右クリックをした場合は、「-1」が代入されます。
上のスクリプトでは、ボタンをクリックするまでは先に進めないようにしているので、数字変数の値が「0」や「-1」だったら、btnwaitの前に飛ばしてもう一度ボタン待ちをやりなおしています。
■ボタンの注意
上のスクリプトを実際に試した方ならわかると思いますが、ボタンではそのボタンの上にマウスカーソルがのらない限り、設定した画像が画面に表示されません。
これは、マウスカーソルが上にのった時にボタンの画像が(プレイヤーから見て)変化することを想定した仕様だと思います。
なので、ボタンにする画像のところにまずスプライトなどでボタンの画像を用意しておくのがよいと思います。
■メモリ上の画像とボタン定義の話
ここで、話をメモリ上の画像に移したいと思います。
まずbtndefでは、画像が読みこまれているため、メモリ上に画像があることになります。
この画像は、ボタンに使い終わった後は不必要なため、メモリ上から消去するのが普通です。
ですが、btnwait命令では、ボタンを押した場合(数字変数に1以上が代入された場合)には読みこまれていた画像がメモリ上から自動的に消去されるため、自分で消去する必要はありません。
同時に、ボタン定義も消去されることになります。ボタン定義は、ボタンの位置や画像中の位置などを決めるものなので、画像とは分けて考えてください。
btnwaitで、ボタンを押していない場合は画像もボタン定義も消去されないため、上のスクリプトのようにすぐにもう一回btnwaitでボタン待ちにしても支障がないわけです。
btnwait2では、ボタンを押したとしても、メモリから画像は消去されませんし、ボタン定義も消去されません。
何度もボタンの処理をする場合に使うことになると思います。
btnwaitと違って自動的に消去されないということは、使い終わったら自分で消去する必要があるということです。
ボタン用にbtndefで読みこんだ画像をメモリ上から消去する命令はありませんが、次のようにすると消去することができます。
読みこむ画像に何も指定しないわけです。これでメモリから画像が消去されます。
それと同時に、ボタン定義も消去されるようです。
さらにbtndefでは、次のようにすると画像を消去せずにボタン定義だけを消去することができます。
画像ファイル名を指定する代わりに「clear」を指定します。
これとbtnwait2を組み合わせて使うことで、一つの画像でボタン定義だけを変えてボタンの処理をすることができるようになります。
つまり、いろんなボタンを一つの画像の中にまとめておいて、それを読むだけでいちいち何度も画像を読まずに済むようにするためだと思います。