標準マクロ命令
この章で解説する命令もまたヘルプには「初心者には勧めない」と書かれていますが、
かる〜く流し読み程度にでもしていただいて頭の片隅にでも入れておいてください。
そして「この処理何かもっと楽にできないかな」と言う時にでも
「あ、あのやり方だともっと楽になるかも」と思い出してください…。
この章ではタイトル通り「前々章」でやった#defineのマクロ機能で作られた命令について解説します。
『標準』マクロというのはHSP2.6の標準で組み込まれ「\common\hspdef.as」に記述された命令です。
ココに書かれている命令を利用するにはHSPスクリプトエディタのHSPメニュー内にある
「HSP拡張マクロを使用する(M)」項目の左側に
チェックマークが入っていれば(デフォルトで入っている)利用できます。
なぜ常に利用できないかと言うと、
HSP2.6以前で既に同名モジュール・変数等が宣言されていて競合するのを避けるためと思います。
next命令なんて簡単にかぶりそうな名前ですよね。
マクロ命令を自分で追加することができますが、初めは既にあるものを利用するだけにしておきましょう。
それではマクロ命令を使用して行ってみましょう。
使い方は通常の命令となんら変わりありません。
マクロ命令は他言語でよく見る4命令が用意されています。
まずは、分岐命令switch命令から。
switch命令と同時に「case,default,swbreak,swend」命令も説明する必要があるので同時にします。
書式は「switch 比較するもの」と「case 比較値(当てはまる値)」で残り3つはパラメータがありません。
2.6以前に分岐させることができるものはif命令しかありませんでした…。
3〜5月を春、6〜8月を夏、9〜11月を秋、12〜2月を冬と表示する分岐スクリプトを今までは、
#define MONTH 4 ; ココの数値を変えてみる
font "MS 明朝",20
if MONTH >= 3 & (MONTH <= 5) {
color 200, 255, 0 : boxf : color
pos winx - 20 / 2, winy - 20 / 2 : mes "春"
}
if MONTH >= 6 & (MONTH <= 8) {
color 0,200,255 : boxf : color
pos winx - 20 / 2, winy - 20 / 2 : mes "夏"
}
if MONTH >= 9 & (MONTH <= 11) {
color 255,200,0 : boxf : color
pos winx - 20 / 2, winy - 20 / 2 : mes "秋"
}
if MONTH = 12 | (MONTH <= 2) {
color 200,200,200 : boxf : color
pos winx - 20 / 2, winy - 20 / 2 : mes "冬"
}
stop
こうでしたが、switch命令では、
#define MONTH 9 ; ココの数値を変えてみる
font msmincho, 20 ; 「MS 明朝」と書くことと同じ
switch MONTH ; 比較するものを指定
case 3 ; 比較する値
case 4
case 5
color 200, 255, 0 : boxf : color
pos winx - 20 / 2, winy - 20 / 2 : mes "春"
swbreak ; switch文を抜ける
case 6
case 7
case 8
color 0,200,255 : boxf : color
pos winx-20/2,winy-20/2 : mes "夏"
swbreak
case 9
case 10
case 11
color 255,200,0 : boxf : color
pos winx-20/2,winy-20/2 : mes "秋"
swbreak
default ; caseで書いてもよい
color 200,200,200 : boxf : color
pos winx-20/2,winy-20/2 : mes "冬"
swbreak ; なくても構わない
swend ; swith文の終端に必ず必要
stop
とこんな感じです。
例えが悪くて逆に長くなってしまいました(ぉ
他言語を知らない人にはわかりにくく「if文でいいのでは?」と思われるかもしれません。
switch命令の利点は…if命令のように比較対象を何度も書く必要がないことや
一致条件が定数だと楽になることとかでしょう
ただ「〜以上」などのように一致条件が範囲の場合はswitch命令では大変です。
時と場合によってswitch、if命令を使い分けるようにしましょう。
条件判断であるcaseに書ける定数は1つしか書けませんが上記のようにcaseを並べることができます。
defaultというのはif命令のelseのようなもので一致しなかった場合に実行されます。
caseに入るとswbreakかswend命令が来るまですべての処理が実行されます。
さて、それでは残り3つの方に入りましょうか。
残り3つはrepeat,loop命令と同じ繰り返し命令です。
1つ目は他言語のwhileと同じ前判定をするwhile、wend命令セットから。
前判定というのは繰り返し処理をする前に繰り返し条件を判定し「真」なら実行をするというものです。
簡単に言うと条件に一致しない場合は一度も実行されず飛ばされてしまうと言うことです。
で、書式ですが「while 繰り返し条件」「wend」はパラメータなしです。
repeat、loop命令にループ回数を変更するcontinue命令やループを抜けるbreak命令がありましたが
while、wendのループ命令にも変更や抜ける命令が用意されています。
変更は_continue命令、抜けるのは_break命令となっています。
例えば今までなら下記の様なif文を入れなければならないようなものも、
num = 10
repeat
mes num
num--
if num < 0 : break
loop
stop
while、wendならループ条件として繰り返しの部分に条件式が書けますので、
num = 10
while num >= 0 ; 真の間繰り返す
mes num
num--
wend ; whileに戻る(loopに当たる)
stop
ほとんど変わっていませんがシンプルになりました。
無限ループにさせようと思えば他言語のように下記のように省略すればOKです。
while ; 他言語風に書くと「while 1」と書くとか…
wait 1
wend
mes "ループ終了"
stop
先ほどのnum(カウンタ)が一定間隔で増減していくループの場合は、次のfor,next命令セット方が楽です。
2つ目のループ命令も先ほどと同じく前判定型です。
書式は「for 変数名,初期値,終値,増減数」「nextはパラメータなし」。
先ほどの処理をfor,next命令ですると下記のようになります。
for num,10,-1,-1 ; 終値は入らない
mes num
next ; forに戻る(loopと同じ)
stop
大分シンプルになりました。
ココでも_continue,_breakを使用できます。
ひとつ気をつける点は、他言語と違い「条件が「真」になったらループを抜ける」と言うことでしょうか。
前判定ですので0から増減値分変わってい着−1になったら終値と一致したのでループを抜けます。
for文内部で条件一致で指定ラベルにジャンプするexgoto命令が使用されていると書かれています。
マクロ高速化の為に使用されるものなので、通常は可読性等を考えると使用は推奨されてないようですが、
講座作成のため、用意されている以上は一応使用しなければ、ということで紹介しておきます。
書式は「exgoto 比較する変数,比較フラグ,比較する値,ラベル名」となっています。
ちょっとややこしいですが、比較フラグが0以上で比較する変数が比較する値以上の時か、
比較フラグがマイナス値で比較する変数が比較する値以下の時に指定したラベルに飛ぶようです。
check = 10
flag = -1
while 1
exgoto check, flag, -1, *test
mes check
check--
wait 1
wend
*test
stop
…見易さ以前に使用できそうな時があるのでしょうか…。
現時点ではちょっとわからないです。
さてそれでは3つ目のループ命令do,untilに入りましょう。
条件が「真」になるまで繰り返す命令ですが、他言語のdo,untilで「真になるまで繰り返す命令」として
知られている(カモ)と思います。
一応HSPでもそのようにはなっていると覚えておいてください。
それでこの命令なのですが、他のと違いループの最後に判定を行う「後判定型」です。
repeat,loopで上記の流れと同じことをさせるとすれば下記のようになります。
num = 10
repeat
mes num
num--
if num < 0 : break ; 最後に判定している
loop
stop
書式ですが「until 繰り返し条件」「doはパラメータなし」のセットです
until命令のパラメータを省略すると無限ループにすることができます。
num = 10
do
mes num
num--
until num < 0 ; 条件に一致すると抜ける
stop
他のマクロループ命令と同じくこの命令でも_continue,_breakを使用できます。
標準についているマクロ命令はコレくらいとなっています。
マクロのループ命令で非常に痛いことがあります。それは「cntが利用できないこと」ですね…。
ソレを除けば他にデメリットとなるものは特に見当たりません。どんどん利用すればよいかと思います。
ただどれもrepeat,loop,if命令でできることです。無理に覚えなければならない命令ではありません。
プログラミングをHSPで始めて、尚且つ使い始めて間もない方は
前述の3命令を駆使して書いた方が色々な流れや処理を勉強する上でよいと思います。