だてしむソフトウエア開発室>挑戦!HSP>一から始めるHSP(4)
| 10.スクリプトの流れを変えよう・・ | ▲top |
|---|
ここでは、HSPのスクリプトの実行の流れを変化させる方法について説明します。
これまで説明したとおり、HSPはスクリプトの一番上に書かれている命令から下(最下行)方向に向かって順番に実行されます。しかし、それだけではスクリプトを変更しない限り何度実行させても毎回同じ動作しかしません。
これでは、条件やユーザの選択によって動作を変化させるような、ゲームやメニュー等のスクリプトが作れません。そこで、ここではスクリプトの実行の流れを変化させる方法の基礎となる「ラベル」とgoto命令について書きます。
▼スクリプトに「ラベル」を付けよう
まず、次に示すスクリプトをみてください。
1:
2:
3:
4:
5:
6:
7:print "はじまり"
print "1"
goto *abc
print "2"
*abc
print "3"
stop;文字を表示
;文字を表示
;ラベル*abcにジャンプ
;文字を表示(でも実行されない)
;ラベル*abcはここ
;文字を表示
;ウインドウはそのままここでスクリプトの5行目以外では、命令の前に空白ができています。これは[TAB]キーを1回押して作ってください。このようにTabを使うのは、これから説明する「ラベル」と「普通の命令」とを区別して見やすくするためです。
5行目に今までのスクリプトとは少し毛並みの違う部分がありますね。
*abcと書いてあるこの部分を「ラベル」といって、スクリプト上の位置に名前をつける役割があります。また、3行目にgoto命令という新しい命令があります。この命令は指定したラベルへ「ジャンプ」(実行を移動)する命令です。ここではgoto *abcとなっているので「*abcというラベルへジャンプしなさい。」という意味になります。
もちろん、goto命令でジャンプを行なうときに、飛び先のラベルが無いとエラーになります。飛び先と同じ名前のラベルはあらかじめ作っておいてください。
さて上のスクリプトを実行してみると結果はどうなるでしょうか?実際に打ち込んで実行してみましょう。
実行結果:
どうでしょうか?4行目のprint命令で表示されるはずの"2"が表示されていませんね。では、このスクリプトが実行されるときの実行位置の変化に着目してみてみましょう。
HSPはスクリプトの一番上に書かれている命令から実行を開始します。「はじまり」「1」を表示した後,、goto命令によってラベル*abcにジャンプ(実行位置を移動)します。だから、print "2"の行が実行されないのです。
ジャンプ後は、ジャンプ後の位置から通常どおりに下方向に命令が実行されていくので、「3」が表示されstop命令で停止します。ラベルとgoto命令、理解できたでしょうか?ラベルでスクリプトに印をつけて、goto命令でそこへジャンプするという感じでとらえれば、理解しやすいかな?と思います。
さて、次は「ラベルとgoto命令を使うとこんな事もできるぞ」というスクリプトです。
▼いつまでたっても終わらないスクリプト
今度は、こんなスクリプトを実行してみましょう。
1:
2:
3:
4:
5:
6:print "うちでのこずちだ!"
*mugen
wait 100
print "ほいっ!"
goto *mugen
stop;文字を表示
;ラベル*mugenはここ
;1秒停止
;文字を表示
;ラベル*mugenへジャンプ
;(永久にこの行は実行されない)実行結果(5秒経過後):
実行すると、永遠に(実際はウインドウの下まで行くと文字が見えなくなってしまいますが・・)「ほいっ!」のメッセージが出つづけると思います。このスクリプトはこのままでは永久に終わらないので、ウインドウ右上の
を押して終了させてください。
なぜ、今のような動作をするか、カンのいい方はわかったと思いますが、先程と同じように実行位置に着目してスクリプトをみてみましょう。
「うちでのこずちだ!」と表示し、1秒停止して、「ほいっ!」と表示します。
その次にあるgoto命令でラベル*mugenへジャンプし、また1秒停止した後に文字を表示して、再び*mugenへジャンプ。
これを延々と繰り返します。
このような動作は、永遠に同じ所をグルグルとループしている(回っている)ので、「永久ループ」もしくは「無限ループ」といわれます。無限ループは、「永遠に同じ事をし続ける」ためにあまり意味が無いように感じるかもしれませんが、様々なソフトで使われています。活用法については、後々紹介したいと思います。
あと、HSPで無限ループを使う際に注意することが1つあります。それは「wait命令を必ず入れる」事です。これを忘れるとスクリプトがマウス入力を受け付けなくなったり、Windowsや他のソフトの動作が猛烈に遅くなったりします。この点だけは忘れないで下さい。(ちなみにwait命令に似た命令であるawait命令を使ってもOKです。await命令についてはHSPの「プログラミングマニュアル2・命令リファレンス」を読んでください。)
ここまででラベルとgoto命令を使ったスクリプトの流れを変えかたを説明しましたが、どうでしたか?プログラム言語が初めての方には少し難しかったかもしれませんが、結構、イメージ的に見たり直感的にとらえてみるとわかり易いと思います。
特にラベルはHSPを使う上では絶対に必要になります。大きなスクリプトを作成するときには、数十個のラベルを使用することになるので、わかりやすい名前をラベルに使ってあげてください。
最後に、HSPでラベルを使用するときのルールを紹介します。自分でラベルを使うときは次の点に注意してください。
ラベルのお約束 |
|
さあ、次はラベルの応用編。「ボタン」を使ってみましょう。(^^)
| 11.ボタンをつけてみよう・・ | ▼next |
▲top |
|---|
ここでは、ボタンの作成とその使い方について説明します。
一応断っておきますが・・ボタンといっても、Yシャツなどのアレではありません。(^^;)
Windowsのソフトには良く使用されている
←プッシュボタンです。
なお、HSPでボタンを作成する場合、前のセクションで説明したラベルとgoto命令の知識さえあれば、簡単に作って活用する事ができます。「えっ?ラベル?」とか「gotoってなんだっけ?」という方は前のセクションへ戻って確認してくださいね。
▼ボタンを表示する:button命令
使い方 : button "ボタンに書かれる文字列",*ボタンを押したときの飛び先ラベル
使用例 : button "Ok!",*push1 Ok!と書かれたボタンを作る。
押された場合はラベル*push1までジャンプする。
button命令はボタンを作成しウインドウに貼り付けます。ボタンには、ボタンに書かれる文字列で指定された文字列が書かれ、マウスでボタンをクリックすると、ボタンを押したときの飛び先ラベルで指定した場所にジャンプします。感触としては、ボタンを押すとその瞬間にgoto命令が実行されるという感じです。もちろんgoto命令の場合と同様に、飛び先のラベルが無いとエラーになります。飛び先と同じ名前のラベルをあらかじめ作っておいてください。
button命令でボタンを表示する場合、カレントポジションにボタンが表示されます。またbutton命令を実行するとカレントポジションはボタン1個分下へ移動します。表示されるボタンの大きさは、オブジェクトサイズを変更することによって変える事ができます。(詳しくはHSP「プログラミングマニュアル2・命令リファレンス」のobjsize命令を見てください) また、ボタンが押されるまでの間は、stop命令でスクリプトを停止させるのが普通です。stop命令で実行が停止していても、ボタンが押されジャンプした後はジャンプ先の行から実行が再開されます。
では、実際にボタンを使ってみましょう。次のサンプルを打ち込んでみてください。
サンプル:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:*start
button "さる",*push1
button "くりあ",*push2
stop
*push1
print "うっきー!"
stop
*push2
cls
goto *start;ラベル*startはここ
;"さる"と書かれた*push1へ飛ぶボタンを作る
;"くりあ"と書かれた*push2へ飛ぶボタンを作る
;一度停止(ボタン入力待ち)
;ラベル*push1はここ("さる"ボタンの飛び先)
;表示
;一度停止(ボタン入力待ち)
;ラベル*push2はここ("くりあ"ボタンの飛び先)
;画面・ボタンのクリア
;ラベル*startへジャンプする実行結果:
ボタンがちゃんと動作していますね。(^^)
では、スクリプトの流れをみてみましょう。
はじめに、button命令によって「さる」と「くりあ」と書かれたボタンをそれぞれ作成してstop命令により動作を停止。ボタンからの入力待ちの状態になります。
「さる」のボタンが押された場合、ラベル*push1にジャンプします。そこで画面に「うっきー」と表示し、stop命令で実行を停止。再び、ボタンからの入力待ちとなります。
「くりあ」のボタンが押された場合、ラベル*push2にジャンプします。そこでcls命令により画面の文字とボタンをクリアし、goto命令で一番上のラベル*startへジャンプし、実行開始時と同じようにボタンを新たに作成し、stop命令で止まります。
どうでしょうか。スクリプトの流れが少し複雑になってきましたが、流れを理解できたでしょうか?(^^;)
button命令を使って戸惑うと思うところは、「stop命令が実行された後もボタンを押すと再びスクリプトが動き出す」ところだと思います。私もはじめのうちは、少し戸惑いました(笑)。でも、button命令自体はとても単純かつ「使える」命令です。動作の仕方さえわかれば、あとは工夫したいでドンドン使えます。
ここまでで、ユーザからのボタンの選択によって動作を変化させる事ができるようになりました。ウインドウにボタンも付いてやっと見栄えもソフトウエアらしくなってきたのではないでしょうか?(^^)
さて、次のセクションからは少し雰囲気を変えて、「HSPで計算をさせるための方法」について説明します。